È stata pubblicata la versione 1.0.0 del filtro dei pacchetti nftables, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete (mirando 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 cambiamento significativo del numero di versione non è dovuto a modifiche radicali, ma è semplicemente il risultato della continuazione della numerazione decimale (la versione precedente era 0.9.9).
Il pacchetto nftables include componenti del filtro pacchetti che operano nello spazio utente, mentre a livello kernel, il funzionamento è garantito dal sottosistema nf_tables, incluso nel kernel Linux dalla versione 3.13. A livello kernel viene fornita solo un'interfaccia generica, non dipendente dal protocollo specifico, che offre funzionalità 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, dopo di che questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito nel kernel in un'area speciale. macchina virtuale, che ricorda i BPF (Berkeley Packet Filters). Questo approccio consente di ridurre significativamente la dimensione del codice di filtraggio che opera a livello di kernel, spostando tutte le funzioni di analisi delle regole e la logica di gestione dei protocolli nello spazio utente.
Novità principali:
- È stata aggiunta la supporto per l'elemento-maschera '*' nelle liste set, che corrisponde a qualsiasi pacchetto che non rientra in 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
- Nei map-elenchi è 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 } } }
- Aggiunta il comando «list hooks» per visualizzare l'elenco dei gestori della 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» è consentito 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 le map-liste per selezionare la coda nello spazio utente in base a chiavi arbitrarie. … queue flags bypass to oifname map { «eth0» : 0, «ppp0» : 2, «eth1» : 2 }
- È stata fornita la possibilità di espandere le variabili che includono un set-list in più 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 } } }
- È 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 }
- Rinnovato il syntax per le corrispondenze NAT. È consentito specificare intervalli di indirizzi: … snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } o espliciti IP addresses e porte: … dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } o 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
