U nivellu di u kernel furnisce solu una interfaccia generica indipendente da u protokollu chì furnisce funzioni basiche per l'estrazione di dati da i pacchetti, eseguisce operazioni di dati è u cuntrollu di flussu. I reguli di filtrazione è i manipulatori specifichi di u protokollu sò compilati in bytecode in u spaziu di l'utilizatori, dopu chì stu bytecode hè caricatu in u kernel utilizendu l'interfaccia Netlink è eseguitu in u kernel in una macchina virtuale speciale chì ricorda BPF (Berkeley Packet Filters). Stu approcciu permette di riduce significativamente a dimensione di u codice di filtrazione chì corre à u livellu di u kernel è move tutte e funzioni di e regule di analisi è a logica per travaglià cù protokolli in u spaziu di l'utilizatori.
Innuvazioni principali:
- Supportu per intervalli in cunnessione (concatenazione, certi bundle di indirizzi è porti chì simplificà a comparazione). Per esempiu, per un settore "lista bianca" chì l'elementi sò un attache, specificà a bandiera "interval" indicà chì u settore pò include intervalli in l'attachment (per l'attachment "ipv4_addr . ipv4_addr . inet_service" prima era pussibule di listà esatta. scontri di a forma "192.168.10.35. 192.68.11.123", è avà pudete specificà gruppi di indirizzi "80-192.168.10.35-192.168.10.40-192.68.11.123-192.168.11.125.
table ip foo {
stabilisce a lista bianca {
tipu ipv4_addr. ipv4_addr. inet_service
intervallu di bandiere
elementi = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}barra di catena {
tippu filtru ganciu prerouting filtru priurità; caduta di pulitica;
ip saddr. ip daddr. tcp dport @whitelist accetta
}
} - In i setti è i listi di carte, hè pussibule aduprà a direttiva "typeof", chì determina u formatu di l'elementu quandu currisponde.
Per esempiu:table ip foo {
stabilisce a lista bianca {
tipu di ip saddr
elementi = {192.168.10.35, 192.168.10.101, 192.168.10.135}
}barra di catena {
tippu filtru ganciu prerouting filtru priurità; caduta di pulitica;
ip daddr @whitelist accetta
}
}table ip foo {
mappa addr2mark {
typeof ip saddr : meta marca
elementi = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Aggiunta l'abilità di utilizà unisce in i vincoli NAT, chì vi permette di specificà un indirizzu è un portu quandu definisce e trasfurmazioni NAT basate nantu à liste di carte o insemi chjamati:
nft add rule ip nat pre dnat ip addr . portu à ip saddr map { 1.1.1.1 : 2.2.2.2 . trenta }
nft add map ip nat destinations { type ipv4_addr . inet_service: ipv4_addr. inet_service \\; }
nft add rule ip nat pre dnat ip addr . portu à ip saddr. tcp dport map @destinations - Supportu per l'accelerazione hardware cù alcune operazioni di filtrazione realizate da a carta di rete. L'accelerazione hè attivata via l'utilità ethtool ("ethtool -K eth0 hw-tc-offload on"), dopu chì hè attivata in nftables per a catena principale utilizendu a bandiera "offload". Quandu si usa u kernel Linux 5.6, l'accelerazione hardware hè supportata per l'accoppiamentu di u campu di l'intestazione è l'ispezione di l'interfaccia in entrata in cumminazione cù a ricezione, a scarta, a duplicazione (dup) è a trasmissione (fwd) di pacchetti. In l'esempiu sottu, l'operazioni di caccià i pacchetti chì venenu da l'indirizzu 192.168.30.20 sò realizati à u livellu di a carta di rete, senza passà i pacchetti à u kernel:
# cat file.nft
table netdev x {
catena y {
tipu di filtru ganciu ingress device eth0 priorità 10; scaricamentu di bandiere;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Infurmazione mejorata nantu à u locu di un errore in e regule.
# nft elimina a regula ip yz handle 7
Errore: Ùn pudia micca processà a regula: Nisun schedariu o cartulare
sguassate a regula ip yz handle 7
^# nft elimina a regula ip xx handle 7
Errore: Ùn pudia micca processà a regula: Nisun schedariu o cartulare
sguassate a regula ip xx handle 7
^# nft eliminà a tabella twst
Errore: Nisun schedariu o cartulare; intendevi a tavola "test" in famiglia IP?
sguassà table twst
^^^^U primu esempiu mostra chì a tavula "y" ùn hè micca in u sistema, u sicondu chì u gestore "7" manca, è u terzu chì un prompt di typo hè visualizatu quandu scrivite u nome di a tavola.
- Aghjunghje supportu per verificà l'interfaccia slave specificendu "meta sdif" o "meta sdifname":
... meta sdifname vrf1 ...
- Aghjunghje supportu per l'operazioni di shift right o left. Per esempiu, per trasfurmà una etichetta di pacchettu esistente lasciata da 1 bit è stabilisce u bit minore à 1:
... meta mark set meta mark lshift 1 o 0x1 ...
- Implementata l'opzione "-V" per vede l'infurmazioni di versione estesa.
# nft -V
nftables v0.9.4 (Jive at Five)
cli:readline
json: sì
minigmp: nò
libxtables: sì - L'opzioni di a linea di cumanda deve esse specificatu prima di i cumandamenti. Per esempiu, avete bisognu di specificà "nft -a list ruleset", è eseguisce "nft list ruleset -a" risulterà in un errore.
Source: opennet.ru