Межсетевой экран 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; маршрутизация;
- nat – протоколы IP/IPv6/INET; хуки
- Хук (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}
где:– один из протоколов ip/ip6/inet/arp/bridge/netdev; – имя таблицы; – имя новой цепочки;
- проверить наличие новой цепочки:
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