Opublikowana wersja filtru pakietowego nftables 1.0.1, ujednolicającego interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (ma na celu zastąpienie iptables, ip6tables, arptables i ebtables). Niezbędne zmiany do działania wersji nftables 1.0.1 zostały zawarte w jądrze Linux 5.16-rc1.
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:
- Zmniejszone zużycie pamięci podczas ładowania dużych list set i map.
- Przyspieszono ponowne ładowanie list set i map.
- Przyspieszono wyświetlanie tabel i łańcuchów w dużych zbiorach reguł. Na przykład czas wykonania polecenia „nft list ruleset” w celu wyświetlenia zbioru reguł liczącego 100 tysięcy wierszy wynosi 3.049 sekundy, a przy wyświetlaniu tylko tabel nat i filter („nft list table nat”, „nft list table filter”) skraca się do 1.969 i 0.697 sekund.
- Przyspieszono wykonanie zapytań z opcją „--terse” podczas przetwarzania reguł z dużymi listami set i map.
- Umożliwiono filtrowanie ruchu z łańcucha „egress”, przetwarzanego na tym samym poziomie, co przetwornik egress w łańcuchu netdev (hook egress), tzn. na etapie, gdy sterownik otrzymuje pakiet z stosu sieciowego jądra. table netdev filter { chain egress { type filter hook egress devices = { eth0, eth1 } priority 0; meta priority set ip saddr map { 192.168.10.2 : abcd:2, 192.168.10.3 : abcd:3 } } }
- Zezwolono na mapowanie i modyfikację bajtów w nagłówku i treści pakietu według podanego przesunięcia. # nft add rule x y @ih,32,32 0x14000000 counter # nft add rule x y @ih,32,32 set 0x14000000 counter
Źródło: opennet.ru
