È stato pubblicato il rilascio del filtro pacchetti nftables 1.0.6, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete (destinato a sostituire iptables, ip6tables, arptables ed ebtables). Il pacchetto nftables include componenti del filtro pacchetti che operano nello spazio utente, mentre a livello kernel la funzionalità è fornita dal sottosistema nf_tables, incluso nel kernel Linux dalla versione 3.13. A livello kernel viene fornita solo un'interfaccia generale, indipendente dal protocollo specifico, che fornisce le funzioni di base per l'estrazione dei dati dai pacchetti, l'esecuzione di operazioni sui dati e il controllo 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.
Variazioni principali:
- Nell'ottimizzatore di regole, chiamato quando si specifica l'opzione «-o/—optimize», è stata implementata la compressione automatica delle regole tramite la loro combinazione e trasformazione in elenchi map e set. Ad esempio, le regole # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } dopo l'esecuzione di «nft -o -c -f ruleset.nft» saranno trasformate nel seguente modo: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept in: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
- L'ottimizzatore può anche convertire in una forma più compatta le regole che già utilizzano semplici elenchi set, ad esempio le regole: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname «lo» accept ct state established,related accept comment «Nel traffico che originiamo, ci fidiamo» iifname «enp0s31f6» ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname «enp0s31f6» ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } dopo aver eseguito «nft -o -c -f ruleset.nft» saranno impacchettati nel seguente modo: ruleset.nft:6:22-149: iifname «enp0s31f6» ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname «enp0s31f6» ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept in: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } accept
- È stata risolta la questione della generazione del bytecode per l'unione di intervalli in cui vengono utilizzati tipi con diversi ordini di byte, ad esempio IPv4 (ordine di byte di rete) e meta mark (ordine di byte del sistema). table ip x { map w { typeof ip saddr . meta mark : verdict flags interval counter elements = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr . meta mark vmap @w } }
- È stata migliorata l'associazione di protocolli rari nell'uso di espressioni raw, ad esempio: meta l4proto 91 @th,400,16 0x0 accept
- Sono stati risolti i problemi con l'inclusione di regole con intervalli: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Migliorato l'API JSON, che ora supporta espressioni negli elenchi set e map.
- Nelle estensioni della libreria Python nftables è stata consentita il caricamento di set di regole per la verifica in modalità controllo («-c») e aggiunta la supporto per la definizione esterna delle variabili.
- Negli elementi degli elenchi set è consentito l'aggiunta di commenti.
- Nel byte ratelimit è consentita l'indicazione di un valore zero.
Fonte: opennet.ru
