Opublikowano wydanie filtrów pakietowych nftables 1.1.6, ujednolicającego interfejsy filtracji pakietów dla IPv4, IPv6, ARP oraz mostów sieciowych (ma na celu zastąpienie iptables, ip6tables, arptables i ebtables). Równocześnie opublikowano wydanie towarzyszącej biblioteki libnftnl 1.3.1, która dostarcza niskopoziomowe API do interakcji z systemem 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:
- Zapewnione jest pełne wsparcie dla lekkich tuneli, takich jak vxlan, geneve i erspan: table netdev global { tunnel t1 { id 10 ip saddr 192.168.2.10 ip daddr 192.168.2.11 sport 1025 dport 20020 ttl 1 erspan { version 1 index 2 } } tunnel t2 { id 10 ip saddr 192.168.3.10 ip daddr 192.168.3.11 sport 1025 dport 21021 ttl 1 erspan { version 1 index 2 } } chain in { type filter hook ingress device veth0 priority 0; tunnel name ip saddr map { 10.141.10.12 : «t1», 10.141.10.13 : «t2» } fwd to erspan1 } } Przed załadowaniem zasad należy utworzyć interfejs sieciowy erspan1: ip link add dev erspan1 type erspan external
- Dodano wsparcie dla masek w nazwach interfejsów sieciowych w handlerach netdev, na przykład, aby dodać podstawowy łańcuch do filtru ruchu przychodzącego dla wszystkich urządzeń vlan, można wskazać: table netdev t { chain c { type filter hook ingress devices = { «vlan*», «veth0» } priority filter; policy accept; } }
- Na systemach z jądrem Linux 6.18+ wdrożono wsparcie dla przesyłania ramek L2 w interfejsie mostków sieciowych do lokalnego przetwarzania, na przykład, aby kierować wszystkie ramki Ethernet dla adresu MAC de:ad:00:00:be:ef w stosie IP, można podać: table bridge global { chain pre { type filter hook prerouting priority 0; policy accept; ether daddr de:ad:00:00:be:ef meta pkttype set host ether daddr set meta ibrhwaddr accept } }
- Dodano nową infrastrukturę do testów fuzzingowych z wykorzystaniem narzędzia afl++ (american fuzzy lop++), aktywowaną na etapie kompilacji przez „./configure —with-fuzzer”.
Źródło: opennet.ru
