rilascio del filtro dei pacchetti , in fase di sviluppo come sostituto di iptables, ip6tables, arptables ed ebtables grazie all'unificazione delle interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete. Il pacchetto nftables include componenti del filtro dei pacchetti che operano nello spazio utente, mentre a livello del kernel l'operazione è gestita dal sottosistema nf_tables, incluso nel kernel Linux a partire dalla versione 3.13. Le modifiche necessarie al rilascio di nftables 0.9.4 sono incluse nella futura branch del kernel .
A livello di kernel, viene fornito solo un'interfaccia generale, indipendente dal protocollo specifico, che offre funzioni di base per l'estrazione dei dati dai pacchetti, l'esecuzione delle operazioni sui dati e la gestione del flusso. Le regole di filtraggio e i gestori specifici per i protocolli sono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink ed eseguito nel kernel in una speciale macchina virtuale, simile ai BPF (Berkeley Packet Filters). Questo approccio consente di ridurre notevolmente la dimensione del codice di filtraggio che opera a livello di kernel e di spostare tutte le funzioni di parsing delle regole e la logica di lavoro con i protocolli nello spazio utente.
Novità principali:
- Supporto dei range nelle concatenazioni (concatenazione, specifici legami di indirizzi e porte che semplificano il matching). Ad esempio, per un set «whitelist», i cui elementi sono una concatenazione, l'indicazione del flag «interval» indicherà che il set può includere intervalli nella concatenazione (per la concatenazione «ipv4_addr . ipv4_addr . inet_service» prima si potevano elencare esatte corrispondenze come «192.168.10.35 . 192.68.11.123 . 80», mentre ora si possono specificare 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
}
} - Nei set e nelle map-list è stata garantita la possibilità di utilizzare la direttiva «typeof», che definisce il formato dell'elemento durante il matching.
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 nei NAT bindings, permettendo di specificare indirizzi e porte nella definizione delle trasformazioni NAT basate su map-list o set nominati:
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 l'accelerazione hardware con alcune operazioni di filtraggio delegati alla scheda di rete. L'accelerazione viene attivata tramite lo strumento ethtool ("ethtool -K eth0 hw-tc-offload on"), dopodiché viene abilitata in nftables per la catena principale utilizzando il flag "offload". Con il kernel Linux 5.6, è supportata l'accelerazione hardware per il confronto dei campi dell'intestazione e il controllo dell'interfaccia in ingresso insieme a ricezione, scarto, duplicazione (dup) e inoltro (fwd) dei pacchetti. Nell'esempio seguente, le operazioni di scarto dei pacchetti provenienti dall'indirizzo 192.168.30.20 vengono eseguite a livello della scheda di rete, senza passare i pacchetti al kernel:
# cat file.nft
table netdev x {
catena y {
type filter hook ingress device eth0 priority 10; flags offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Migliorata la segnalazione della posizione dell'errore nelle regole.
# nft delete rule ip y z handle 7
Errore: Impossibile elaborare la regola: Nessun file o directory di questo tipo
delete rule 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
delete rule ip x x handle 7
^# nft delete table twst
Errore: Nessun file o directory di questo tipo; volevi dire tabella 'test' nella famiglia ip?
delete table twst
^^^^Nel primo esempio si mostra che la tabella «y» è assente dal sistema, nel secondo che manca il gestore «7», mentre nel terzo viene visualizzato un messaggio di errore di battitura durante la digitazione del nome della tabella.
- È stata aggiunta la funzionalità di verifica dell'interfaccia slave tramite l'indicazione «meta sdif» o «meta sdifname»:
… meta sdifname vrf1 …
- È stata aggiunta la funzionalità di operazione di spostamento a destra o a sinistra. Ad esempio, per spostare un'etichetta di pacchetto esistente a sinistra di 1 bit e impostare il bit meno significativo a 1:
… meta mark set meta mark lshift 1 or 0x1 …
- È stata implementata l'opzione «-V» per visualizzare informazioni dettagliate sulla versione.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: sì
minigmp: no
libxtables: sì - Le opzioni della riga di comando devono ora essere specificate prima dei comandi. Ad esempio, è necessario utilizzare «nft -a list ruleset», mentre eseguire «nft list ruleset -a» comporterà un errore.
Fonte: opennet.ru
