Nftables debian 10 настройка

Обновлено: 04.07.2024

Nftables - это новый программный продукт, который стремиться изменить существующий подход к фильтрации пакетов. До данного пакета работа с пакетами в сети осуществлялась с помощью утилит (iptables, ip6tables, arptables, entables). Данный framework доступен с версии ядра Linux 3.13 и позволяет запускать команды со старым синтаксисом iptables. По умолчанию же используется новый синтаксис построения команд. В основном используются такие понятия, как наборы, также для правил используют карты и конкатенации (склейки).

В сегодняшней статье мы разберемся как пользоваться nftables. Этот программный продукт позволяет отфильтровывать как каждый пакет, так и поток данных, выполнять NAT трансляцию, регистрировать подозрительную активность в трафике. При создании наборов правил следует избегать дублирования настроек. Nftables позволяет фильтровать и регистрировать одновременно трафик IPv4 и IPv6, благодаря новому семейству правил inet.

Основы nftables

Перед тем как мы перейдем к разбору того, как выполняется настройка iptables, разберемся с основными понятиями.

Набор (set) - множество похожих по смыслу значений для ключей правил, объединенных общим именем или конструкцией, состоящей из скобок. Позволяет описывать словари и карты. Позволяет обходиться одним правилом в том случае, где в iptables пришлось бы использовать цепочку правил. Например:

Карта (maps) - карта используется для сопоставления обрабатываемой информации с правилом на основе пар значение - ключ. Создание карт основано на использовании инфраструктуры наборов (set). Существует два типа карт - точные карты (literal maps) и карты присяжных (verdict maps). Мы рассмотрим только точные карты.

Точные карты - это набор пар (sets) критерий_совпадения: действие. Например:

nft add rule ip nat prerouting dnat tcp dport map

Это правило с помощью карты осуществляет перенаправление (DNAT) с порта TCP назначения 80 на IP-адрес назначения 192.168.1.100, а с порта 8888 - на IP-адрес 192.168.1.101.

Интервалы (intervals) - описываются с помощью синтаксической конструкции значение-значение Интервал обозначает указание диапазона значений. Например: 192.168.1.0-192.168.1.105 обозначает диапазон IP-адресов 1-1023 обозначает диапазон портов интернет-протокола. Вот пример соответствующего правила:

nft add rule inet table1 chain_input ip daddr 192.168.0.1-192.168.0.105 drop

Данное правило указывает отбрасывать все пакеты для семейства правил inet в таблице table1 в цепочке chain_input с IPv4 адресом назначения от 192.168.0.1 до 192.168.0.105


Основные различия с iptables

  • Синтаксис Iptables построен таким образом, что ключам правил всегда предшествует двойное или одинарное тире. В отличии от этого, nftables использует другой синтаксис, перенятый у tcpdump.
  • В iptables вы получаете сразу готовое количество таблиц с фиксированным набором уже настроенных в них цепочек правил. Что приводило к потерям производительности из-за существования неиспользуемых цепочек. В nftables таблицы и цепочки полностью настраиваются.
  • В nftables выражения это базовый строительный блок правила. В связи с этим правило представляет собой последовательность с выражениями, которые выполняются последовательно слева направо.
  • В nftables можно указать несколько действий в одном правиле.
  • Нет по умолчанию счетчика цепочек и правил. Вы можете включить его по желанию.
  • Лучшая поддержка обновления правил в процессе работы.
  • Возможность одновременного администрирования стеков IPv4 и IPv6 благодаря новому семейству inet, позволяющему регистрировать цепочки правил, видящие одновременно трафик обоих стеков протоколов.
  • Генерация наборов и карт инфраструктуры. Это новая возможность, позволяет использовать дополнительные конфигурации, такие как словари, карты и интервалы, для достижения ориентированной на производительность классификации пакетов.
  • Поддержка конкатенаций (склеек). Начиная с ядра Linux 4.1, вы можете объединять несколько различных ключей и комбинировать их со словарями и картами. Идея состоит в построении цветка значений, хеширующихся для получения высокой производительности при выполнении правил.
  • Подключения поддержки новых протоколов без обновления ядра. Для обновления nftables практически всегда достаточно обновления самого пакета, без каких-либо лишних действий.

Структуры для хранения правил nftables

В целом всё похоже на iptables:

  • Таблицы - содержат ссылку на контейнеры цепочек правил.
  • Цепочка - содержит наборы правил, выполняемых в порядке очереди
  • Правило - семантическая конструкция, позволяющая выбрать действия, которые нужно осуществить с описываемым правилом набором данных

Семьи nftables (families)

Вся инфраструктура nftables предназначена для работы с различными семействами адресов (families) разных протоколов (IPv4, IPv6, ARP, MAC). Ранее для обработки разных семейств адресов использовались разные утилиты - iptables, ip6tables, arptables, ebtables. Теперь с помощью введения понятия семейства обработка происходит в рамках одного программного продукта. На текущий момент существуют следующие семейства:

  • ip - таблицы этого семейства будут видеть трафик (пакеты) протокола IPv4;
  • ip6 - таблицы этого семейства будут видеть трафик (пакеты) протокола IPv6;
  • inet - в таблицах этого семейства будет обрабатываться трафик (пакеты) протоколов IPv4 и IPv6. Правила для ipv4 не будут влиять на пакеты IPv6. Правила, подходящие под оба протокола, будут влиять на пакеты обоих протоколов;
  • arp - таблицы этого семейства видят трафик arp - протокола;
  • bridge - в таблицах будут видеться пакеты, коммутируемые на уровне L2 OSI. Это семейство аналог ebtables;
  • netdev - это семейство, аналогов которого нет в x_tables. Оно видит все пакеты, которые только были переданы драйвером в стек протоколов.

Установка nftables

В некоторых дистрибутивах nftables уже установлен (RedHat 8, CentOS 8) по умолчанию. В Debian 10.2 установка производится очень просто:

sudo apt-get install nftables


Примеры использования nftables

Теперь рассмотрим примеры nftables. Команда nft – это утилита администрирования фреймворком nftables при управлении потоками данных. Именно с помощью неё выполняется настройка nftables. Использует при работе интерфейс командной строки. Позволяет создавать новые правила nftables, удалять старые и просматривать уже созданные цепочки и таблицы правил.

1. Создание таблицы в nftables

При создании таблицы (table) должно быть определено семейство (family) адресов. Например, давайте создадим таблицу с именем, test_table, которая отрабатывает одновременно пакеты IPv4 и IPv6:

sudo nft add table inet test_table


Создание цепочки в nftables

Цепочки (chain) являются контейнерами для правил. Существуют два типа цепочек:

Базовые цепочки (base chain) - можно использовать в качестве точки входа для пакетов из стека протоколов.

Регулярные цепочки (regular chain) - можно использовать с действием jump цель. Применяют для лучшей организации множества правил. При создании цепочки следует учитывать, что таблица, в которую мы хотим добавить цепочку, должна уже существовать.

sudo nft add chain inet [ таблица ] [ цепочка ]


sudo nft add chain inet test_table test_chain

Примечание: чтобы командный интерпретатор не интерпретировал ; как конец команды необходимо экранировать точку с запятой следующим образом \;

Эта цепочка фильтрует входящие пакеты. Приоритет (priority) задает порядок, в котором nftables обрабатывает цепочки с одинаковым значением hook. Параметр policy устанавливает действие по умолчанию для правил в этой цепочке. В данном случае мы установили действие accept (принимать пакет).

3. Добавление правила

Добавить правило (rule) в настраиваемую конфигурацию можно с помощью следующей синтаксической конструкции:

sudo nft add rule [ family ] [ table ] [ chain ] [ expression ] [ action ]

sudo nft add rule inet table1 chain_input ip saddr 8.8.8.8 drop

Данное правило добавляется в таблицу с именем table1 в цепочку chain_input и отбрасывает пакеты с ip-адресом источника отправления 8.8.8.8.


4. Удаление правила

Для удаления правила nftables используется команда со следующим синтаксисом:

sudo nft delete rule [ family ] [ table ] [ chain ] handle [ number ]

sudo nft delete rule inet table1 chain_input handle 3


5. Удаление цепочки

Цепочка удаляется с помощью следующей команды:

sudo nft delete chain [ family ] [ table ] [ chain ]

sudo nft delete chain inet table1 chain_input


6. Удаление таблицы

Таблицу можно удалить с конструкции со следующим синтаксисом:

sudo nft delete table [ family ] [ table ]

sudo nft delete table inet table1

Выводы

Сегодня мы познакомились с современным инструментом для редактирования правил брандмауэра. А также разобрались как выполняется настройка Nftables в Debian 10. Nftables вводит много новых семантических конструкций для более грамотной организации правил — set, map, family. Также данный пакет содержит много усовершенствований по сравнению с набором утилит для брандмауэра x_tables. В рамках этой статьи мы познакомились с инструментом nft, используемым для управления всем множеством правил межсетевого экрана.

Поскольку по умолчанию nftables не содержит никаких таблиц и цепочек, мы научились создавать наши первые таблицы и цепочки для всего множества правил нашего межсетевого экрана. Теперь мы умеем устанавливать приоритет для обработки подмножеств правил в цепочке, задавать действие по умолчанию для правил в созданной цепочке. Кроме того, мы научились добавлять правила. Так как структура таблиц и цепочек в nftables настраивается произвольно, то мы научились удалять цепочки и таблицы.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Согласно документа в Debian Wiki фреймворк nftables представляет собой механизм, используемый ОС Debian 10 Buster по умолчанию для управления встроенного в ядро Linux брандмауэра Netfilter. Nftables может рассматриваться, как современная, более продвинутая и функциональная замена таким инструментам, как iptables, ip6tables, arptables и ebtables.

Установка и запуск nftables

Не смотря на то, что в Debian 10 на данный момент по прежнему доступна утилита iptables, на самом деле она уже работает с фреймворком nftables в режиме совместимости с синтаксисом iptables и ссылается на утилиту iptables-nft.

Debian 10 iptables-nft

Чтобы отказаться от использования режима совместимости и синтаксиса iptables, мы можем использовать родной для nftables инструмент nft. Для этого установим пакет nftables.

После установки посмотрим на то, какая конфигурация правил nftables используется по умолчанию

Debian 10 default nftables config

Как видим, у нас уже описана таблица с именем " filter " семейства inet, предоставляющим возможность использовать правила IPv4/IPv6. В этой таблице созданы три цепочки с хуками netfilter типа input, forward, output. Правила в этих цепочках отсутствуют.

Настраиваем автоматический запуск службы, отвечающей за активацию правил nftables, затем запускаем эту службу:

Start nftables in Debian 10

Теперь можно переходить к управлению правилами nftables.

Управление правилами nftables

Управление правилами nftables будем выполнять с помощью утилиты nft.

Посмотреть текущий набор активных правил можно командой:

Очистить правила в цепочке " input " таблицы " filter " можно так:

Полностью очистить набор активных правил можно командой:

Очистка действующих правил не влияет на загружаемый при старте службы nftables.service конфигурационный файл /etc/nftables.conf

Если нужно, чтобы текущие активные правила nftables попали в стартовую конфигурацию nftables, то достаточно выгрузить их командами типа:

То есть внутри конфигурационного файла nftables.conf в первой строке присутствует ссылка на исполняемый файл nft, во второй строке – команда полной очистки текущей конфигурации nftables, а затем идут настроенные нами правила.

Чтобы загрузить в активную конфигурацию nftables набор правил из файла можно выполнить команду типа:

По аналогии с ранее рассматриваемым iptables, nftables обрабатывает пакеты на основе правил (Rules), которые группируются в цепочки (Chains). Цепочки хранятся в таблицах (Tables).

Правила могут создаваться с использованием следующего синтаксиса:

Далее для наглядности рассмотрим несколько простых примеров управления правилами nftables с помощью nft.

Простые примеры правил nftables

Разрешаем все пакеты для уже установленных соединений с использованием механизма connection tracking:

Разрешаем доступ из подсети 192.168.1.0/24 и IP 192.168.0.10 по SSH:

Вместо IP в правилах возможно использование доменного имени:

Запрещаем доступ к 80-му порту:

Удаляем правило с определённым номером в цепочке " output " таблицы " filter ":

Как конвертировать правила iptables

Базовую информацию о конвертации правил можно найти в документе: Moving from iptables to nftables. Можно использовать дополнительные утилиты, такие как iptables-translate и ip6tables-translate, для того чтобы транслировать правила из привычного синтаксиса iptables в новый формат nftables.

Например, команда вида:

вернёт нам указанное в формате iptables правило, транслированное в формат nftables:

iptables-translate

Простейший вариант настройки правил nftables

Рассмотрим простейший пример настройки брандмауэра для среднестатистического Linux-сервера в локальной сети предприятия. В рассматриваемом примере настраивается доступ к серверу по протоколу IPv4, а доступ по протоколу IPv6 полностью блокируется. По IPv4 разрешаются входящие подключения по протоколу SSH из сети администраторов (10.1.5.0/24), а также Ping и подключения к веб-серверу из всей сети предприятия (10.1.0.0/13).

Набор команд для наполнения правилами nftables в этом случае может выглядеть примерно следующим образом:

Давайте посмотрим, что у нас в итоге получилось в активной конфигурации nftables.

В нашем случае вывод конфигурации будет выглядеть следующим образом:

Дополнительные источники информации:

Похожее

Всего комментариев: 8 Комментировать

Доброго времени суток, спасибо большое за информацию, а то по nftables информации не так много, обрывки

А примеры точно верные? Так как описано добавление правила на пинг выдает ошибку. Вот как оно реально срабатывает: nft add rule inet filter input icmp type echo-request accept, другими словами пропущен inet

Да действительно inet не хватает, причём на всех источниках примеры аналогичные стоит debian 10 , где-то нужно и ip убрать .
nft add rule inet ip filter input ip saddr tcp dport 22 accept

Получаем ответ:
tcp 0 0 0.0.0.0:56473 0.0.0.0:* LISTEN 3586/sshd
tcp6 0 0 . 56473 . * ISTEN 3586/sshd

Перезагружаем компьютер и соединяемся с ним удалённо, через Putty, используя новый порт.

А можно ли установить в Debian 10 Firewalld, я к нему привык и свободно ориентируюсь. А то, сначала IPTables, затем Ferewalld, затем, nftables. Хорошо, если настройки будут аналогичны IPTables, и опять придётся их изучать.

Можно, так как firewalld может использовать в качестве бакенда как iptables так и nftables

Всё-таки, думаю, до возвращения Debian на домашний сервер, дело не дойдёт. Debian 10 почему-то очень сильно подтормаживает, даже Fedora 31 Plasma, установленная на USB_HDD работает намного быстрее, чем Debian 10 на SATA. К тому же уже практически настроил CentOS 8, его работа на сервере с USB_HDD гораздо быстрее, чем у 7 версии. А Debian тормозит даже в простейших приложениях, например в пасьянсе Aisleriot, я уже отпустил клавишу мышки, а карта перемещается, спустя 0,5 - 2 секунды. Ранее, когда у меня на сервере стоял Debian 7, открытие сетевого ресурса затягивалось от 20 секунд до нескольких минут, абсолютный рекорд открытия папки на сервере составил более 5 минут!

Примечание: Debian Buster использует фреймворк nftables по умолчанию.

Начиная с Debian Buster, nf_tables бэкэнд по умолчанию для iptables, посредством уровня iptables-nft (т.е. используя синтаксис iptables с подсистемой ядра nf_tables). Это также влияет на ip6tables, arptables и ebtables.

Вы можете переключаться между iptables-nft и iptables-legacy с помощью update-alternatives (то же самое относится и к arptables и ebtables).

По умолчанию, начинается с Debian Buster:

Переключение на устаревшие версии:

Если вы хотите включить фаервол по умолчанию в Debian, выполните следующие команды:

После чего, nftables будет включаться при загрузке. По умолчанию, правила находятся в /etc/nftables.conf .

Чтобы спросить все правила в nftables, и остановить фильтрацию:

Чтобы предотвратить запуск nftables при загрузке:

Чтобы удалить пакет nftables и все его следы в системе:

Вам следует рассмотреть возможность использования оболочки вместо написания собственных сценариев брандмауэра. Рекомендуется запустить ?firewalld, который довольно хорошо интегрируется в систему.

Что такое nftables?

Is the new framework by the Netfilter Project, allowing you to perform packet filtering (firewalling), NAT, mangling and packet classification. Это новый фреймворк проекта Netfilter, который выполняет фильтрацию пакетов (firewall), NAT, искажение и классификацию пакетов.

Должен ли я настроить фаервол используя nftables?

Да. Создание новых межсетевых экранов поверх iptables не рекомендуется.

Должен ли я заменить правила iptables на nftables?

Да, nftables - это замена iptables. Есть несколько инструментов для облегчения этой задачи.

Почему новый фреймворк?

В предыдущем фреймворке (iptables) есть несколько проблем, которые сложно решить, в том числе масштабируемость, производительность, поддержка кода и т.д.

Какие основные отличия?

В iptables по умолчанию есть несколько таблиц (filter, nat) и цепочек (FORWARD, INPUT . ). В nftables нет таблиц/цепочек по умолчанию.

Кроме того, в iptables у вас есть только одна цель на правило (-j ACCEPT, -j LOG . ). В nftables вы можете выполнять несколько действий в одном правиле.

nftables включает в себя возможности встроенных наборов данных. В iptables это не возможно, и есть отделенный инструмент: ?ipset.

В структуре iptables есть инструменты для каждого семейства: iptables, ip6tables, arptables, ebtables. nftables позволяет вам управлять всеми семействами в одном инструменте CLI.

Этот новый фреймворк содержит новую подсистему ядра Linux, известную как nf_tables. Новый механизм движка основан на BPF-подобных системах, с набором базовых выражений, которые можно комбинировать для создания сложных правил фильтрации.

Стоит ли смешивать правила nftables и iptables/ebtables/arptablesShould?

Нет, если вы не знаете что делаете.

Я знал синтаксис iptables. В nftables новый синтаксис?

Да, и он намного лучше

Создать базовую таблицу IPv4:

Создать цепочку для исходящего трафика IPv4:

Правило, для подсчета входящих пакетов (IPv4):

Показать результат предыдущих команд:

Сбросить правила для цепочки filter/input:

Удалить цепочки filter/input:

Удалить таблицу filter:

Семейство не обязательных параметров. По умолчанию используется 'ip':

Директория с примерами конфигураций в Debian:

Подсчет входящего трафика на порт tcp/22:

Подсчет и прием трафика на 80/tcp и 443/tcp для новых и существующих соединений:

Файрвол

Начинающие админы часто считают, что файрвол в Linux называется iptables. Более опытные знают, что нынешняя подсистема ядра для фильтрации трафика и модификации пакетов называется NetFilter, а команда iptables всего лишь утилита для ее настройки. В этой статье я познакомлю тебя с новым инструментом, который все чаще встречается в современных дистрибутивах, — nftables.

Возможно, для тебя это будет новостью, но iptables вовсе не уникальна, есть и другие утилиты подобного рода. Собственно, настраивать ей можно только правила для пакетов IPv4 на сетевом уровне. Для IPv6 понадобится ip6tables , для канального уровня — ebtables и arptables .

Сравнение iptables Nftables

Настройка сетевых интерфейсов, маршрутов, пространств имен и прочего уже давно унифицирована в утилите ip из пакета iproute2, а зоопарк старых утилит (ifconfig, vconfig, route и прочие) поддерживается только для совместимости со старыми скриптами. Ждет ли такая же унификация межсетевой экран? До версий ядра 2.4 Linux прошел через множество реализаций межсетевых экранов в ядре и утилит для их настройки (ipfilter, ipfwadm, ipchains), но NetFilter и iptables используются уже почти двадцать лет и кажутся незыблемыми.

Как ни странно, первые попытки переосмыслить настройку МСЭ предпринимались еще в 2008 году. Проект назвали nftables, но он стал легендарным (в узких кругах) долгостроем. В 2014 году его наконец приняли в основную ветку ядра 3.13, но пользовательские утилиты какое-то время оставались почти непригодными к работе. К примеру, счетчики пакетов для правил хранились в ядре, но просмотреть их из пространства пользователя не было никакой возможности.

Сейчас дело наконец меняется и дистрибутивы даже начинают использовать nftables по умолчанию. Сторонние инструменты вроде fail2ban тоже уже добавляют ее поддержку.

Несколько причин расстаться с iptables и перейти на nftables:

  • унифицированный синтаксис;
  • быстрая загрузка больших конфигов;
  • встроенная поддержка списков адресов/портов;
  • средства автоматической конвертации правил из iptables;
  • вывод правил в JSON.

В этой статье мы перенесем настройки моего VPS с iptables на nftables. Нужно отметить, что использовать сразу оба инструмента на одной машине не выйдет, так что нужно планировать одномоментную миграцию.

Документацию можно найти в вики проекта.

Проблемы iptables

Хотя NetFilter вполне хорошо справлялся со своей задачей, его настройка через iptables нередко оказывалась куда сложнее, чем могла бы быть.

К примеру, встроенный синтаксис для групп адресов и сетей в нем так и не появился. Существует отдельный инструмент для этих целей — ipset, который позволяет создать группы и ссылаться на них в правилах, вроде iptables -I FORWARD -m set --match-set TrustedHosts src -j ACCEPT .

Однако само то, что группы настраиваются отдельно от правил и с помощью другой утилиты, создает много проблем. Нужно помнить два разных синтаксиса, да еще и убедиться, что настройки ipset при загрузке применяются раньше правил iptables, — это при том, что во многих дистрибутивах Linux встроенного сервиса для ipset так и нет.

Другая надоедливая проблема — нельзя указать несколько разных действий в одном правиле.

Хотя еще больше раздражает отсутствие возможности использовать одни правила для IPv4 и IPv6. В современном мире dual stack уже стал нормой на серверах, машин с одним IPv4 все меньше, а машин с одним IPv6 нет и не предвидится, в итоге админу приходится дублировать одни и те же правила в двух разных конфигах.

Кроме того, в некоторых местах синтаксис опций iptables достаточно хрупкий. Где-то можно ставить пробел после запятой, где-то нет. Где-то можно смело поменять две опции местами, где-то это вызовет ошибку. Если правила генерируются скриптом, это особенно усложняет тестирование.

Все это приводит к тому, что iptables часто используют как своеобразный низкоуровневый «язык ассемблера», который генерируется либо фронтендами вроде shorewall или firewalld, либо пользовательскими скриптами. А цель проекта nftables — в первую очередь сделать настройку правил простой и удобной для человека. Давай посмотрим, насколько это удалось.

Настройка Nftables

Автоматическая трансляция

Авторы nftables определенно учли горький опыт многих других больших миграций и написали инструменты для автоматической трансляции правил из iptables. Можно конвертировать как отдельные команды, так и файлы для iptables-restore .

К сожалению, возможности автоматической трансляции настроек ipset там нет, в первую очередь из-за совершенно разных подходов к настройке групп, ну и из-за малой популярности ipset.

Отдельные правила транслируются с помощью утилиты iptables-translate , а наборы правил из iptables-save — с помощью iptables-restore-translate . Это только для IPv4, для правил ip6tables нужно использовать ip6tables-restore-translate и далее по аналогии.

В Debian эти утилиты находятся в пакете iptables, в Fedora — в пакете iptables-nft.

Посмотрим на трансляцию отдельных правил. Команда iptables-translate — самый простой способ изучить новый синтаксис на примерах (хотя и не заменит чтения документации!).

Читайте также: