È stata pubblicata la versione del filtro pacchetti nftables 1.0.0, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete (destinata a sostituire iptables, ip6tables, arptables ed ebtables). Le modifiche necessarie per il funzionamento della versione 1.0.0 di nftables sono incluse nel kernel Linux 5.13. Il significativo cambiamento del numero di versione non è associato a modifiche radicali, ma è semplicemente il risultato di una continuazione sequenziale della numerazione in base decimale (l'ultima versione era 0.9.9).
Nel pacchetto nftables sono inclusi componenti del filtro a pacchetti che operano nello spazio utente, mentre a livello di kernel l'operazione è gestita dal sottosistema nf_tables, incluso nel kernel di Linux a partire dalla versione 3.13. A livello di kernel viene fornito solo un'interfaccia generale, indipendente dal protocollo specifico e che offre funzioni di base per l'estrazione dei dati dai pacchetti, l'esecuzione di operazioni sui dati e la gestione del flusso.
Le regole di filtraggio e i gestori specifici per i protocolli vengono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito nel kernel in una sezione macchina virtuale, simile a BPF (Berkeley Packet Filters). Questo approccio consente di ridurre significativamente la dimensione del codice di filtraggio che opera a livello di kernel e di spostare tutte le funzioni di parsing delle regole e di logica di operazione con i protocolli nello spazio utente.
Novità principali:
- Nella lista set è stata aggiunta la supporto per l'elemento-maschera «*», che si attiva per tutti i pacchetti che non rientrano sotto altri elementi definiti nel 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 } }
- È stata fornita la possibilità di definire variabili dalla riga di comando utilizzando l'opzione «--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
- Nelle liste map è consentito l'uso di espressioni permanenti (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 } } }
- È stato aggiunto il comando «list hooks» per visualizzare l'elenco dei gestori per una data famiglia di pacchetti: # 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 } }
- Nei blocchi «queue» è possibile combinare le espressioni jhash, symhash e numgen per distribuire i pacchetti nelle code nello spazio utente. … queue to symhash mod 65536 … queue flags bypass to numgen inc mod 65536 … queue to jhash oif . meta mark mod 32 «queue» può anche essere combinato con elenchi di mappatura per selezionare la coda nello spazio utente basata su chiavi arbitrarie. … queue flags bypass to oifname map { «eth0» : 0, «ppp0» : 2, «eth1» : 2 }
- È stata fornita la possibilità di espandere le variabili, che includono l'elenco set, in più mappe. 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 } } }
- È consentita la combinazione di vmap (verdict map) con intervalli: # nft add rule x y tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2 : accept }
- È stata semplificata la sintassi delle corrispondenze per NAT. È possibile specificare intervalli di indirizzi: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } oppure espliciti indirizzi IP e porte: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } oppure combinazioni di intervalli IP e porte: … dnat to ip saddr . tcp dport map { 192.168.1.2 . 80 : 10.141.10.2-10.141.10.5 . 8888-8999 }
Fonte: opennet.ru
