nftables швидкий старт
В дистрибутивах впроваджується nftables, а разом з ним, нібито для швидкого переходу, firewalld.
Провівши два роки (чи більше, хто ж рахує) з firewalld, зробив для себе висновок - користуватися firewalld я не буду.
Тому, для швидкого входу в nftables, виділив основні моменти, які потрібні особисто мені.
Після встановлення голої системи (в моєму випадку це Centos Stream 9) вимикаємо firewalld
systemctl disable --now firewalld
Аби він не ввімкнувся якоюсь службою, маскуємо
systemctl mask firewalld
Без цього на чистій, щойно встановленій системі, буде таке
~]# nft list tablestable inet firewalld
Налаштування nftables знаходяться у
/etc/nftables/main.nft

Мені дефолтні значення теж не подобаються, тому будуть свої.
В мене має бути все заборонено, окрім того, що дозволено.

Дивимось що є:
~]# nft -a list tables
Або
~]# nft list ruleset
 
~]# systemctl status nftables
○ nftables.service - Netfilter Tables
     Loaded: loaded (/usr/lib/systemd/system/nftables.service; disabled; vendor preset: disabled)
     Active: inactive (dead)
       Docs: man:nft(8)
~]# systemctl enable --now nftables
Created symlink /etc/systemd/system/multi-user.target.wants/nftables.service → /usr/lib/systemd/system/nftables.service.
Але з цим правила все одно будуть порожні.
Ще потрібно змінити /etc/sysconfig/nftables.conf
Розкоментувати рядок:
include "/etc/nftables/main.nft"

В файлі /etc/nftables/main.nft можна одразу змінити те, що нам буде потрібно (правила, щоб не втратити доступ до сервера).
Заразом, наприклад, я змінив назву таблиці nftables_svc на звичний filter.
Після релоаду правил отримаємо такий набір правил.
~]# systemctl reload nftables
~]# nft list ruleset
table inet filter {
        set allowed_protocols {
                type inet_proto
                elements = { icmp, ipv6-icmp }
        }

        set allowed_interfaces {
                type ifname
                elements = { "lo" }
        }

        set allowed_tcp_dports {
                type inet_service
                elements = { 22, 9090 }
        }

        chain allow {
                ct state established,related accept
                meta l4proto @allowed_protocols accept
                iifname @allowed_interfaces accept
                tcp dport @allowed_tcp_dports accept
        }

        chain INPUT {
                type filter hook input priority 20; policy accept;
                jump allow
                reject
        }
}
Начебто все зрозуміло.
Обробляється ланцюжок INPUT, бо в нього визначено хук input з пріоритетом 20. 
В ньому все приймається та кидається до ланцюга allow.
В allow дозволяється все, що вже має з'єднання. Дозволяються протоколи. Дозволяються інтерфейси. Дозволяються TCP порти.
Це все робиться через сети. Маємо сет @allowed_interfaces та @allowed_tcp_dports.
Сети визначаються окремо й мають свої типи та набори даних.

Маніпуляції з сетами проводяться через nft add set, наприклад:
~]# nft add set inet filter allowed_tcp_dports '{ type inet_service; elements = {22,80,443}; }'
Ця команда створить сет allowed_tcp_dports та додасть елементи-порти 22, 80, 443

Якщо потрібно додати тільки елемент до сету, наприклад додати порт 21:
nft add element inet filter allowed_tcp_dports '{21}’
Це додасть елемент до сету allowed_tcp_dports

Щоб видалити елемент:
nft delete element inet filter allowed_tcp_dports '{21}’

Після того, як визначили що дозволяється в ланцюжку INPUT, останнім рядком йде заборона всього іншого трафіка (reject).


nftables NAT

Аби увімкнути NAT, виніс правила у /etc/nftables/nat.nft й приєднав його в main.nft:
include "/etc/nftables/nat.nft"
~]# cat /etc/nftables/nat.nft 

table ip nat {

        chain POSTROUTING {
                type nat hook postrouting priority srcnat + 20
                policy accept

                #iifname @masq_interfaces oifname != @masq_interfaces masquerade
                #ip saddr @masq_ips masquerade
                ip saddr 172.17.0.0/16 ip daddr 192.168.10.0/24 oif eno1 snat to 192.168.10.4
                ip saddr 172.17.0.0/16 oif eno1 snat to 192.168.11.4
        }
}
Аби створити ці правила одразу в роботі:
~]# nft add table ip nat
~]# nft add chain ip nat postrouting '{type nat hook postrouting priority srcnat + 20; policy accept; }'
~]# nft add rule ip nat postrouting ip saddr 172.17.0.0/16 ip daddr 192.168.10.0/24 oif eno1 snat to 192.168.10.4
~]# nft add rule ip nat postrouting ip saddr 172.17.0.0/16 oif eno1 snat to 192.168.11.4

Разом з тим потрібно FORWARD дозволити. Цей ланцюжок знаходиться у filter.
chain forward {
                type filter hook forward priority 0; policy drop;

                ct state new,established,related counter accept
                ct state invalid drop

                ip saddr 172.17.0.0/16 counter accept
                ip daddr 172.17.0.0/16 counter accept

                reject with icmpx type host-unreachable
        }
Не забуваємо про forward в системі
~]# sysctl -w net.ipv4.ip_forward=1

~]# cat /etc/sysctl.d/70-nat.conf 
net.ipv4.ip_forward=1

Деякі корисності

Вивести правила з номером рядка
~]# nft -a list table ip nat
table ip nat { # handle 6
        chain postrouting { # handle 1
                type nat hook postrouting priority 120; policy accept;
                ip saddr 172.17.0.0/16 ip daddr 192.168.10.0/24 oif "eno1" snat to 192.168.10.4 # handle 4
        }
}
Аби видалити правило за номером (#handle)
~]# nft delete rule nat postrouting handle 4
Щоб додати правило у зазначеній послідовності
]# nft add rule ip nat postrouting position 4 ip saddr 172.17.0.0/16 ip daddr 192.168.10.0/24 oif "eno1" snat to 192.168.10.4
Ви маєте увійти під своїм обліковим записом

loading