È stato pubblicato il rilascio del filtro pacchetti nftables 1.0.3, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete (volto a sostituire iptables, ip6tables, arptables ed ebtables). Le modifiche necessarie per l'operatività di nftables 1.0.3 sono incluse nel kernel Linux 5.18.
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:
- Nei set-list, è stata aggiunta la supporto per la corrispondenza dei nomi delle interfacce di rete tramite maschera, ad esempio, utilizzando il simbolo «*»: 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 } }
- È stata implementata la fusione automatica degli elementi sovrapposti nel set-list durante l'operatività. In precedenza, quando si impostava l'opzione «auto-merge», la fusione avveniva in fase di dichiarazione delle regole, mentre ora si attiva anche durante l'aggiunta incrementale di nuovi elementi. Ad esempio, in fase di dichiarazione, il set 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 } } verrà trasformato in elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } e se successivamente si aggiungono nuovi elementi # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } diventerà 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 }
Quando si rimuovono elementi specifici da un elenco che rientrano in intervalli già esistenti, l'intervallo viene ridotto o diviso.
- Nell'ottimizzatore delle regole, richiamato specificando l'opzione «-o/—optimize», è stata aggiunta la supporto per la fusione di più regole di traduzione degli indirizzi (NAT) in una mappa. Ad esempio, per il set # 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 } }
l'esecuzione di «nft -o -c -f ruleset.nft» porterà alla trasformazione delle regole separate «ip saddr» in una mappa: 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 }
Analogamente, anche le espressioni raw possono essere trasformate in map-liste: # 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 } }
Dopo l'ottimizzazione otterremo una map-liste: 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 }
- È consentito l'uso delle espressioni raw nelle operazioni di concatenazione. Ad esempio: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } oppure table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
- È stata aggiunta la supporto per la specifica dei campi interi degli header nelle operazioni di concatenazione: 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 } }
- È stato aggiunto il supporto per il reset delle opzioni TCP (funziona solo con il kernel Linux 5.18+): tcp flags syn reset tcp option sack-perm
- Accelerato l'esecuzione dei comandi di output delle chain («nft list chain x y»).
Fonte: opennet.ru
