Filtr pakietów nftables w wersji 0.9.9

Opublikowano wydanie pakietu filter nftables 0.9.9, ujednolicającego interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (mające na celu zastąpienie iptables, ip6table, arptables i ebtables). W tym samym czasie opublikowano wersję towarzyszącej biblioteki libnftnl 1.2.0, udostępniającej niskopoziomowe API umożliwiające interakcję z podsystemem nf_tables. Zmiany wymagane do działania wersji nftables 0.9.9 są zawarte w jądrze Linuksa 5.13-rc1.

Pakiet nftables zawiera komponenty filtrujące pakiety, które działają w przestrzeni użytkownika, natomiast pracę na poziomie jądra zapewnia podsystem nf_tables, który jest częścią jądra Linuksa od wersji 3.13. Poziom jądra zapewnia jedynie ogólny, niezależny od protokołu interfejs, który zapewnia podstawowe funkcje wyodrębniania danych z pakietów, wykonywania operacji na danych i kontroli przepływu.

Same reguły filtrowania i procedury obsługi specyficzne dla protokołów są kompilowane w kod bajtowy przestrzeni użytkownika, po czym ten kod bajtowy jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w jądrze na specjalnej maszynie wirtualnej przypominającej BPF (Berkeley Packet Filters). Takie podejście umożliwia znaczne zmniejszenie rozmiaru kodu filtrującego działającego na poziomie jądra oraz przeniesienie wszystkich funkcji reguł parsowania i logiki pracy z protokołami do przestrzeni użytkownika.

Główne innowacje:

  • Zaimplementowano możliwość przeniesienia przetwarzania przepływowego na stronę karty sieciowej, włączanej za pomocą flagi „offload”. Flowtable to mechanizm optymalizacji ścieżki przekierowywania pakietów, w którym pełne przejście wszystkich łańcuchów przetwarzania reguł dotyczy tylko pierwszego pakietu, a wszystkie pozostałe pakiety w strumieniu są przekazywane bezpośrednio. table ip global { flowtable f { filtr priorytetu wejścia haka + 1 urządzenia = { lan3, lan0, wan } odciążanie flag } łańcuch do przodu { typ filtra filtr priorytetu haka do przodu; polityka akceptuje; protokół ip { tcp, udp } przepływ dodaj @f } słupek łańcucha { wpisz nat hook filtr priorytetu postoutingu; polityka akceptuje; oifname "wan" maskarada } }
  • Dodano obsługę dołączania flagi właściciela do tabeli, aby zapewnić wyłączne korzystanie z tabeli przez proces. Kiedy proces się kończy, powią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 właściciel łańcuch y { typ filtr hak wejście filtr priorytetu; polityka akceptuje; licznik pakietów 1 bajt 309 } }
  • Dodano obsługę specyfikacji IEEE 802.1ad (stosowanie VLAN lub QinQ), która definiuje sposób zastępowania wielu znaczników VLAN w pojedynczej ramce Ethernet. Na przykład, aby sprawdzić typ zewnętrznej ramki Ethernet 8021ad i vlan id=342, możesz użyć konstrukcji ... ether type 802.1ad vlan id 342, aby sprawdzić zewnętrzny typ ramki Ethernet 8021ad/vlan id=1, zagnieżdżony 802.1 q/vlan id=2 i dalsza enkapsulacja pakietów IP: ... ether typ 8021ad vlan id 1 vlan typ 8021q vlan id 2 typ vlan licznik IP
  • Dodano obsługę zarządzania zasobami przy użyciu ujednoliconej hierarchii cgroups v2. Kluczową różnicą między cgroups v2 i v1 jest użycie wspólnej hierarchii cgroups dla wszystkich typów zasobów zamiast oddzielnych hierarchii do alokacji zasobów procesora, regulowania zużycia pamięci i operacji we/wy. Przykładowo, aby sprawdzić, czy przodek gniazda pierwszego poziomu cgroupv2 pasuje do maski „system.slice”, można zastosować konstrukcję: ... gniazdo cgroupv2 poziom 1 „system.slice”
  • Dodano możliwość sprawdzania komponentów pakietów SCTP (wymagana do tego funkcjonalność pojawi się w jądrze Linuksa 5.14). Na przykład, aby sprawdzić, czy pakiet zawiera porcję o typie „dane” i polu „typ”: ... istnieją dane fragmentu sctp ... typ danych fragmentu sctp 0
  • Wykonanie operacji ładowania reguły zostało przyspieszone około dwukrotnie dzięki zastosowaniu flagi „-f”. Przyspieszono także wyświetlanie listy reguł.
  • Dostępny jest kompaktowy formularz sprawdzania, czy bity flagi są ustawione. Na przykład, aby sprawdzić, czy bity statusu snat i dnat nie są ustawione, możesz określić: ... ct status ! snat,dnat, aby sprawdzić, czy bit syn jest ustawiony w masce bitowej syn,ack: ... flagi tcp syn / syn,ack, aby sprawdzić, czy bity fin i rst nie są ustawione w masce bitowej syn,ack,fin,rst: ... flagi tcp! = fin,rst / syn,ack,fin,rst
  • Zezwól na słowo kluczowe „werdykt” w definicjach typu zestawu/mapy: add map xm { typeof iifname . protokół IP port: werdykt ;}

Źródło: opennet.ru

Dodaj komentarz