Межсетевой экран 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 нужно выполнить следующие шаги для закрытия/открытия порта:

  1. Создать таблицу с помощью команды:
sudo /usr/sbin/nft add table inet my_table

Формат команды:

nft add table <family> <name>

где:

  • <family> – один из протоколов ip/ip6/inet/arp/bridge/netdev;
  • <name> – имя новой таблицы.
  1. Проверить наличие новой таблицы:
sudo nft -a list ruleset
  1. Добавить цепочку:
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> – имя новой цепочки;
  1. Проверить наличие новой цепочки:
sudo /usr/sbin/nft -a list ruleset
  1. Добавить правило, с помощью которого ограничивается доступ к порту 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 и т.д.
  1. Соответственно для открытия порта 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