В дистрибутивах впроваджується 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
Ви маєте увійти під своїм обліковим записом