nftables

Команда в iptables:

iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP

аналог в nftables:

nft add rule ip filter INPUT iifname "eth0" tcp dport 80 counter drop

Установка

в debian стоит по умолчанию

apt install nftables -y

Синтаксис командной строки

Конечно, вводить многострочные конструкции в командной строке неудобно. Поэтому для управления файерволом используется обычный синтаксис примерно такого вида:

nft <команда> <объект> <путь к объекту> <параметры>
  • Команда — add, insert, delete, replace, rename, list, flush…
  • Объект — table, chain, rule, set, ruleset…

Путь к объекту зависит от типа. Например, у таблицы это <семейство> <название>.
У правила — гораздо длиннее: <семейство таблицы> <название таблицы> <название цепочки>. А иногда ещё добавляются handle или index. Параметры зависят от типа объекта. Для правила это условие отбора пакетов и действие, применяемое к отобранным пакетам.


Настройка

# Создание таблицы с названием chell ( она будет называться ip chell )
nft add table chell
 
# Создание цепочки "chell2" внутрь таблицы "table"
nft add chain ip chell chell2 '{type filter hook input priority 0; policy accept;}'
 
# Добавление правила
nft add rule ip chell chell2 tcp dport ssh accept
 
# Изменение chain'а
nft chain ip chell chell2 '{type filter hook input priority 0; policy drop;}'
 
# Разрешить фигню для ssh
nft add rule ip chell chell2 ct state related,established accept
 
# разрешаем пинговать 
nft add rule ip chell chell2 icmp type echo-request accept
 
# nat
nft add table nat
nft add chain nat postrouting '{type nat hook postrouting priority 100;}'
nft add rule nat postrouting oifname "ens6" masquerade

Проброс портов

nft add chain nat prerouting '{ type nat hook prerouting priority 100; }'
nft add rule nat prerouting ip daddr 10.1.1.1 tcp dport { 8888 } dnat 10.2.2.2:9999

Удаление

# ip chell - название таблицы
nft delete table ip chell

Просмотр текущей конфигурации

nft list ruleset

Сохранения

Сохранение:

# flush rulset - нужен для обнуления конфига nft при загрузки 
# если его не будет конфиг будет дописываться
echo "flush ruleset" > /etc/nftables.conf
nft -s list ruleset >> /etc/nftables.conf

Перезапуск:

service nftables restart

--or--

nft -f /etc/nftables.conf

Ссылка

Пример

table ip nat {                                                                             chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                oifname "ens6" masquerade
        }
 
        chain input {
                type filter hook input priority 100; policy drop;
                tcp dport 22 accept
                icmp type echo-request accept
                ct state established,related accept
                udp dport 323 accept
        }
 
        chain forward {
                type filter hook forward priority 100; policy drop;
                tcp dport { 20-21, 53, 80, 443, 2100-2200 } accept
                udp dport { 20-21, 53, 80, 443, 2100-2200 } accept
                ct state established,related accept
        }
}