È stata rilasciata la versione 0.9.9 del filtro pacchetti nftables. Essa unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete (con l'obiettivo di sostituire iptables, ip6table, arptables ed ebtables). Contemporaneamente è stata rilasciata anche la libreria libnftnl 1.2.0, che fornisce un'API di basso livello per interagire con il sottosistema nf_tables. Le modifiche necessarie per nftables 0.9.9 sono state integrate nel kernel. Linux 5.13-rc1.
Il pacchetto nftables contiene i componenti del filtro pacchetti che operano nello spazio utente, mentre il lavoro a livello kernel è svolto dal sottosistema nf_tables, che fa parte del kernel. Linux Dalla versione 3.13, a livello del kernel è disponibile solo un'interfaccia generica indipendente dal protocollo, che offre funzionalità di base per l'estrazione di dati dai pacchetti, l'esecuzione di operazioni sui dati e il controllo di flusso.
Le regole di filtraggio stesse e i gestori specifici del protocollo vengono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel utilizzando l'interfaccia Netlink ed eseguito nel kernel in uno speciale macchina virtuale, che ricorda BPF (Berkeley Packet Filters). Questo approccio consente una significativa riduzione delle dimensioni del codice di filtraggio in esecuzione a livello del kernel e sposta tutta l'analisi delle regole e la logica del protocollo nello spazio utente.
Principali innovazioni:
- Implementata la possibilità di spostare l'elaborazione della tabella di flusso sul lato della scheda di rete, abilitata tramite il flag "offload". Flowtable è un meccanismo per ottimizzare il percorso di inoltro dei pacchetti, in cui un attraversamento completo di 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 } }
- Aggiunto il supporto per l'associazione di un flag proprietario a una tabella, che garantisce l'uso esclusivo della tabella da parte di un processo. Quando un processo termina, la tabella associata viene automaticamente eliminata. Le informazioni sul processo vengono visualizzate nel dump delle regole come commento: table ip x { # progname nft flags owner chain y { type filter hook input priority filter; policy accept; counter packets 1 bytes 309 } }
- Aggiunto supporto per la specifica IEEE 802.1ad (VLAN stacking o QinQ), che definisce i metodi per sostituire più tag VLAN in un singolo frame Ethernet. Ad esempio, per verificare il tipo di frame Ethernet esterno 8021ad e l'ID VLAN = 342, è possibile utilizzare il costrutto ... ether type 802.1ad vlan id 342 per verificare il tipo di frame Ethernet esterno 8021ad/vlan id = 1, 802.1q/vlan id = 2 annidato e incapsulare ulteriormente il pacchetto IP: ... ether type 8021ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
- È stato aggiunto il supporto per la gestione delle risorse tramite la gerarchia unificata cgroups v2. La differenza principale tra cgroups v2 e v1 è l'utilizzo di una gerarchia cgroups comune per tutti i tipi di risorse, anziché gerarchie separate per l'allocazione delle risorse della CPU, la gestione della memoria e l'I/O. Ad esempio, per verificare se l'antenato di un socket al primo livello di cgroups v2 corrisponde alla maschera "system.slice", è possibile utilizzare il seguente costrutto: ... socket cgroups v2 level 1 "system.slice"
- Добавлена возможность проверки составных частей пакетов SCTP (необходимая для работы функциональность появится в ядре Linux 5.14). Например, для проверки наличия в пакете chunk-а с типом ‘data’ и полем ‘type’: … sctp chunk data exists … sctp chunk data type 0
- La velocità di caricamento delle regole utilizzando il flag "-f" è stata pressoché raddoppiata. Anche l'output dell'elenco delle regole è stato velocizzato.
- Viene fornita una forma compatta per controllare l'impostazione dei bit nei flag. Ad esempio, per verificare che i bit di stato snat e dnat non siano impostati, è possibile specificare: ... ct status ! snat,dnat per verificare 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
- La parola chiave "verdict" è ora consentita nelle definizioni typeof per set/map: add map xm { typeof iifname . ip protocol . th dport : verdict ;}
Fonte: opennet.ru
