Правила фильтрации для брандмауэров порой бывают очень сложными. Являясь преемником iptables — nftables упрощает процесс создания и поддержки правил брандмауэра.
Независимо от того, готовитесь ли вы стать ИТ-специалистом, управляете сетями или готовитесь к Linux Professional Institute second certification (LPIC-2), вы не сможете обойти тему брандмауэров, особенно правила фильтрации пакетов в сети. После ipchains и Ipfw, iptables проекта netfilter чаще всего используется для настройки правил межсетевого экрана в Linux, в то время как FreeBSD/NetBSD и два наследника Solaris — Illumos и OpenIndiana — используют IPFilter.
Однако iptables уже немного устарел. В частности, программный код становится все более сложным. Небольшие изменения в ядре проекта, как правило, влияют на все связанные с ним инструменты. Iptables, ip6tables, ebtables и arptables — все они происходят из одной и той же кодовой базы, но не в виде модулей. Вместо этого они полагаются на дублирование кода, что привело к тому, что эти четыре инструмента со временем отдалились друг от друга. Iptables поддерживается лучше всего, в то время как ebtables был обделен вниманием. Ошибки, исправленные в iptables, спустя годы остаются неисправленными в ebtables.
Такая ситуация побудила проект netfilter начать разработку преемника iptables — nftables, еще в 2009 году. Первые две буквы в nftables происходят от названия проекта (netfilter). Заявленные цели разработки включают более высокую пропускную способность данных, большую масштабируемость с учетом меняющихся требований и, в частности, модульную структуру, ведущую к улучшенной сопровождаемости. Начиная с Linux 3.13 (январь 2014), nftables является частью ядра Linux, используя проверенные внутренние компоненты проекта netfilter.
С момента выпуска Debian 10 «Buster» в начале июля 2019 года Debian также использует nftables, что в свою очередь затронуло производные дистрибутивы, такие как Ubuntu и Linux Mint, а также Red Hat Enterprise Linux (RHEL) и CentOS v7 и более поздние версии. Все основные дистрибутивы уже давно включают nftables. Хотя они не обязательно включают nftables по умолчанию, они, по крайней мере, работают.
Удаления и преобразования
Для создания правил межсетевого экрана вам понадобятся инструменты командной строки iptables
(IPv4), ip6tables
(IPv6), arptables
(ARP-пакеты) и ebtables
(Ethernet-кадры). Nftables заменяет все четыре инструмента одной командной строки под названием nft, который можно использовать для установки всех правил приема, пересылки, изменения или отбрасывания пакетов из сети в системе.
В то время как iptables использует различные фильтры и три цепочки обработки INPUT
, FORWARD
и OUTPUT
для пересылки пакетов, вы должны определить их самостоятельно, чтобы программа nftables распознала их.
Инструмент nft
использует две библиотеки: libnml
, минималистскую библиотеку Netlink, и libnftml
, библиотеку пользовательского пространства Netlink. Это приводит к уменьшению размера кода в ядре Linux, а незначительные изменения в nft
не вызывают необходимости пересборки ядра.
Чтобы убедиться, что правильный модуль ядра был загружен в ядро системы, проверьте вывод команд modinfo
(Рисунок 1) и lsmod
(Рисунок 2). Как только это подтвердится (как показано на рисунках 1 и 2), можно приступать к непосредственному использованию nft
.
Базовая конфигурация
Изначально nftables запускается с абсолютно пустым набором правил; в нем нет предопределенных таблиц, цепочек или правил. Как пользователь (или администратор), вы сначала создаете таблицы, добавляете к ним цепочки, которые подключаются к ядру Linux как хуки netfilter, а затем заполняете цепочки соответствующими правилами. Все вышеперечисленные шаги выполняются с помощью команды nft, которую вы выполняете от имени root.
Листинг 1 демонстрирует, как определить межсетевой экран, который не пропускает (в настоящее время) ни одного пакета. В строке 1 создается таблица для IP-пакетов типа filter
. Строка 2 добавляет цепочку к таблице filter
. Строка 3 добавляет правило к цепочке, которое отбрасывает все пакеты (drop
).
Листинг 1: Определение брандмауэра
01 # nft add table ip filter 02 # nft add chain ip filter input {type filter hook input priority 0\;} 03 # nft add rule ip filter input drop 04 # nft list ruleset -a 05 # nft delete rule ip filter input handle 2 |
В строке 4 представлен обзор со всеми правилами брандмауэра (Рисунок 3). Рядом с записями вы увидите комментарии, оформленные в виде # handle ЧИСЛО;
используйте эти комментарии для ссылок на записи. Этот особенно интересно, если вы хотите удалить или изменить существующие определения или вставить новые определения перед или после записей. Например, в строке 5 удаляется правило drop
.
Основные операции
При написании правил разработчики nft опираются на Berkeley Packet Filter (BPF) и используют классический tcpdump
в качестве руководства, поэтому вам не придется изучать все с нуля.
Кроме того, nft также предоставляет ряд семейств адресов. Предопределены следующие семейства: arp
(ARP), bridge
(ранее предоставлялось ebtables), inet
(охватывает IPv4 и IPv6), ip
(для IPv4), ip6
(для IPv6) и netdev
(используется для фильтрации входящих пакетов до того, как они достигнут третьего уровня согласно спецификации ISO/OSI).
Инструмент nft
действует как транслятор правил и хранит их в небольшой виртуальной машине (nftables core) для связи с ядром Linux.
Там, где это уместно, я буду сравнивать написание и вызовы в iptables и nft на основе практических примеров. В листинге 2 показано, как включить порт 22 для входящих пакетов, как для доступа через SSH, как для iptables, так и для nft
. Вы заметите, что nft
сводит это к одной команде с более простым синтаксисом.
Листинг 2: Разрешить 22 порт для входящих пакетов
### Разрешаем входящие пакеты на 22 порт. ### С Iptables: # iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT ### С Nft: $ nft add rule inet filter input tcp dport 22 ct state new,established accept |
Если вы хотите добавить порты 80 и 443 (т.е. HTTP и HTTPS), вам потребуется еще две строки iptables для каждого порта. С другой стороны, в nft
достаточно расширить существующую строку, чтобы объединить все три протокола одним махом. Все три порта заключены в фигурные скобки, начиная с порта 22, за которым следуют порты 80 и 443, разделенные запятыми (Листинг 3).
Листинг 3: Добавление двух дополнительных портов
# nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new,established accept |
Обратите внимание, что пробелы внутри скобок в листинге 3 должны быть именно такими, как показано — иначе Bash будет захлебываться и протестовать. Пользователи Zsh сталкиваются с той же проблемой, которую можно решить, используя соответствующие кавычки.
Сохранение и восстановление
Подобно iptables, конфигурация nftables может быть сохранена в файл. Строка 1 в Листинге 4 записывает текущий набор правил в файл firewall.config
, а строка 2 считывает конфигурацию обратно.
Листинг 4: Сохранение конфигурации nftables
01 # nft list ruleset > firewall.config 02 # nft -f firewall.config |
Чтобы убедиться, что в кэше не осталось других (возможно, мешающих) правил перед инициализацией брандмауэра, необходимо добавить строку flush ruleset
в начало конфигурационного файла firewall.config
.
Будучи существами привычки, люди с трудом переносят перемены. Чтобы помочь при переходе от iptables к nft
, команды iptables-translate
и ip6tables-translate
преобразуют написание правил брандмауэра iptables в правила nftables (Листинг 5). Это работает как для отдельных инструкций, так и для полных наборов правил.
Листинг 5: Правила конвертирования$ iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT nft add rule ip filter INPUT tcp dport 22 ct state new counter accept $ ip6tables-translate -A FORWARD -i eth0 -o eth3 -p udp -m multiport --dports 111,222 -j ACCEPT nft add rule ip6 filter FORWARD iifname eth0 oifname eth3 meta l4proto udp udp dport { 111,222} counter accept |
Выводы
Nftables помогает сгруппировать несколько сложных инструментов под общим зонтиком, облегчая защиту сети. Чтобы тщательно протестировать новый набор правил брандмауэра, можно, например, использовать несколько Raspberry Pi в небольшой выделенной сети. В качестве альтернативы можно создать виртуальную тестовую сеть с помощью VirtualBox или интеллектуального приложения Mininet.