Opublikowano wersję pakietowego filtra nftables 1.0.5, unifikującą interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (mający na celu zastąpienie iptables, ip6table, arptables i ebtables). Jednocześnie opublikowano wersję towarzyszącej biblioteki libnftnl 1.2.3, dostarczającej niskopoziomowe API do interakcji z podsystemem nf_tables.
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 zmiany:
- W optymalizatorze reguł, wywoływanym przy użyciu opcji „-o/—optimize”, rozwiązano problemy z łączeniem reguł, map- i set-list. # 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 } } # nft -o -c -f ruleset.nft Łączenie: ruleset.nft:4:3-52: ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ruleset.nft:5:3-52: ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 w: 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 }
- Podczas łączenia elementów ethernetowych i vlan zapewniono określenie dynamicznego set-listy, wypełnianego na podstawie parametrów ścieżki pakietu. add table netdev x add chain netdev x y { type filter hook ingress device enp0s25 priority 0; } add set netdev x macset { typeof ether daddr . vlan id; flags dynamic,timeout; } add rule netdev x y update @macset { ether daddr . vlan id timeout 60s } add rule netdev x y ether saddr . vlan id { 0a:0b:0c:0d:0e:0f . 42, 0a:0b:0c:0d:0e:0f . 4095 } counter accept
- Ułatwiono wyświetlanie reguł z map-listami zawierającymi maski w nazwach interfejsów. table inet filter { chain INPUT { iifname vmap { «eth0» : jump input_lan, «wg*» : jump input_vpn } } chain input_lan {} chain input_vpn {} }
- Usunięto regresywne zmiany powodujące błędną analizę leksykalną poprawnych reguł.
- Rozwiązano problemy z wolnym przetwarzaniem i automatycznym łączeniem dużych list z elementami definiującymi zakresy wartości.
- Wyeliminowano awarię przy dodawaniu elementów do niepoprawnego set-listy.
Źródło: opennet.ru
