Filtr pakietów nftables w wersji 1.0.0

Opublikowano wydanie pakietu filter nftables 1.0.0, 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.0 są zawarte w jądrze Linuksa 5.13. Istotna zmiana numeru wersji nie wiąże się z jakimikolwiek zasadniczymi zmianami, a jest jedynie konsekwencją konsekwentnej kontynuacji numeracji w zapisie dziesiętnym (poprzednia wersja to 0.9.9).

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:

  • Do list zestawów dodano obsługę elementu maski „*”, który jest wyzwalany dla wszystkich pakietów, które nie mieszczą się w innych elementach zdefiniowanych w zestawie. tabela x { map blocklist { typ ipv4_addr : flagi werdyktu elementy interwału = { 192.168.0.0/16 : zaakceptowanie, 10.0.0.0/8 : zaakceptowanie, * : upuszczenie } } łańcuch y { wpisz hak filtra priorytet wstępnego routingu 0; polityka akceptuje; ip saddr vmap @blocklist } }
  • Możliwe jest definiowanie zmiennych z linii poleceń za pomocą opcji „--define”. # cat test.nft tabela netdev x { łańcuch y { typ zaczepu filtra urządzenia wejściowe = $dev priorytet 0; rezygnacja z polityki; } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • Na listach map dozwolone jest użycie wyrażeń stałych (stanowych): tabela inet filter { map portmap { type inet_service : werdykt licznik elementów = { 22 pakiety liczników 0 bajtów 0 : skok ssh_input, * licznik pakietów 0 bajtów 0 : upuszczenie } } łańcuch ssh_input { } łańcuch wan_input { tcp dport vmap @portmap } łańcuch wstępne trasowanie { typ filtr hak priorytet wstępnego routingu surowy; polityka akceptuje; iif vmap { "lo": skok wan_input } } }
  • Dodano komendę "list hooks" wyświetlającą listę procedur obsługi dla danej rodziny pakietów: # nft list hooks ip urządzenie eth0 Family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 łańcuch ip ab [nf_tables] +0000000300 łańcuch inet mz [nf_tables] } hak do przodu { -0000000225 selinux_ipv4_forward 0000000000 łańcuch ip ac [nf_tables] } hak wyjście { -0000000225 selinux_ipv4_output } hak postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Bloki kolejek umożliwiają łączenie wyrażeń jhash, symhash i numgen w celu dystrybucji pakietów do kolejek w przestrzeni użytkownika. … kolejka do symhash mod 65536 … kolejka pomijania flag do numgen inc mod 65536 … kolejka do jhash oif . meta mark mod 32 „kolejka” może być również połączona z listami map, aby wybrać kolejkę w przestrzeni użytkownika na podstawie dowolnych kluczy. ... pomijanie flag kolejki do mapy oifname { "eth0": 0, "ppp0": 2, "eth1": 2 }
  • Możliwe jest rozwinięcie zmiennych zawierających listę zestawów na kilka map. zdefiniuj interfejsy = { eth0, eth1 } table ip x { łańcuch y { typ zaczepu filtra priorytet wejścia 0; polityka akceptuje; iifname vmap { lo: akceptowanie, $interfejsy: upuszczanie } } } # nft -f x.nft # nft lista zestaw reguł tabela ip x { łańcuch y { typ haka filtra priorytet wejściowy 0; polityka akceptuje; iifname vmap { „lo”: zaakceptowanie, „eth0”: upuszczenie, „eth1”: upuszczenie } } }
  • Dozwolone jest łączenie vmap (mapy werdyktów) w określonych odstępach czasu: # nft add rule xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : zaakceptuj }
  • Uproszczona składnia mapowań NAT. Zezwolono na określenie zakresów adresów: ... snat do ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } lub jawne adresy IP i porty: ... dnat do ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } lub kombinacje zakresów IP i portów: ... dnat to ip saddr . mapa portów TCP { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999}

Źródło: opennet.ru

Dodaj komentarz