На протяжении многих лет, соединения 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>]
Перед тем как создавать правило, необходимо создать таблицу с ее «блокпостами» (правильно конечно называть цепочки, блокпост это уже мое восприятие на картинку в целом)
Создать таблицу фильтр:
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 \; }
nft add rule ip filter INPUT ip saddr 192.168.19.0/24 counter accept
nft add rule ip filter INPUT ip saddr 192.168.19.0/24 counter drop
nft add rule ip filter INPUT ip saddr 192.168.19.224 counter drop
nft add rule ip filter INPUT ip saddr 192.168.19.224-192.168.19.228 counter drop
nft add rule ip filter INPUT ip saddr { 192.168.5.1, 192.168.5.5, 192.168.5.8 } counter drop
nft add rule ip filter INPUT tcp dport 80 counter accept
nft add rule ip filter INPUT ip saddr 192.168.19.224 tcp dport 22 counter accept
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
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
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
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
nft add rule ip filter FORWARD iifname "ens32" oifname "ens33" counter accept
nft add rule ip filter FORWARD iifname "ens33" oifname "ens32" counter accept
nft add rule ip filter FORWARD ip saddr 192.168.19.0/24 ip daddr 192.168.100.0/24 counter accept
nft add rule ip filter FORWARD ip saddr 192.168.100.0/24 ip daddr 192.168.100.0/24 counter accept
Остальное все по тому же правилу что и в INPUT, но только не нарушайте логических правил
Как правило исходящий трафик со стороны сервера не запрещают, но бывают некоторые исключения, например если на сервер установили «крякнутый» софт, который будет требовать лицензию, и появилось необходимость заблокировать попытку обращения на официальный ресурс
nft add rule ip filter OUTPUT ip daddr 192.168.0.50 counter drop
Остальное все по тому же правилу что и в INPUT, но только не нарушайте логических правил
Создать таблицу 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 \; }
nft add rule ip nat POSTROUTING oifname "ens33" ip saddr 192.168.19.0/24 counter snat to 1.1.1.1
nft add rule ip nat POSTROUTING oifname "ens33" ip saddr 192.168.19.0/24 counter masquerade
nft add rule ip nat PREROUTING tcp dport 8000 counter dnat to 10.7.0.169
nft add rule ip nat PREROUTING tcp dport 8000 counter dnat to 10.7.0.169:80
nft add rule ip nat PREROUTING tcp dport 8080 counter redirect to :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>