Top.Mail.Ru
Загрузка

Управляем сетевым трафиком

Ни один 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.

svg

Что вы думаете?

Показать комментарии / Оставить комментарий

Комментировать

svg
Быстрая навигация
  • 01

    Управляем сетевым трафиком