È stata pubblicata la versione 0.9.9 del filtro pacchetti nftables, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete (mirando a sostituire iptables, ip6tables, arptables ed ebtables). Contestualmente, è stata rilasciata la libreria correlata libnftnl 1.2.0, che fornisce un'API di basso livello per interagire con il sottosistema nf_tables. Le modifiche necessarie per il funzionamento della versione 0.9.9 di nftables sono state incluse nel kernel Linux 5.13-rc1.
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 implementata la possibilità di spostare l'elaborazione della flowtable sul lato dell'adattatore di rete, attivabile tramite il flag 'offload'. La flowtable rappresenta un meccanismo di ottimizzazione del percorso di inoltro dei pacchetti, in cui il passaggio completo attraverso tutte le catene di elaborazione delle regole viene 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 } }
- È stata aggiunta la supporto per l'attacco a una tabella dei flag per il legame con il proprietario, che consente un utilizzo esclusivo della tabella da parte del processo. Una volta completato il processo, la tabella 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 } }
- È stata aggiunta la supporto per la specifica IEEE 802.1ad (VLAN stacking o QinQ), che definisce i mezzi per sostituire più tag VLAN in un singolo frame Ethernet. Ad esempio, per controllare il tipo di frame Ethernet esterno 8021ad e vlan id=342, è possibile utilizzare la costruzione … ether type 802.1ad vlan id 342 per verificare il tipo esterno del frame Ethernet 8021ad/vlan id=1, l'incapsulamento 802.1q/vlan id=2 e l'ulteriore incapsulamento del pacchetto IP: … ether type 802.1ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
- È stata aggiunta la supporto per la gestione delle risorse tramite un'unificata gerarchia cgroups v2. La principale differenza tra cgroups v2 e v1 è l'applicazione di una gerarchia cgroups comune per tutti i tipi di risorse, invece di gerarchie separate per la distribuzione delle risorse CPU, per la regolazione del consumo di memoria e per l'input/output. Ad esempio, per verificare se l'antenato del socket al primo livello della cgroupv2 corrisponde alla maschera «system.slice», è possibile utilizzare la seguente costruzione: … socket cgroupv2 livello 1 «system.slice»
- È stata aggiunta la possibilità di verificare i componenti dei pacchetti SCTP (la funzionalità necessaria sarà disponibile nel kernel Linux 5.14). Ad esempio, per controllare la presenza di un chunk nel pacchetto con tipo 'data' e campo 'type': … chunk sctp data esistente … tipo chunk sctp data 0
- L'esecuzione dell'operazione di caricamento delle regole è stata accelerata di circa il doppio utilizzando il flag «-f». È stato anche velocizzato l'output dell'elenco delle regole.
- È stata fornita una forma compatta per verificare l'impostazione dei bit nei flag. Ad esempio, per verificare che i bit di stato snat e dnat non siano impostati, puoi indicare: … ct status ! snat,dnat. Per controllare che il bit syn sia impostato nella maschera di bit syn,ack: … tcp flags syn / syn,ack. Per verificare 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 di typeof per set/map: add map x m { typeof iifname . ip protocol . th dport : verdict;}
Fonte: opennet.ru
