Межсетевой экран 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
    
  2. добавить цепочку:
    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;
    • – имя таблицы;
    • – имя новой цепочки;
  3. проверить наличие новой цепочки:
    sudo /usr/sbin/nft -a list ruleset
    
  4. добавить правило, с помощью которого ограничивается доступ к порту 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 и т. д.
  5. соответственно для открытия порта 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
    
  6. Если требуется полностью очистить файервол (все цепочки и таблицы), то следует выполнить:
    sudo /usr/sbin/nft flush ruleset