Ни один IT-специалист не может обойти стороной тему сетевой безопасности. Начиная с ядра Linux 2.4.x система netfilter пришла на смену устаревшему средству фильтрации пакетов/межсетевого экрана ipchains. Управление netfilter осуществляется консольной утилитой iptables, которая позволяет создавать и изменять правила, управляющие фильтрацией и перенаправлением пакетов. Правила протокола версии IPv6 редактируются другой утилитой ip6tables.
Исходный код iptables со временем стал громоздким, а любые изменения, которые вносятся разработчиками в саму программу, затрагивают все зависимые от него инструменты. Утилиты iptаbles и другие его ветви (ip6tаbles, ebtаbles и arptаbles) имеют под собой одну базу, но разрабатываются в отдельности. Что несомненно ведёт к перекосу в разработке данных инструментов. Так, поддержка инструмента iptаbles осуществляется лучше остальных, чего не скажешь про ebtаbles. Если «баги», обнаруженные в iptаbles исправляются по мере их выявления, то в ebtаbles они могут оставаться не тронутыми долгое время.
В марте 2009 года был представлен первый предварительный релиз nftables, включённый в подсистему ядра Linux, которая должна заменить iptables. Проект netfilter подарил начальные буквы в название nftables. По заявлению разработчиков, nftables обладает повышенной пропускной способностью, а также имеет большую масштабируемость, которая учитывает быстро меняющиеся требования. Ещё одним плюсом nftables является его модульная структура, что подразумевает улучшенную сопровождаемость проекта. Начиная с версии ядра Linux 3.13.x, которая была выпущена 19 января 2014 года, nftablеs является её неотъемлемой частью.
Debian использует nftables с 2019 года. Вслед за ним nftables появился в его производных дистрибутивах, таких, как Ubuntu и Linux Mint. Red Hat Enterprise Linux (RHEL), CentOS седьмой и более поздних версии тоже используют nftables. Но несмотря на наличие nftables, не все дистрибутивы устанавливают и используют его по умолчанию.
Первое знакомство
Как я упоминал ранее, для того, чтобы написать правила для брандмауэра, необходимо использовать инструменты командной строки iptables (для протокола интернета версии IPv4), ip6tables (для протокола интернета версии IPv6), arptables (для ARP-пакетов) и ebtables (для протоколов типа PPPoE и ему подобных). Утилита nftables может заменить названные выше четыре инструмента. Для его запуска достаточно ввести в консоли команду nft, с указанием необходимых опций.
Iptables использует разные фильтры и три основные цепочки обработки INPUT, FORWARD и OUTPUT, которые объединяются в таблицы с общим функциональным назначением. В nftables же, напротив, нет никаких предопределённых таблиц. Все нужные таблицы создаются самим пользователем, и сам же пользователь вправе дать произвольное им название.
Инструмент nftables использует пару небольших библиотек — libnml и libnftml. Что, в конечном итоге, повлияло на размер кода в ядре Linux, а при любых исправлениях или изменениях кода nft нет необходимости в пересборке всего ядра.
Чтобы проверить, загружен ли модуль в ядро системы, надо просмотреть вывод команды modinfo:
modinfo nf_tables
и команды lsmod:
lsmod | grep nf_tables
Конфигурация по умолчанию
При первом запуске nftables не имеет никаких записей. Ваша задача состоит в том, чтобы создать таблицы, добавить к ним цепочки, которые подключаются к ядру Linux, а затем заполнить их необходимыми правилами. Для всех перечисленных шагов используется команда nft, которая работает от имени суперпользователя (root).
Немного попрактикуемся и определим правило межсетевого экрана, который блокирует все пакеты. В первую очередь создадим таблицу:
sudo nft add table ip filter
Добавим цепочку:
sudo nft add chain ip filter input {type filter hook input priority 0\;}
Создадим правило, которое закрывает соединение, и не отправляет ничего в ответ отправителю (drop):
sudo nft add rule ip filter input drop
Выведем список всех установленных правил:
sudo nft -a list ruleset
Комментарии к записям, которые идут после «решётки» (# handle 0), в даьнейшем можно использовать, как ссылку на определённую запись. Например, следующее указание nft такой ссылки, удаляет правило drop, которое мы записали ранее:
sudo nft delete rule ip filter input handle 2
Основные операции
Когда дело доходит до написания правил, разработчики nft полагаются на Berkeley Packet Filter (BPF) — технологию ядра Linux, которая позволяет захватить необходимые сетевые пакеты, проходящие через любой интерфейс системы. А также используют классический tcpdump, позволяющую перехватывать и анализировать сетевой трафик.
Как уже указывали ранее, nft обеспечивает управление рядом протоколов сети Internet — arp (ARP), bridge (ранее управлялось в ebtables), inet (включает IPv4 и IPv6), ip (для IPv4), ip6 (для IPv6) и netdev (используется для фильтрации входящих пакетов до того, как они достигнут третьего уровня согласно спецификации ISO/OSI).
Инструмент nft действует как транслятор правил и хранит их в небольшой виртуальной машине (nftables core) для связи с ядром Linux.
Рассмотрим написание правил в iptables и nft на практике. Ниже показано, как включить порт 22 для доступа через SSH (Secure SHell — защищенная оболочка). Для 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:
sudo nft add rule inet filter input tcp dport 22 ct state new, established accept
Как видите, для nft правило сведено в одну команду с более простым синтаксисом.
Чтобы добавить порты 80 и 443, которые используют протоколы интернета HTTP и HTTPS, в iptables необходимо написать две строки на каждый порт. В то же время, в nft достаточно добавить порты в существующее правило:
sudo nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new, established accept
Файл конфигурации nftables
Подобно iptables, конфигурация nftables может быть сохранена в файл. Записать текущий набор правил в файл firewall.config можно следующей командой:
sudo nft list ruleset > firewall.config
и считать конфигурацию из файла:
sudo nft -f firewall.config
Чтобы убедиться, что в кэше не осталось других правил, которые могут вступить в конфликт с вновь написанными правилами для брандмауэра, необходимо добавить строку «flush ruleset» в начало конфигурационного файла firewall.config.
Чтобы облегчить переход от iptables к nft можно воспользоваться утилитами iptables-translate и ip6tables-translate, которые преобразуют правила брандмауэра iptables в правила nftables. Так команда:
iptables-translate -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
преобразует правило iptables в правило nft:
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
преобразует правило ip6tables:
nft add rule ip6 filter FORWARD iifname eth0 oifname eth3 meta l4proto udp udp dport { 111,222} counter accept
Стоит отметить, что утилиты входят в состав пакета iptables и нет необходимости устанавливать что-либо дополнительно.
Заключение
Nftables помогает объединить несколько сложных инструментов под одним щитом, облегчая защиту сети. Для nftables свойственно использование простого и понятного синтаксиса. Также интструмент предоставляет свободу в создании правил брандмауэра, что тоже является большим плюсом в использовании nftables.
Что вы думаете?
Показать комментарии / Оставить комментарий