A fost publicată versiunea 1.0.3 a filtrului de pachete nftables, care unifică interfețele de filtrare a pachetelor pentru IPv4, IPv6, ARP și poduri de rețea (destinată să înlocuiească iptables, ip6tables, arptables și ebtables). Modificările necesare pentru funcționarea versiunii nftables 1.0.3 sunt incluse în nucleul Linux 5.18.
Pachetul nftables include componente ale filtrului de pachete care funcționează în spațiul utilizatorului, în timp ce, la nivel de nucleu, funcționarea este asigurată de subsistemul nf_tables, parte a nucleului Linux începând cu versiunea 3.13. La nivel de nucleu se oferă doar o interfață generală, independentă de protocolul specific, care asigură funcții de bază pentru extragerea datelor din pachete, executarea operațiunilor cu datele și gestionarea fluxului.
Regulile de filtrare și handler-ii specifici pentru protocoale sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în nucleu prin intermediul interfeței Netlink și executat în nucleu într-un mod special mașina virtuală, similar cu BPF (Berkeley Packet Filters). Această abordare permite reducerea semnificativă a dimensiunii codului de filtrare care funcționează la nivel de nucleu și mutarea tuturor funcțiilor de analiză a regulilor și logica de funcționare cu protocoalele în spațiul utilizatorului.
Noutăți principale:
- În listele set-urilor a fost adăugată suportul pentru maparea denumirilor interfețelor de rețea pe bază de mască, de exemplu, specificată folosind simbolul „*”: table inet testifsets { set simple_wild { type ifname flags interval elements = { „abcdef*”, „othername”, „ppp0” } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { „abcdef*”, „eth0” } counter packets 0 bytes 0 } }
- A fost implementată unificarea automată a elementelor set-urilor care se intersectează în timpul funcționării. Anterior, atunci când se activa opțiunea „auto-merge”, unificarea se realiza în stadiul de declarare a regulilor, iar acum se activează și la adăugarea incrementală de noi elemente în timpul execuției. De exemplu, în etapa de declarare lista set y { flags interval auto-merge elements = { 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 } } va fi transformată în elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } iar apoi, dacă se adaugă noi elemente # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } va avea următoarea formă elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }
Atunci când se elimină elemente individuale dintr-o listă care se încadrează în elemente existente cu intervale, intervalul este redus sau împărțit.
- În optimizatorul de reguli, apelat atunci când se specifică opțiunea „-o/—optimize”, a fost adăugată suportul pentru unificarea mai multor reguli de traducere a adreselor (NAT) într-o listă de tip map. De exemplu, pentru setul # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }
executarea „nft -o -c -f ruleset.nft” va duce la transformarea regulilor separate „ip saddr” într-o listă de tip map: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }
În mod similar, expresiile raw pot fi transformate în liste map: # cat ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th,160,128 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }
După optimizare, vom obține o listă map: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }
- Utilizarea expresiilor raw este permisă în operațiunile de concatenare. De exemplu: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } sau table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- A fost adăugată suportul pentru specificarea câmpurilor întregi ale header-ului în operațiunile de concatenare: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
- A fost adăugat suportul pentru resetarea opțiunilor TCP (funcționează doar cu kernel Linux 5.18+): tcp flags syn reset tcp option sack-perm
- Executarea comenzilor de listare a chain-urilor („nft list chain x y”) a fost accelerată.
Sursa: opennet.ro
