È stata pubblicata l'uscita del filtro di pacchetti nftables 0.9.9, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete (mirato a sostituire iptables, ip6tables, arptables ed ebtables). È stata contemporaneamente pubblicata l'uscita della libreria correlata libnftnl 1.2.0, che fornisce un'API di basso livello per l'interazione con il sottosistema nf_tables. Le modifiche necessarie per il funzionamento dell'uscita nftables 0.9.9 sono incluse nel kernel Linux 5.13-rc1.
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:
- È stata implementata la possibilità di spostare l'elaborazione del flowtable sull'adattatore di rete, attivabile tramite il flag ‘offload’. Il flowtable rappresenta un meccanismo di ottimizzazione del percorso di reindirizzamento dei pacchetti, in cui l'intero passaggio di tutte le catene di elaborazione delle regole è applicato solo al primo pacchetto, mentre tutti gli altri pacchetti nel flusso vengono inoltrati direttamente. table ip global { flowtable f { hook ingress priority filter + 1 devices = { lan3, lan0, wan } flags offload } chain forward { type filter hook forward priority filter; policy accept; ip protocol { tcp, udp } flow add @f } chain post { type nat hook postrouting priority filter; policy accept; oifname «wan» masquerade } }
- È stato aggiunto il supporto per l'attacco a una tabella con un flag per il legame al proprietario, che consente di garantire l'uso esclusivo della tabella da parte di un processo. All'interruzione del processo, la tabella ad esso associata viene automaticamente rimossa. Le informazioni sul processo vengono visualizzate nel dump delle regole sotto forma di commento: table ip x { # progname nft flags owner chain y { type filter hook input priority filter; policy accept; counter packets 1 bytes 309 } }
- È stato aggiunto il supporto per la specifica IEEE 802.1ad (VLAN stacking o QinQ), che definisce i mezzi per inserire più tag VLAN in un singolo frame Ethernet. Ad esempio, per verificare il tipo di frame Ethernet esterno 8021ad e vlan id=342, è possibile utilizzare la seguente costruzione … ether type 802.1ad vlan id 342 per controllare il tipo di frame Ethernet esterno 8021ad/vlan id=1, incapsulato in 802.1q/vlan id=2 e la successiva incapsulazione del pacchetto IP: … ether type 802.1ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
- È stato aggiunto il supporto alla gestione delle risorse tramite una gerarchia unificata di cgroups v2. La differenza principale tra cgroups v2 e v1 è l'uso di una gerarchia comune di cgroups per tutti i tipi di risorse, invece di gerarchie separate per la distribuzione delle risorse CPU, per il controllo del consumo di memoria e per l'input/output. Ad esempio, per verificare se l'ancore del socket al primo livello di cgroupv2 corrisponde alla maschera "system.slice", si può usare la seguente costruzione: … socket cgroupv2 livello 1 "system.slice"
- È stata aggiunta la possibilità di verificare i componenti dei pacchetti SCTP (funzionalità necessaria disponibile nel kernel Linux 5.14). Ad esempio, per verificare la presenza in un pacchetto di un chunk di tipo 'data' e del campo 'type': … sctp chunk data exists … sctp chunk data type 0
- È stata accelerata di circa due volte l'esecuzione dell'operazione di caricamento delle regole mediante il flag "-f". E' stato inoltre accelerato l'output dell'elenco delle regole.
- È stata fornita una forma compatta per controllare l'impostazione dei bit nei flag. Ad esempio, per controllare che i bit di stato snat e dnat non siano impostati, è possibile specificare: … ct status ! snat,dnat per controllare che il bit syn sia impostato nella maschera di bit syn,ack: … tcp flags syn / syn,ack per controllare che i bit fin e rst non siano impostati nella maschera di bit syn,ack,fin,rst: … tcp flags != fin,rst / syn,ack,fin,rst
- È consentito utilizzare la parola chiave "verdict" nelle definizioni typeof per set/map: add map x m { typeof iifname . ip protocol . th dport : verdict; }
Fonte: opennet.ru
