È stato rilasciato il pacchetto del filtro 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 i componenti del filtro dei pacchetti che operano nello spazio utente, mentre a livello di kernel l'operato è gestito dal sottosistema nf_tables, presente nel kernel Linux dalla versione 3.13. A livello di kernel è 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, 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.
Principali modifiche:
- Nell'ottimizzatore di regole, attivato specificando l'opzione "-o/—optimize", è stato implementato il raggruppamento automatico delle regole attraverso la loro fusione 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» verranno 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 in cui sono già utilizzati semplici set di liste, 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 di cui 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 l'esecuzione di «nft -o -c -f ruleset.nft» saranno impacchettate nei seguenti modi: 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
- È stato risolto il problema con la generazione del bytecode per la fusione degli intervalli in cui vengono utilizzati tipi con diversi ordini di arrangiamento dei byte, come IPv4 (ordine di arrangiamento dei byte di rete) e meta mark (ordine di arrangiamento dei byte di 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 } }
- È stato implementato il mapping di protocolli rari utilizzando espressioni raw, ad esempio: meta l4proto 91 @th,400,16 0x0 accept
- Sono stati risolti problemi con l'inclusione di regole con intervalli: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Migliorato l'API JSON, con supporto per espressioni in set- e map-list.
- Nelle estensioni della libreria python nftables è stata autorizzata il caricamento di set di regole per la gestione in modalità di verifica («-c») e aggiunto il supporto per la definizione esterna di variabili.
- Nelle voci delle set-lists è stato consentito l'aggiunta di commenti.
- Nel byte ratelimit è stato consentito l'indicazione di un valore nullo.
Fonte: opennet.ru
