Нека да разгледаме по долу снимка на екрана от моя лаптоп с Кали Линукс. Видно е, че съм получил и от двата протокола IPv4/IPv6 мрежови адреси, така наречения Dual Stack. В iptables трябва да конфигурирам и двата протокола в различна конфигурация с iptables и ip6tables но с nftables това не е нужно.
Отварям конфигурационния файл sudo vim /etc/nftables.conf на nftables, изтривам ако има нещо там и копирам следния код:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
iif lo accept
ct state invalid counter drop
ct state established,related counter accept
ip protocol icmp counter accept
ip6 nexthdr icmpv6 counter accept
counter drop
}
}
След което изпълнявам командата nft -f /etc/nftables.conf в терминала за да влязат правилата на защитната стена в сила. За да проверим дали всичко е наред можем да изпълним sudo nft list ruleset като общо взето трябва да получим резултат като картинката по долу.
Е, вече имаме разботеща защитна стена в Dual Stack с няколко реда конфигурация която всъщност гласи: – Не позволявай никакви пакети до машината ми освен протокола icmp което напълно ме устройва за моя лаптоп.
flush ruleset Изтрива всички правила в защитната стена.
table inet filter Създаваме таблицата filter. inet параметъра е много ключов – той показва, че в таблицата ще управляваме и двата протокола IPv4 и IPv6. Тук е мястото да се отбележи, че в iptables таблиците filter, nat, mangle и raw както и веригите INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING са перманентно създадени, готови за работа. Тук в nftables това не е така, от гледна точка на ресурси защо трябва да имаме нещо ако не го ползваме, това е и причината да си създаваме таблиците и веригите ние.
chain input Създава верига за входящи пакети в която ще филтрираме и анализираме пакетите които идват от мрежата към нас.
iif lo accept Разреши пакети към input interface 127.0.0.1.
ct state invalid counter drop Блокирай невалидни пакети.
ct state established,related counter accept Регистрирай входящите пакети и създай конекшън в conntrack таблицата.
ip protocol icmp counter accept Рареши icmp за IPv4.
ip6 nexthdr icmpv6 counter accept разреши icmp за IPv6.
counter drop Блокирай всичко без описаните правила по горе.
Сигурен съм, че някой се чуди какво е това counter 🙂 Ами това е брояча на пакети. След като имаме работеща конфигурация за да разберем дали тя работи в iptables изпълнявахме iptables -nvL в терминала за да видим достигнали ли са пакети до тази верига. В iptables всяка таблица, всяка верига и всяко правило има брояч задължително, тази функционалност е невероятен безмислен ресурс когато се търси перформънс в една защитната стена до която достигат няколкостотин хиляди пакета в секунда. Затова в nftables ние избираме въобще дали да конфигурираме брояч на всяка таблица, верига или правило по отделно.
Защитна стена на лаптоп едва би задоволила някой който има сървър със стандартни услуги уеб, фтп, терминал и др. Затова нека да разгледаме един по разширен пример:
#!/usr/sbin/nft -f
flush ruleset
define admin = {172.16.133.21, 172.16.133.22, 172.16.133.23}
define flood = {10.2.2.2, 10.3.3.3, 10.4.4.4, 10.5.5.5,
10.6.6.6, 10.7.7.7, 10.8.8.8, 10.9.9.9}
table inet filter {
chain input {
type filter hook input priority 0;
iif lo accept
ct state invalid drop
ct state established,related accept
ip saddr 192.168.0.0/16 tcp dport 22 accept
ip saddr $admin tcp dport 22 accept comment "admin"
#ip6 saddr 2001:470:20f1:2::/64 tcp dport 22 accept
udp dport 53 accept
tcp dport {53, 80, 443} ct state new accept
ip protocol icmp accept
#ip6 nexthdr icmpv6 accept
ip saddr {10.10.10.10, 10.11.11.11} reject with icmp type port-unreachable
ip saddr {10.12.12.12, 10.13.13.13} tcp dport {80, 443} drop
ip saddr $flood drop
counter drop
}
}
За да се запази конфигурацията в сила и да е активна след рестарт е хубаво да изпълним: sudo systemctl enable nftables.service