Filtr pakietów nftables w wersji 1.0.3

Opublikowano wydanie pakietu filter nftables 1.0.3, 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). Zmiany wymagane do działania wersji nftables 1.0.3 są zawarte w jądrze Linuksa 5.18.

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:

  • Listy zestawów obsługują teraz dopasowywanie nazw interfejsów sieciowych za pomocą maski, na przykład określonych za pomocą symbolu „*”: table inet testifsets { set simple_wild { wpisz flagi ifname elementy interwału = { „abcdef*”, „inna nazwa”, „ppp0” } } łańcuch v4icmp { typ zaczepu filtra priorytet wejścia 0; polityka akceptuje; iifname @simple_wild licznik pakietów 0 bajtów 0 iifname { „abcdef*”, „eth0” } licznik pakietów 0 bajtów 0 } }
  • Zaimplementowano automatyczne łączenie przecinających się elementów listy zestawów podczas działania. Poprzednio, gdy była ustawiona opcja „auto-łączenie”, łączenie odbywało się na etapie deklarowania reguł, ale teraz działa także wtedy, gdy nowe elementy są dodawane przyrostowo w trakcie operacji. Na przykład na etapie deklaracji zestaw list y { flagi interwał automatycznego łączenia elementów = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8 , 3.3.3.4 , 3.3.3.5 } } zostaną zamienione na elementy = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } i jeśli dodasz nowe elementy # nft dodaj element ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 } będzie wyglądać jak elementy = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Gdy usuniesz pojedyncze pozycje z listy, które należą do istniejącego asortymentu, zakres zostanie skrócony lub podzielony.

  • Do optymalizatora reguł, wywoływanego po określeniu opcji „-o/—optimize”, dodano obsługę łączenia wielu reguł translacji adresów (NAT) w listę map. Na przykład dla zestawu # cat ruleset.nft table ip x { chain y { wpisz nat hook postrouting priorytet srcnat; rezygnacja z polityki; ip saddr 1.1.1.1 tcp dport 8000 snat do 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat do 5.5.5.5:90 } }

    wykonanie „nft -o -c -f ruleset.nft” spowoduje konwersję oddzielnych reguł „ip saddr” na listę map: snat na ip saddr . mapa portów TCP { 1.1.1.1 . 8000: 4.4.4.4. 80, 2.2.2.2. 8001: 5.5.5.5. 90}

    Podobnie surowe wyrażenia można konwertować na listy map: # cat ruleset.nft table ip x { […] chain nat_dns_acme { długość udp 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc długość udp 62-78 @th,160,128 0 0x31393032383939353831343037320e5301e przejdź do nat_dns_this_62 długość udp 78-160,128 @th,0 0x31363436323733373931323934300e5301e goto nat_dns_saturn_62 długość udp 78-160,128 @th,0 0x32393535373539353636383732310e5302 62 78e goto nat_dns_saturn_160,128 udp długość 0-0 @th,38353439353637323038363633390 5303xXNUMXeXNUMXe goto nat_dns_saturn_XNUMX upuść } }

    po optymalizacji otrzymujemy listę map: długość udp . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203: przejdź do nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e: przejdź do nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : przejdź do nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e: przejdź do nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e: przejdź do nat_dns_saturn_5303 }

  • Dozwolone jest używanie wyrażeń surowych w operacjach łączenia. Na przykład: #nft dodaj regułę xy ip saddr. @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } lub tabela x { set y { typeof ip saddr . @ih,32,32 elementy = { 1.1.1.1 . 0x14 } } }
  • Dodano obsługę określania pól nagłówka liczb całkowitych w operacjach łączenia: tabela inet t { mapa m1 { typ długości udp . @ih,32,32: elementy przedziału flag werdyktu = { 20-80 . 0x14 : zaakceptuj, 1-10 . 0xa : upuść } } łańcuch c { typ haka filtra priorytet wejścia 0; rezygnacja z polityki; długość udp. @ih,32,32 vmap @m1 } }
  • Dodano obsługę resetowania opcji TCP (działa tylko z jądrem Linux 5.18+): flagi tcp syn reset opcja tcp sack-perm
  • Przyspieszono wykonywanie łańcuchowych poleceń wyjściowych („nft list chain xy”).

Źródło: opennet.ru

Dodaj komentarz