nftables packet filter versione 1.0.0

È stato pubblicato il rilascio di packet filter nftables 1.0.0, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e bridge di rete (mirato a sostituire iptables, ip6table, arptables ed ebtables). Le modifiche richieste per il funzionamento della versione nftables 1.0.0 sono incluse nel kernel Linux 5.13. Un cambiamento significativo nel numero di versione non è associato ad alcun cambiamento fondamentale, ma è solo una conseguenza della continuazione coerente della numerazione in notazione decimale (la versione precedente era 0.9.9).

Il pacchetto nftables include componenti di filtro dei pacchetti eseguiti nello spazio utente, mentre il lavoro a livello di kernel è fornito dal sottosistema nf_tables, che fa parte del kernel Linux sin dalla versione 3.13. Il livello del kernel fornisce solo un'interfaccia generica indipendente dal protocollo che fornisce funzioni di base per estrarre dati dai pacchetti, eseguire operazioni sui dati e controllo del flusso.

Le stesse regole di filtraggio e i gestori specifici del protocollo vengono compilati in bytecode dello spazio utente, dopodiché questo bytecode viene caricato nel kernel utilizzando l'interfaccia Netlink ed eseguito nel kernel in una macchina virtuale speciale simile a BPF (Berkeley Packet Filters). Questo approccio consente di ridurre significativamente la dimensione del codice di filtraggio in esecuzione a livello di kernel e di spostare tutte le funzioni delle regole di analisi e la logica di lavorare con i protocolli nello spazio utente.

Principali innovazioni:

  • È stato aggiunto il supporto per l'elemento maschera "*" agli elenchi di set, che viene attivato per tutti i pacchetti che non rientrano in altri elementi definiti nel set. tabella x { mappa blocklist { tipo ipv4_addr : verdetto flag intervallo elementi = { 192.168.0.0/16 : accetta, 10.0.0.0/8 : accetta, * : drop } } catena y { tipo filtro hook prerouting priorità 0; la politica accetta; ip saddr vmap @blocklist } }
  • È possibile definire le variabili dalla riga di comando utilizzando l'opzione “--define”. # cat test.nft tabella netdev x { catena y { tipo filtro hook dispositivi di ingresso = $dev priorità 0; calo della politica; } } # nft —define dev="{ eth0, eth1 }" -f test.nft
  • Negli elenchi di mappe è consentito l'uso di espressioni costanti (con stato): table inet filter { map portmap { type inet_service : verdect counter elements = { 22 counter packets 0 bytes 0 : jump ssh_input, * counter packets 0 bytes 0 : drop } } chain ssh_input { } chain wan_input { tcp dport vmap @portmap } chain prerouting { tipo filter hook prerouting priorità raw; la politica accetta; iif vmap { "lo": salta wan_input } } }
  • Aggiunto il comando "list hooks" per visualizzare un elenco di gestori per una determinata famiglia di pacchetti: # nft list hooks ip device eth0 family ip { hook ingress { +0000000010 chain netdev xy [nf_tables] +0000000300 chain inet mw [nf_tables] } hook input { -0000000100 chain ip ab [nf_tables] +0000000300 chain inet mz [nf_tables] } hook forward { -0000000225 selinux_ipv4_forward 0000000000 chain ip ac [nf_tables] } hook output { -0000000225 selinux_ipv4_output } hook postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • I blocchi di coda consentono di combinare le espressioni jhash, symhash e numgen per distribuire i pacchetti alle code nello spazio utente. … coda su symhash mod 65536 … coda flag bypass su numgen inc mod 65536 … coda su jhash oif . meta mark mod 32 "queue" può anche essere combinato con elenchi di mappe per selezionare una coda nello spazio utente in base a chiavi arbitrarie. ... i flag della coda ignorano la mappa oifname { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • È possibile espandere le variabili che includono un elenco di set in più mappe. definire interfacce = { eth0, eth1 } tabella ip x { catena y { tipo filtro hook input priorità 0; la politica accetta; iifname vmap { lo : accetta, $interfacce : drop } } } # nft -f x.nft # nft lista tabella delle regole ip x { catena y { tipo filtro hook input priorità 0; la politica accetta; iifname vmap { "lo" : accetta, "eth0" : drop, "eth1" : drop } } }
  • È consentita la combinazione di vmap (mappa verdetto) a intervalli: # nft add rule xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2: accetta }
  • Sintassi semplificata per le mappature NAT. È consentito specificare intervalli di indirizzi: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } o indirizzi IP e porte espliciti: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } o combinazioni di intervalli IP e porte: ... da dnat a ip saddr . mappa porta tcp { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999 }

Fonte: opennet.ru

Aggiungi un commento