A fost publicat versiunea 1.0.7 a filtrului de pachete nftables, care unifică interfețele de filtrare a pachetelor pentru IPv4, IPv6, ARP și punțile de rețea (destinată să înlocuiască iptables, ip6tables, arptables și ebtables). Pachetul nftables include componentele filtrului de pachete care funcționează în utilizator, în timp ce la nivel de nucleu, funcționarea este asigurată de subsistemul nf_tables, parte integrantă a nucleului Linux începând cu versiunea 3.13. La nivel de nucleu, se oferă doar o interfață generală, independentă de protocolul specific, care oferă funcții de bază pentru extragerea datelor din pachete, efectuarea de operațiuni 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.
Modificări principale:
- Pentru sistemele cu nucleul Linux 6.2+, a fost adăugată suportul pentru maparea protocoalelor vxlan, geneve, gre și gretap, ceea ce permite utilizarea expresiilor simple pentru verificarea headerelor în pachete încapsulate. De exemplu, pentru verificarea adrese IP în headerul pachetului încapsulat VxLAN, acum se pot folosi reguli (fără a fi necesară de-încapsularea prealabilă a headerului VxLAN și legarea filtrului de interfața vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- A fost implementat suportul pentru fuzionarea automată a resturilor după ștergerea parțială a unui element din set-listă, ceea ce permite eliminarea unui element sau a unei părți dintr-un interval dintr-un interval existent (în trecut, intervalul putea fi șters doar în întregime). De exemplu, după ștergerea elementului 25 din set-lista cu intervalele 24-30 și 40-50, în listă vor rămâne 24, 26-30 și 40-50. Corecțiile necesare pentru funcționarea fuziunii automate vor fi propuse în versiunile corective ale ramurilor stabile ale nucleului 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- Este permisă utilizarea contactării și intervalelor în maparea traducerii adreselor (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- A fost adăugată suportul pentru expresia „last”, care permite identificarea momentului ultimei utilizări a unui element dintr-o regulă sau set. Această funcționalitate este disponibilă începând cu kernel-ul Linux 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
- A fost adăugată capacitatea de a defini cote în set-urile de liste. De exemplu, pentru a defini o cotă de trafic pentru fiecare adresă IP țintă, se poate specifica: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device „eth0” priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device „eth0” priority filter; policy accept; ip daddr @y drop } }
- Utilizarea constantelor în set-urile de liste este permisă. De exemplu, în cazul folosirii adresei de destinație și a identificatorului VLAN ca și cheie a listei, se poate specifica direct numărul VLAN-ului (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- A fost adăugată o nouă comandă „destroy” pentru a elimina fără echivoc obiectele (spre deosebire de comanda delete, nu generează ENOENT la încercarea de a elimina un obiect inexistent). Pentru a funcționa, este necesar să existe cel puțin kernel-ul Linux 6.3-rc. destroy table ip filter
Sursa: opennet.ro
