Filtr pakietów nftables w wersji 1.0.6

Opublikowano wydanie filtra pakietów nftables 1.0.6, ujednolicające interfejsy filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych (mające na celu zastąpienie iptables, ip6table, arptables i ebtables). Pakiet nftables zawiera komponenty filtra pakietów, które działają w przestrzeni użytkownika, podczas gdy poziom jądra zapewnia podsystem nf_tables, który jest częścią jądra Linuksa od wersji 3.13. Na poziomie jądra dostępny jest tylko ogólny, niezależny od protokołu interfejs, który zapewnia podstawowe funkcje do wydobywania danych z pakietów, wykonywania operacji na danych i kontrolowania 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 zmiany:

  • Optymalizator reguł, wywoływany po wybraniu opcji „-o/—optimize”, automatycznie pakuje reguły, łącząc je i konwertując na listy map i zestawów. Na przykład reguły # cat ruleset.nft table ip x { łańcuch y { typ filtru hak wejściowy filtr priorytetu; rezygnacja z polityki; meta iifname eth1 ip saddr 1.1.1.1 ip Daddr 2.2.2.3 akceptować meta iifname eth1 ip saddr 1.1.1.2 ip Daddr 2.2.2.4 akceptować meta iifname eth1 ip saddr 1.1.1.2 ip Daddr 2.2.3.0/24 akceptuj meta iifname eth1 ip saddr 1.1.1.2 .2.2.4.0 ip Daddr 2.2.4.10-2 Accept meta iifname eth1.1.1.3 ip saddr 2.2.2.5 ip Daddr 4 Accept } } po wykonaniu "nft -o -c -f ruleset.nft" zostanie przekonwertowany w następujący sposób: zestaw reguł nft:17:74-1: meta iifname eth1.1.1.1 ip saddr 2.2.2.3 ip Daddr 5 Accept Rulesset.nft:17:74-1: meta iifname eth1.1.1.2 ip saddr 2.2.2.4 ip Daddr 6 Accept Rulesset.nft : 17:77-1: meta iifname eth1.1.1.2 ip saddr 2.2.3.0 ip Daddr 24/7 Accept Rulesset.nft:17:83-1: meta iifname eth1.1.1.2 ip saddr 2.2.4.0 ip Daddr 2.2.4.10-8 zaakceptuj zestaw reguł.nft:17:74-2: meta iifname eth1.1.1.3 ip saddr 2.2.2.5 ip Daddr 1 zaakceptuj w: iifname . ip saddr. ip tatadr { eth1.1.1.1 . 2.2.2.3. 1, eth1.1.1.2 . 2.2.2.4. 1, eth1.1.1.2 . 2.2.3.0. 24/1, eth1.1.1.2 . 2.2.4.0. 2.2.4.10-2, eth1.1.1.3. 2.2.2.5. XNUMX } zaakceptować
  • Optymalizator może także konwertować reguły, które już korzystają z prostych list zestawów, do bardziej zwartej postaci, na przykład reguły: # cat ruleset.nft table ip filter { wejście łańcucha { typ filtra hak wejście filtr priorytetu; rezygnacja z polityki; iifname „lo” zaakceptuj stan ct ustanowiony, powiązany zaakceptuj komentarz „W ruchu, z którego pochodzimy, ufamy” iifname „enp0s31f6” ip saddr { 209.115.181.102, 216.197.228.230 } ip Daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 zaakceptuj iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip Daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 Accept } } po wykonaniu "nft -o -c -f ruleset.nft" zostanie spakowane w następujący sposób : zestaw reguł.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip Daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 zaakceptuj zestaw reguł.nft:7:22- 143: iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip Daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 zaakceptuj w: iifname . ip saddr. ip tata. udp sport. udp dport { enp0s31f6 . 209.115.181.102. 10.0.0.149. 123. 32768-65535, enp0s31f6. 216.197.228.230. 10.0.0.149. 123. 32768-65535, enp0s31f6. 64.59.144.17. 10.0.0.149. 53. 32768-65535, enp0s31f6. 64.59.150.133. 10.0.0.149. 53. 32768-65535 } zaakceptuj
  • Rozwiązano problem z generowaniem kodu bajtowego w celu łączenia interwałów, które używają typów o różnej kolejności bajtów, takich jak IPv4 (kolejność bajtów w sieci) i znacznik meta (kolejność bajtów w systemie). tabela ip x { mapa w { typ ip saddr . meta mark: flagi werdyktu elementy licznika interwałów = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122: zaakceptuj, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : zaakceptowanie, } } łańcuch k { filtr typu hak filtr priorytetu wejścia; rezygnacja z polityki; ip saddr. meta znak vmap @w } }
  • Poprawione porównanie rzadkich protokołów przy użyciu wyrażeń surowych, na przykład: meta l4proto 91 @th,400,16 0x0 Accept
  • Rozwiązano problemy z włączaniem reguł w określonych odstępach czasu: wstaw regułę xy tcp sport { 3478-3497, 16384-16387 } licznik akceptuje
  • Udoskonalono interfejs API JSON, aby uwzględnić obsługę wyrażeń na listach zestawów i map.
  • Rozszerzenia biblioteki Pythona nftables umożliwiają ładowanie zestawów reguł do przetwarzania w trybie sprawdzania poprawności („-c”) i dodają obsługę zewnętrznych definicji zmiennych.
  • Dodawanie komentarzy jest dozwolone w elementach listy zestawów.
  • Limit szybkości bajtów umożliwia określenie wartości zerowej.

Źródło: opennet.ru

Dodaj komentarz