Byla vydána verze balíčku filtrů nftables 1.0.0, která unifikuje rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty (cílí na nahrazení iptables, ip6tables, arptables a ebtables). Změny potřebné pro uvedení verze nftables 1.0.0 jsou zahrnuty v jádru Linuxu 5.13. Významná změna čísla verze není spojena s žádnými zásadními změnami, ale je pouze důsledkem nepřetržitého pokračování číslování v desítkové soustavě (předchozí verze byla 0.9.9).
Balíček nftables obsahuje prvky filtrování paketů pracující v uživatelském prostoru, zatímco na úrovni jádra zajišťuje provoz subsystém nf_tables, který je součástí jádra Linux od verze 3.13. Na úrovni jádra je poskytováno pouze obecné rozhraní, které nezávisí na konkrétním protokolu a poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.
Samotná pravidla filtrování a specifické zpracovatele protokolů se kompilují do bytecode v uživatelském prostoru, poté je tento bytecode načten do jádra pomocí rozhraní Netlink a vykonává se v jádře v specializované virtuálním strojipodobě jako BPF (Berkeley Packet Filters). Tento přístup výrazně snižuje velikost kódu filtrování, který funguje na úrovni jádra a přesouvá všechny funkce analýzy pravidel a logiky práce s protokoly do uživatelského prostoru.
Hlavní novinky:
- Byla přidána podpora maskovacího prvku „*“ v set-seznamech, který se spouští pro jakékoli pakety, které nespadly pod další prvky definované v sadě. table x { map blocklist { type ipv4_addr : verdict flags interval elements = { 192.168.0.0/16 : accept, 10.0.0.0/8 : accept, * : drop } } chain y { type filter hook prerouting priority 0; policy accept; ip saddr vmap @blocklist } }
- Byla poskytnuta možnost definování proměnných z příkazového řádku pomocí volby „—define“. # cat test.nft table netdev x { chain y { type filter hook ingress devices = $dev priority 0; policy drop; } } # nft —define dev=„{ eth0, eth1 }“ -f test.nft
- V map-seznamech je povoleno použití trvalých (stateful) výrazů: table inet filter { map portmap { type inet_service : verdict 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; policy accept; iif vmap { «lo» : jump wan_input } } }
- Byla přidána command „list hooks“ pro výpis handlerů dané rodiny paketů: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev x y [nf_tables] +0000000300 chain inet m w [nf_tables] } hook input { -0000000100 chain ip a b [nf_tables] +0000000300 chain inet m z [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip a c [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 selinux_ipv4_postroute } }
- Ve blocích „queue“ je povoleno kombinovat výrazy jhash, symhash a numgen pro distribuci paketů do front v uživatelském prostoru. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 „queue“ lze také kombinovat s map-seznamy 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 }
- Byla umožněna expanze proměnných, které obsahují set-seznam, do několika map. define interfaces = { eth0, eth1 } table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { lo : accept, $interfaces : drop } } } # nft -f x.nft # nft list ruleset table ip x { chain y { type filter hook input priority 0; policy accept; iifname vmap { «lo» : accept, «eth0» : drop, «eth1» : drop } } }
- Je povoleno kombinování vmapů (verdict map) s intervaly: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- Byla zjednodušena syntaxe mapování pro NAT. Je povoleno uvádění rozsahů adres: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } nebo explicitních IP adress a portů: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } nebo kombinací rozsahů IP a portů: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Zdroj: opennet.ru
