Межсетевой экран Nftables
Общие сведения о Nftables
Стандартным сетевым экран в ОС принят стандарт использования Nftables, который заменил собой использование iptables.
Nftables – это более простая и эффективная альтернатива iptables/ip6tables/arptables. Она предлагает унифицированную обработку IPv4 и IPv6, а также улучшенную производительность и поддержку современных сетевых протоколов. Для nftables была разработана новая система фильтрации пакетов, добавлена пользовательская утилита ntf, а также создан слой совместимости с iptables/ip6tables. Файервол nftables использует набор хуков, систему отслеживания соединений, систему очередей и подсистему логирования netfilter.
Как и iptables, nftables построен на правилах, определяющих действия. Эти правила содержаться в таблицах (table), к которым прикреплены цепочки (chain). Цепочка может содержать набор правил и исполняется в хуках (hook) netfilter. Таблица специфична для каждого из протоколов (ARP/IPv4/IPv6). Одно из основных отличий от iptables заключается в том, что больше нет предопределенных таблиц и цепочек.
Описание правил nftables:
- Таблицы (table):
table– это контейнер для цепочек (chain);
- Семейства таблиц (family):
ip– цепочки, связанные с IPv4;ip6– цепочки, связанные с IPv6;arp– цепочки, связанные с ARP;bridge– соединение связанных цепочек;inet– смешанные цепочки ipv4 / ipv6;netdev– цепочки, которые фильтруют в начале стека;
- Цепочки (chain):
chain– группировка правил;base chain– цепочка с зарегистрированным хуком netfilter, типом и приоритетом;other chain– цепочка без привязки к хуку и по умолчанию без отслеживания трафика;
Существует три вида цепочек:
filter– стандартный тип; фильтр пакетов;nat– протоколы IP/IPv6/INET; хуки PREROUTING, INPUT, OUTPUT, POSTROUTING; преобразование NAT;route– протоколы IP/IPv6/; хуки OUTPUT; маршрутизация;- Хук (hook) – это представление (правило) от том, на каком этапе происходит обработка:
prerouting– до принятия решения о маршрутизации; для пакетов, входящих в машину;input– для всех пакетов, входящих в локальную Систему;forward– для пересылаемых пакетов вне локальной Системы;output– для пакетов, исходящих из локальной Системы;postrouting– после принятия решения о маршрутизации; для пакетов, покидающих машину;priority– число, используемое для упорядочивания цепочек или для установки приоритетов между некоторыми операциями;policy– для пакетов, которые явно не приняты или отклонены в содержащихся правилах;
Правила (rules):
rule– определяют, какое действие необходимо выполнить для каких пакетов; правила прикреплены к цепочкам; каждое правило может иметь выражение для сопоставления пакетов и одно или несколько действий, выполняемых при сопоставлении;statements– представляют собой действие, которое должно быть выполнено при совпадении правила:accept– прием пакета и прекращение выполнения текущего правила;drop– отказ от приема пакета и прекращение выполнения текущего правила;reject– отклонение пакета с сообщением ICMP;queue– постановка пакета в очередь в пользовательское пространство и прекращение выполнения текущего правила;continue– продолжение выполнения текущего и переход к следующему правилу;return– возврат из текущей цепочки и переход к следующему правилу последней цепочки; в базовой цепочке это эквивалентно accept;jump– продолжение с первого правила; будет продолжено в следующем правиле после выдачи оператора возврата;goto– аналогично jump, но после новой цепочки оценка продолжится с последней цепочки вместо той, которая содержит оператор goto;handle– внутренний номер, идентифицирующий определенное правило;position– внутренний номер, используемый для вставки правил до определенного handle.
Установка и запуск Nftables
В ОС по умолчанию уже установлен фреймворк nftables.
Если по каким-то причинам пакет подсистемы удален, nftables можно установить следующей командой:
sudo dnf install nftables
Запуск сервиса nftables осуществляется командой:
sudo systemctl start ntfables.service
Чтобы включить запуск при старте Системы, нужно воспользоваться командой:
sudo systemctl enable nftables.service
Работа с Nftables
В качестве базового примера работы с nftables нужно выполнить следующие шаги для закрытия/открытия порта:
- Создать таблицу с помощью команды:
sudo /usr/sbin/nft add table inet my_table
Формат команды:
nft add table <family> <name>
где:
<family>– один из протоколов ip/ip6/inet/arp/bridge/netdev;<name>– имя новой таблицы.
- Проверить наличие новой таблицы:
sudo nft -a list ruleset
- Добавить цепочку:
sudo /usr/sbin/nft add chain inet my_table input { type filter hook input priority 0 \; policy accept \; }
Формат команды:
nft add chain <family> <name table> <name chain> {hook}
где:
<family>– один из протоколов ip/ip6/inet/arp/bridge/netdev;<name table>– имя таблицы;<name chain>– имя новой цепочки;
- Проверить наличие новой цепочки:
sudo /usr/sbin/nft -a list ruleset
- Добавить правило, с помощью которого ограничивается доступ к порту
80:
sudo /usr/sbin nft add rule inet my_table input tcp dport 80 drop
Формат правила:
nft add rule <family> <name table> <protocol> <dport> <port> <event>
где:
<family>– один из протоколов nftable ip/ip6/inet/arp/bridge/netdev;<name table>– имя таблицы;<name chain>– имя новой цепочки;<protocol>– протокол TCP/UDP/ICMP и т.д.;<dport>– входящий порт (destination port);<port>– номер входящего порта;<event>– событие drop/accept/jump и т.д.
- Соответственно для открытия порта
80нужно выполнить:
sudo /usr/sbin nft add rule inet my_table input tcp dport 80 accept
Но получить доступ к порту 80 после этого не удастся, так как в списке правил сначала все пакеты на порт 80 блокируются, а потом "пропускаются". В рассматриваемом случае пропускать уже нечего, так как изначально на этом порту всё блокируется.
В этом случае нужно удалить запрещающее правило с drop, для чего с помощью отметки "handle 2", которая присутствует в выводе на экран, выполнить команду:
sudo /usr/bin/nft delete rule inet my_table input handle 2
Далее следует проверить результат:
sudo /usr/sbin/nft -a list ruleset
Теперь доступ к порту 80 есть в полном объеме.
Если необходимо полностью очистить таблицу, то следует выполнить:
sudo /usr/sbin/nft delete table inet my_table
Если требуется полностью очистить файервол (все цепочки и таблицы), то следует выполнить:
sudo /usr/sbin/nft flush ruleset