Nftables — это новый программный продукт, который стремиться изменить существующий подход к фильтрации пакетов. До данного пакета работа с пакетами в сети осуществлялась с помощью утилит (iptables, ip6tables, arptables, entables). Данный framework доступен с версии ядра Linux 3.13 и позволяет запускать команды со старым синтаксисом iptables. По умолчанию же используется новый синтаксис построения команд. В основном используются такие понятия, как наборы, также для правил используют карты и конкатенации (склейки).
В сегодняшней статье мы разберемся как пользоваться nftables. Этот программный продукт позволяет отфильтровывать как каждый пакет, так и поток данных, выполнять NAT трансляцию, регистрировать подозрительную активность в трафике. При создании наборов правил следует избегать дублирования настроек. Nftables позволяет фильтровать и регистрировать одновременно трафик IPv4 и IPv6, благодаря новому семейству правил inet.
Основы nftables
Перед тем как мы перейдем к разбору того, как выполняется настройка iptables, разберемся с основными понятиями.
Набор (set) — множество похожих по смыслу значений для ключей правил, объединенных общим именем или конструкцией, состоящей из скобок. Позволяет описывать словари и карты. Позволяет обходиться одним правилом в том случае, где в iptables пришлось бы использовать цепочку правил. Например:
- Набор портов: {22, 23}
- Набор протоколов: {telnet, http, https}
Карта (maps) — карта используется для сопоставления обрабатываемой информации с правилом на основе пар значение — ключ. Создание карт основано на использовании инфраструктуры наборов (set). Существует два типа карт — точные карты (literal maps) и карты присяжных (verdict maps). Мы рассмотрим только точные карты.
Точные карты — это набор пар (sets) критерий_совпадения: действие. Например:
nft add rule ip nat prerouting dnat tcp dport map { 80 : 192.168.1.100, 8888 : 192.168.1.101 }
Это правило с помощью карты осуществляет перенаправление (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 по умолчанию. В 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 [таблица] [цепочка] {set}
Например:
sudo nft add chain inet test_table test_chain {type filter hook input priority 0 ; policy accept ; }
Примечание: чтобы командный интерпретатор не интерпретировал ; как конец команды необходимо экранировать точку с запятой следующим образом ;
Эта цепочка фильтрует входящие пакеты. Приоритет (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 настраивается произвольно, то мы научились удалять цепочки и таблицы.