È stata pubblicata l'uscita del filtro pacchetti nftables 1.0.7, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete (mirando a sostituire iptables, ip6tables, arptables e ebtables). Il pacchetto nftables include componenti del filtro pacchetti che operano nello spazio utente, mentre a livello del kernel l'operatività è garantita dal sottosistema nf_tables, che fa parte del kernel Linux a partire dalla versione 3.13. A livello del kernel viene fornita solo un'interfaccia generale, indipendente dal protocollo specifico e che fornisce 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 vengono compilati in bytecode nello spazio utente, dopodiché questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito nel kernel in una sezione 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 spostare tutte le funzioni di parsing delle regole e di logica di operazione con i protocolli nello spazio utente.
Variazioni principali:
- Per i sistemi con kernel Linux 6.2+ è stata aggiunta la supporto per il matching dei protocolli vxlan, geneve, gre e gretap, permettendo di utilizzare espressioni semplici per controllare le intestazioni nei pacchetti incapsulati. Ad esempio, per controllare Indirizzi IP nell'intestazione di un pacchetto annidato VxLAN, ora si possono usare regole (senza la necessità di una preventivo deincapsulamento dell'intestazione VxLAN e di associare il filtro all'interfaccia vxlan0): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- È stata implementata la supporto per la fusione automatica dei resti dopo la rimozione parziale di un elemento dell'insieme, permettendo di rimuovere un elemento o parte di un intervallo da un intervallo esistente (in precedenza, un intervallo poteva essere rimosso solo per intero). Ad esempio, dopo la rimozione dell'elemento 25 dall'insieme con intervalli 24-30 e 40-50, nella lista rimarranno 24, 26-30 e 40-50. Le correzioni necessarie per la fusione automatica saranno proposte nelle versioni correttive dei rami stabili del kernel 5.10+. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- È consentito l'uso di contatti e intervalli nella mappatura della traduzione degli indirizzi (NAT). table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- È stata aggiunta la supporto per l'espressione «last», che consente di conoscere il tempo dell'ultimo utilizzo dell'elemento di regola o della set-list. Questa possibilità è supportata a partire dal kernel Linux 5.14. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
- È stata aggiunta la possibilità di definire le quote nelle set-list. Ad esempio, per definire una quota di traffico per ogni IP di destinazione, si può specificare: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- È consentito l'uso delle costanti nelle set-list. Ad esempio, quando si utilizza come chiave della lista l'indirizzo di destinazione e l'identificatore VLAN, è possibile specificare direttamente il numero VLAN (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- È stato aggiunto un nuovo comando «destroy» per la rimozione incondizionata degli oggetti (a differenza del comando delete, non genera ENOENT quando si tenta di rimuovere un oggetto assente). È richiesto almeno il kernel Linux 6.3-rc. destroy table ip filter
Fonte: opennet.ru
