Как пользоваться nftables

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 8) по умолчанию. В 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 настраивается произвольно, то мы научились удалять цепочки и таблицы.

Один комментарий

  1. Аватар sid 4 февраля, 2020 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: