Vydání paketového filtru nftables 1.0.0

Bylo zveřejněno vydání paketového filtru nftables 1.0.0, které sjednocuje rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty (zaměřené na nahrazení iptables, ip6table, arptables a ebtables). Změny požadované pro fungování vydání nftables 1.0.0 jsou zahrnuty v jádře Linuxu 5.13. Výrazná změna čísla verze není spojena s žádnými zásadními změnami, ale je pouze důsledkem důsledného pokračování číslování v desítkovém zápisu (předchozí vydání bylo 0.9.9).

Balíček nftables obsahuje komponenty paketového filtru, které běží v uživatelském prostoru, zatímco práci na úrovni jádra zajišťuje subsystém nf_tables, který je součástí linuxového jádra od vydání 3.13. Úroveň jádra poskytuje pouze generické rozhraní nezávislé na protokolu, které poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.

Filtrovací pravidla a obslužné rutiny specifické pro protokol jsou zkompilovány do bajtového kódu v uživatelském prostoru, poté je tento bajtový kód načten do jádra pomocí rozhraní Netlink a spuštěn v jádře ve speciálním virtuálním stroji připomínajícím BPF (Berkeley Packet Filters). Tento přístup umožňuje výrazně zmenšit velikost filtrovacího kódu běžícího na úrovni jádra a přesunout všechny funkce parsovacích pravidel a logiky pro práci s protokoly do uživatelského prostoru.

Hlavní inovace:

  • Do seznamů sad byla přidána podpora pro prvek masky „*“, který se spouští pro všechny balíčky, které nespadají pod jiné prvky definované v sadě. tabulka x { map blocklist { type ipv4_addr : verdikt flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priorita 0; přijmout politiku; ip saddr vmap @blocklist } }
  • Proměnné je možné definovat z příkazového řádku pomocí volby „--define“. # cat test.nft tabulka netdev x { chain y { type filter hook ingress devices = $dev priorita 0; pokles politiky; } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • V mapových seznamech je povoleno použití konstantních (stavových) výrazů: table inet filter { map portmap { type inet_service : verdikt counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { type filter hook prerouting priority raw; přijmout politiku; iif vmap { "lo" : skok wan_input } } }
  • Přidán příkaz „list hooks“ pro zobrazení seznamu handlerů pro danou rodinu paketů: # nft list hooks ip zařízení eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } input { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } háček vpřed { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac] 0000000225xu 4 0000000225 výstupy nf_4 tabulky _output } hook postrouting { +XNUMX XNUMX selinux_ipvXNUMX_postroute } }
  • Bloky fronty umožňují kombinovat výrazy jhash, symhash a numgen za účelem distribuce paketů do front v uživatelském prostoru. … fronta na symhash mod 65536 … příznaky fronty obcházejí numgen inc mod 65536 … fronta na jhash oif . meta mark mod 32 "queue" lze také kombinovat se seznamy map pro výběr fronty v uživatelském prostoru na základě libovolných klíčů. ... queue flags bypass to oifname map { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • Proměnné, které obsahují seznam množin, je možné rozšířit do několika map. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; přijmout politiku; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft seznam tabulka pravidel ip x { chain y { type filter hook input priority 0; přijmout politiku; iifname vmap { "lo" : přijmout, "eth0" : drop, "eth1" : drop } } }
  • Kombinování vmaps (mapa verdiktu) v intervalech je povoleno: # nft add rule xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2: přijmout }
  • Zjednodušená syntaxe pro mapování NAT. Povoleno specifikovat rozsahy adres: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } nebo explicitní IP adresy a porty: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } nebo kombinace rozsahů IP a portů: ... dnat to ip saddr . tcp dport mapa { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999 }

Zdroj: opennet.ru

Přidat komentář