Opublikowano wersję pakietowego filtra nftables 0.9.9, który uniifikuje interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (ma na celu zastąpienie iptables, ip6tables, arptables i ebtables). Jednocześnie opublikowano wersję towarzyszącej biblioteki libnftnl 1.2.0, która dostarcza niskopoziomowe API do interakcji z podsystemem nf_tables. Wprowadzone zmiany niezbędne do działania nftables 0.9.9 zostały włączone do jądra Linux 5.13-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:
- Wprowadzono możliwość przeniesienia przetwarzania flowtable na stronę adaptera sieciowego, włączaną za pomocą flagi ‘offload’. Flowtable to mechanizm optymalizacji ścieżki przekierowywania pakietów, w którym pełne przetwarzanie wszystkich łańcuchów reguł stosowane jest tylko dla pierwszego pakietu, a wszystkie pozostałe pakiety w strumieniu są przekazywane bezpośrednio. table ip global { flowtable f { hook ingress priority filter + 1 devices = { lan3, lan0, wan } flags offload } chain forward { type filter hook forward priority filter; policy accept; ip protocol { tcp, udp } flow add @f } chain post { type nat hook postrouting priority filter; policy accept; oifname «wan» masquerade } }
- Dodano wsparcie dla oznaczania tabeli flagą przywiązania do właściciela, co zapewnia wyłączny dostęp do tabeli przez proces. Po zakończeniu procesu związana z nim tabela jest automatycznie usuwana. Informacje o procesie są wyświetlane w zrzucie reguł w formie komentarza: table ip x { # progname nft flags owner chain y { type filter hook input priority filter; policy accept; counter packets 1 bytes 309 } }
- Dodano wsparcie dla specyfikacji IEEE 802.1ad (VLAN stacking lub QinQ), która definiuje środki do podstawiania wielu znaczników VLAN w jednym ramce Ethernet. Na przykład, do sprawdzenia typu zewnętrznego ramki Ethernet 8021ad i vlan id=342 można użyć konstrukcji … ether type 802.1ad vlan id 342 do sprawdzenia zewnętrznego typu ramki Ethernet 8021ad/vlan id=1, zagnieżdżonej 802.1q/vlan id=2, i dalszej inkapsulacji pakietu IP: … ether type 8021ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
- Dodano wsparcie dla zarządzania zasobami za pomocą zjednoczonej hierarchii cgroups v2. Kluczową różnicą między cgroups v2 a v1 jest zastosowanie wspólnej hierarchii cgroups dla wszystkich rodzajów zasobów, zamiast oddzielnych hierarchii do rozdzielania zasobów CPU, regulacji zużycia pamięci i wejścia/wyjścia. Na przykład, aby sprawdzić, czy ojciec gniazda na pierwszym poziomie cgroupv2 zgadza się z maską „system.slice”, można użyć konstrukcji: … socket cgroupv2 level 1 „system.slice”
- Dodano możliwość sprawdzania części składowych pakietów SCTP (wymagana funkcjonalność pojawi się w jądrze Linux 5.14). Na przykład, aby sprawdzić obecność w pakiecie kawałka o typie ‘data’ i polu ‘type’: … sctp chunk data exists … sctp chunk data type 0
- Wykonanie operacji ładowania reguł przy użyciu flagi „-f” przyspieszyło mniej więcej dwukrotnie. Szybciej również działa wyświetlanie listy reguł.
- Dostarczono zwartą formę sprawdzania ustawiania bitów w flagach. Na przykład, aby sprawdzić, czy bity stanu snat i dnat nie są ustawione, można podać: … ct status ! snat,dnat aby sprawdzić, czy bit syn jest ustawiony w masce bitowej syn,ack: … tcp flags syn / syn,ack aby sprawdzić, czy bity fin i rst nie są ustawione w masce bitowej syn,ack,fin,rst: … tcp flags != fin,rst / syn,ack,fin,rst
- Zezwolono na używanie słowa kluczowego „verdict” w definicjach typeof dla set/map: add map x m { typeof iifname . ip protocol . th dport : verdict; }
Źródło: opennet.ru
