rilascio del filtro pacchetti , in fase di sviluppo come sostituto di iptables, ip6tables, arptables ed ebtables grazie alla uniformazione delle interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete. Il pacchetto nftables include componenti di filtro dei pacchetti che operano nello spazio utente, mentre a livello del kernel l'operatività è garantita dal sottosistema nf_tables, incluso nel kernel Linux a partire dalla versione 3.13. Le modifiche necessarie per il rilascio di nftables 0.9.4 sono incluse nella futura versione del kernel .
A livello del kernel viene fornito solo un'interfaccia generale, non dipendente da un 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 una speciale 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 trasferire tutte le funzioni di analisi delle regole e logica di gestione dei protocolli nello spazio utente.
Novità principali:
- Supporto per intervalli nelle concatenazioni (concatenation, specifici legami di indirizzi e porte che semplificano il confronto). Ad esempio, per un insieme "whitelist" i cui elementi sono concatenazioni, specificare il flag "interval" indicherà che l'insieme può includere intervalli nella concatenazione (per la concatenazione "ipv4_addr . ipv4_addr . inet_service" prima era possibile elencare corrispondenze esatte come "192.168.10.35 . 192.68.11.123 . 80", ora è possibile indicare gruppi di indirizzi "192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80"):
table ip foo {
set whitelist {
type ipv4_addr . ipv4_addr . inet_service
flags interval
elements = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr . ip daddr . tcp dport @whitelist accept
}
} - Negli insiemi e nelle mappe è stata garantita l'uso della direttiva "typeof", che definisce il formato dell'elemento durante il confronto.
Ad esempio:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr : meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - È stata aggiunta la possibilità di utilizzare concatenazioni nelle legature NAT, permettendo di specificare indirizzi e porte nella definizione delle trasformazioni NAT basate su mappe o insiemi nominativi:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \\; }
nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations - Supporto per accelerazione hardware con l'assegnazione di alcune operazioni di filtraggio alla scheda di rete. L'accelerazione si attiva tramite lo strumento ethtool ("ethtool -K eth0 hw-tc-offload on"), dopo di che viene attivata in nftables per la catena principale tramite il flag "offload". Con l'uso del kernel Linux 5.6 è supportata l'accelerazione hardware per il confronto dei campi dell'intestazione e il controllo dell'interfaccia di ingresso in combinazione con la ricezione, il scarto, la duplicazione (dup) e il reindirizzamento (fwd) dei pacchetti. Nel seguente esempio, le operazioni di scarto dei pacchetti provenienti dall'indirizzo 192.168.30.20 vengono eseguite a livello della scheda di rete, senza trasferire i pacchetti al kernel:
# cat file.nft
table netdev x {
chain y {
tipo filtro hook dispositivo ingress eth0 priorità 10; flags offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Migliorata la segnalazione del luogo dell'errore nelle regole.
# nft delete rule ip y z handle 7
Errore: Impossibile elaborare la regola: Nessun file o directory di questo tipo
elimina regola ip y z handle 7
^# nft delete rule ip x x handle 7
Errore: Impossibile elaborare la regola: Nessun file o directory di questo tipo
elimina regola ip x x handle 7
^# nft delete table twst
Errore: Nessun file o directory di questo tipo; voleva dire tabella 'test' nella famiglia ip?
elimina tabella twst
^^^^Nel primo esempio si mostra che la tabella «y» è assente nel sistema, nel secondo che manca il gestore «7», e nel terzo che viene fornito un suggerimento per un errore di battitura durante l'immissione del nome della tabella.
- Aggiunto supporto per il controllo dell'interfaccia slave tramite specifica «meta sdif» o «meta sdifname»:
… meta sdifname vrf1 …
- Aggiunto supporto per l'operazione di shift a destra o a sinistra. Ad esempio, per spostare un'etichetta esistente di un pacchetto a sinistra di 1 bit e impostare il bit più basso a 1:
… meta mark set meta mark lshift 1 or 0x1 …
- Realizzata l'opzione «-V» per visualizzare informazioni avanzate sulla versione.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: yes
minigmp: no
libxtables: yes - Le opzioni della riga di comando devono ora essere specificate prima dei comandi. Ad esempio, è necessario specificare «nft -a list ruleset», mentre l'esecuzione di «nft list ruleset -a» genererà un errore.
Fonte: opennet.ru
