Более простой фильтр пакетов nftables

Правила фильтрации для брандмауэров порой бывают очень сложными. Являясь преемником 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.

Рисунок 1: Вывод modinfo предоставляет информацию о модуле ядра.
Рисунок 2: Вы можете использовать lsmod, чтобы узнать, есть ли в системе модуль ядра.

Базовая конфигурация

Изначально 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.

Рисунок 3: Команда nft list ruleset перечисляет все включенные правила.

Основные операции

При написании правил разработчики 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.

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: