Opublikowano wydanie pakietowego filtra nftables 1.0.3, ujednolicającego interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (ma na celu zastąpienie iptables, ip6table, arptables i ebtables). Niezbędne zmiany do działania wydania nftables 1.0.3 zostały uwzględnione w jądrze Linux 5.18.
W pakiecie nftables zawarte są komponenty filtrów pakietowych, które działają w przestrzeni użytkownika, podczas gdy na poziomie jądra działania szczególną rolę pełni subsystem nf_tables, wchodzący w skład jądra Linux od wersji 3.13. Na poziomie jądra udostępniany jest tylko ogólny interfejs, niezależny od konkretnego protokołu, który zapewnia podstawowe funkcje wydobywania danych z pakietów, realizacji operacji na danych oraz zarządzania przepływem.
Bezpośrednio zasady filtracji i specyficzne dla protokołów komponenty są kompilowane do bajtowego kodu w przestrzeni użytkownika, po czym ten kod bajtowy jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w jądrze w specjalnej maszynie wirtualnej, przypominającej BPF (Berkeley Packet Filters). Tego typu podejście pozwala znacznie zmniejszyć rozmiar kodu filtracji działającego na poziomie jądra i przenieść wszystkie funkcje parsowania zasad i logiki pracy z protokołami do przestrzeni użytkownika.
Główne nowości:
- W set-listach dodano wsparcie dla dopasowywania nazw interfejsów sieciowych za pomocą maski, na przykład określonej przy użyciu znaku „*”: table inet testifsets { set simple_wild { type ifname flags interval elements = { «abcdef*», «othername», «ppp0» } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { «abcdef*», «eth0» } counter packets 0 bytes 0 } }
- Zaimplementowano automatyczne łączenie przecinających się elementów set-listy podczas działania. Wcześniej przy ustawieniu opcji „auto-merge” łączenie odbywało się na etapie deklaracji reguł, a teraz działa także przy inkrementalnym dodawaniu nowych elementów w trakcie działania. Na przykład, na etapie deklaracji lista set y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8, 3.3.3.4, 3.3.3.5 } } zostanie przekształcona w elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 }, a następnie, jeśli dodane zostaną nowe elementy # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } przyjmie wygląd elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }
Podczas usuwania z listy poszczególnych elementów, które znalazły się w istniejących elementach z zakresami, zakres jest skracany lub dzielony.
- Do optymalizatora reguł, wywoływanego przy wskazaniu opcji „-o/—optimize”, dodano wsparcie dla łączenia kilku reguł translacji adresów (NAT) w map-listę. Na przykład dla zestawu # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }
wykonanie „nft -o -c -f ruleset.nft” doprowadzi do przekształcenia rozdzielnych reguł „ip saddr” w map-listę: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }
Podobnie listy map mogą być przekształcane oraz wyrażenia raw: # cat ruleset.nft tabela ip x { […] łańcuch nat_dns_acme { udp długość 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp długość 62-78 @th,160,128 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp długość 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp długość 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp długość 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }
Po optymalizacji otrzymamy listę map: udp długość . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }
- Dozwolone jest użycie wyrażeń raw w operacjach konkatenacji. Na przykład: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } lub tabela x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- Dodano wsparcie dla wskazywania całkowitych pól nagłówków w operacjach konkatenacji: tabela inet t { mapa m1 { typeof udp długość . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } łańcuch c { typ filtru hook input priorytet 0; polityka drop; udp długość . @ih,32,32 vmap @m1 } }
- Dodano wsparcie dla resetowania opcji TCP (działa tylko na rdzeniu Linux 5.18+): tcp flagi syn reset opcja tcp sack-perm
- Przyspieszono wykonanie poleceń wyświetlania łańcuchów („nft list chain x y”).
Źródło: opennet.ru
