10  /  16

Синтаксис nft

Синтаксис nft

На протяжении многих лет, соединения Linux систем защищает netfilter. К сожалению, по мере развития этот пакетный фильтр обрастал серьезными проблемами на функциональном уровне и в дизайне. Взвесив все за и против, разработчики решили отказаться от метода костылей и создали новый файер, имя которому nftables. Пакетный фильтр Nftables примечателен унификацией интерфейсов фильтрации пакетов для IPv4, IPv6, ARP и сетевых мостов.

nft является родным интерфейсом управления для nftables

Посмотреть список всех правил во всех таблицах:

sudo nft list ruleset

Посмотреть список всех правил во всех таблицах в реальном времени c интервалом 1s:

sudo watch -n 1 nft list ruleset

Полностью очистить набор активных правил можно командой:

nft flush ruleset

Правила могут создаваться с использованием следующего синтаксиса:

nft add rule [<family>] <table> <chain> <matches> <statements>

nft insert rule [<family>] <table> <chain> [position <position>] <matches> <statements>

nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements>

nft replace rule [<family>] <table> <chain> [handle <handle>] <matches> <statements>

nft delete rule [<family>] <table> <chain> [handle <handle>]

Перед тем как создавать правило, необходимо создать таблицу с ее «блокпостами» (правильно конечно называть цепочки, блокпост это уже мое восприятие на картинку в целом)

Таблица filter

Создать таблицу фильтр:

nft add table ip filter 

Создать блокпост INPUT с разрешающими правилами по умолчанию:

nft add chain ip filter INPUT { type filter hook input priority 0 \; policy accept \;   }
  • Параметр приоритет задаётся названием приоритета или его значением
  • Цепочки с более низкими значениями обрабатываются раньше.
  • Значение приоритета может быть отрицательным

Создать блокпост FORWARD с разрешающими правилами по умолчанию:

nft add chain ip filter FORWARD { type filter hook forward priority 0 \; policy accept \;   }

Создать блокпост OUTPUT с разрешающими правилами по умолчанию:

nft add chain ip filter OUTPUT { type filter hook output priority 0 \; policy accept \;   }

INPUT

  • Разрешить входящий трафик с сети 192.168.19.0/24
nft add rule ip filter INPUT ip saddr 192.168.19.0/24 counter accept
  • Запретить входящий трафик с сети 192.168.19.0/24
nft add rule ip filter INPUT ip saddr 192.168.19.0/24 counter drop
  • Запретить входящий трафик с хоста 192.168.19.224/32
nft add rule ip filter INPUT ip saddr 192.168.19.224 counter drop
  • Запретить входящий трафик с диапазона хостов 192.168.19.224-228
nft add rule ip filter INPUT ip saddr 192.168.19.224-192.168.19.228 counter drop
  • Запретить входящий трафик с хостов 192.168.5.1, 192.168.5.5, 192.168.5.8
nft add rule ip filter INPUT ip saddr { 192.168.5.1, 192.168.5.5, 192.168.5.8 } counter drop
  • Открыть порт 80 для всех входящих
nft add rule ip filter INPUT tcp dport 80 counter accept
  • Разрешить ssh только с одного хоста
nft add rule ip filter INPUT ip saddr 192.168.19.224 tcp dport 22 counter accept
  • Несколько портов в одном правиле, разрешить входящий трафик на порты протокола TCP 80, 81, 443, 53
nft add rule ip filter INPUT iifname "ens32" ip protocol tcp  tcp dport { 80,81,443,53} counter accept
  • Разрешить весь входящий трафик для интерфейса
nft add rule ip filter INPUT iifname "ens32" counter accept
  • Разрешить весь входящий трафик для интерфейса с определенной сети
nft add rule ip filter INPUT iifname "ens32" ip saddr 192.168.19.0/24 counter accept
  • Разрешить весь входящий трафик для интерфейса кроме определенной сети
nft add rule ip filter INPUT iifname "ens32" ip saddr != 192.168.19.0/24 counter accept
  • Разрешить для интерфейса входящий трафик с хоста по протоколу и порту
nft add rule ip filter INPUT iifname "ens32" ip saddr 192.168.19.224 tcp dport 80 counter accept
  • Несколько портов в одном правиле, разрешить входящий трафик на порты протокола TCP 80, 81, 443, 53 с входящего интерфейса ens32
nft add rule ip filter INPUT iifname "ens32" ip protocol tcp ip saddr 192.168.19.0/24 tcp dport { 80,81,443,53} counter accept
  • Разрешить ICMP пакеты с хоста 192.168.19.224 у которого мак адрес a0:8c:fd:a3:ed:a4 со стороны интерфейса ens32
nft add rule ip filter INPUT iifname "ens32" ip protocol icmp ip saddr 192.168.19.224 ether saddr a0:8c:fd:a3:ed:a4 counter accept
  • Ограничения по количеству пакетов
nft add rule ip filter INPUT ip protocol icmp limit rate 10/minute burst 5 packets counter accept
  • Ограничения по размеру (+29)
nft add rule ip filter INPUT icmp type echo-request meta length 93-65535 counter drop
  • логирование
nft add rule ip filter INPUT ip protocol icmp counter log prefix \"ICMP_TRACE\"
  • Разрешить вход тех пакетов которые сервер сам запросил, а так же уже установленные ссесии
nft add rule ip filter INPUT ct state related,established  counter accept


FORWARD

  • Разрешить передачу трафика от сетевого интерфейса ens32 к другому сетевому интерфейсу ens33
nft add rule ip filter FORWARD iifname "ens32" oifname "ens33" counter  accept
  • Разрешить передачу трафика от сетевого интерфейса ens33 к другому сетевому интерфейсу ens32
nft add rule ip filter FORWARD iifname "ens33" oifname "ens32" counter  accept
  • от сети 192.168.19.0/24 к сети 192.168.100.0/24
nft add rule ip filter FORWARD ip saddr 192.168.19.0/24 ip daddr 192.168.100.0/24 counter accept 
  • от сети 192.168.100.0/24 к сети 192.168.19.0/24
nft add rule ip filter FORWARD ip saddr 192.168.100.0/24 ip daddr 192.168.100.0/24 counter accept

Остальное все по тому же правилу что и в INPUT, но только не нарушайте логических правил

OUTPUT

Как правило исходящий трафик со стороны сервера не запрещают, но бывают некоторые исключения, например если на сервер установили «крякнутый» софт, который будет требовать лицензию, и появилось необходимость заблокировать попытку обращения на официальный ресурс

nft add rule ip filter OUTPUT ip daddr 192.168.0.50 counter drop

Остальное все по тому же правилу что и в INPUT, но только не нарушайте логических правил


Таблица NAT

Создать таблицу NAT

nft add table ip nat

Создать блокпост POSTROUTING с разрешающими правилами по умолчанию

nft add chain nat postrouting { type nat hook postrouting priority 0 \; policy accept \; }

Создать блокпост PREROUTING с разрешающими правилами по умолчанию

nft add chain nat prerouting  { type nat hook prerouting priority 0 \; policy accept \; }

POSTROUTING

  • Замена SRC адреса из сети 192.168.19.0/24 на адрес 1.1.1.1 при выходе с интерфейса ens33 (SNAT)
nft add rule ip nat POSTROUTING oifname "ens33" ip saddr 192.168.19.0/24 counter snat to 1.1.1.1
  • Замена SRC адреса из сети 192.168.19.0/24 на адрес интерфейса ens33 при выходе с интерфейса ens33 (MASQUARADE)
nft add rule ip nat POSTROUTING oifname "ens33" ip saddr 192.168.19.0/24 counter masquerade

PREROUTING

  • Пробросить порт 8000/tcp на другой сервер с адресом 10.7.0.169 (DNAT)
nft add rule ip nat PREROUTING tcp dport 8000 counter dnat to 10.7.0.169
  • Пробросить порт 8000/tcp на другой порт 80 сервера с адресом 10.7.0.169
nft add rule ip nat PREROUTING tcp dport 8000 counter dnat to 10.7.0.169:80
  • Пробросить порт 8080/tcp на порт 80 (REDIRECT)
nft add rule ip nat PREROUTING tcp dport 8080 counter redirect to :80
  • Пробросить порт 8080/tcp из входящего интерфейса eth0 на порт 80
nft add rule ip nat PREROUTING iifname "eth0" tcp dport 8080 counter redirect to :80

Сохраняем правила

чтобы текущие активные правила nftables попали в стартовую конфигурацию nftables:

echo '#!/usr/sbin/nft -f' > /etc/nftables.conf
echo 'flush ruleset' >> /etc/nftables.conf
nft list ruleset >> /etc/nftables.conf

Смотрите также

Трансляция синтаксиса правил с iptables в nft:

 iptables-translate <правила iptables>

Важный момент

  • Порядок действий происходит сверху вниз, важно понимать если вы сначала напишите разрешить а следующим правилом запретить то будет выполняться первое правила а на второе не будет доходить
  • Даже в случае пинга внешних хостов, нужно не только отправить пакеты к ним, но и получить ответ. При работе с iptables важно помнить, что многие протоколы передачи данных требуют двусторонней коммуникации. Поэтому нужно настраивать правила соответствующим образом — случаи, когда новички забывают разрешить работу с сервером по SSH случаются очень часто.