A fost publicată versiunea 1.0.0 a filtrului de pachete nftables, care unifică interfețele de filtrare a pachetelor pentru IPv4, IPv6, ARP și punți de rețea (destinat înlocuirii iptables, ip6tables, arptables și ebtables). Modificările necesare pentru funcționarea versiunii 1.0.0 a nftables sunt incluse în nucleul Linux 5.13. Schimbarea semnificativă a numărului versiunii nu este asociată cu modificări radicale, ci este doar o consecință a continuării numerotării în sistemul decimal (versiunea anterioară a fost 0.9.9).
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 a fost adăugată suportul pentru elementul-mască „*”, care se aplică tuturor pachetelor care nu se încadrează în alte elemente definite în set. 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 } }
- A fost oferită posibilitatea de a defini variabile din linia de comandă folosind opțiunea „—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
- În listele map a fost permisă utilizarea expresiilor permanente (stateful): 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 } } }
- A fost adăugată comanda „list hooks” pentru a afișa lista handler-elor pentru un anumit tip de pachete: # 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 } }
- În blocurile „queue” este permisă combinarea expresiilor jhash, symhash și numgen pentru distribuirea pachetelor în cozi în spațiul utilizatorului. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 „queue” poate fi, de asemenea, combinat cu liste map pentru a selecta coada în spațiul utilizatorului pe baza unor chei arbitrare. … queue flags bypass to oifname map { „eth0” : 0, „ppp0” : 2, „eth1” : 2 }
- A fost oferită posibilitatea de a desfășura variabile, incluzând set-list, în mai multe map-uri. 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 } } }
- Este permisă combinarea vmap-urilor (verdict map) cu intervale: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- Sintaxa pentru mapările NAT a fost simplificată. Este permisă specificarea intervalelor de adrese: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } sau valori explicite adreselor IP și porturi: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } sau combinații de intervale IP și porturi: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Sursa: opennet.ro
