nftables packet filter versione 1.0.3

È stato pubblicato il rilascio di packet filter nftables 1.0.3, 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.3 sono incluse nel kernel Linux 5.18.

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:

  • Gli elenchi di set ora supportano la corrispondenza dei nomi delle interfacce di rete tramite una maschera, ad esempio, specificata utilizzando il simbolo "*": table inet testifsets { set simple_wild { type ifname flags interval elements = { “abcdef*”, “othername”, “ppp0” } } catena v4icmp { tipo filtro hook priorità ingresso 0; la politica accetta; iifname @simple_wild contatore pacchetti 0 byte 0 iifname { “abcdef*”, “eth0” } contatore pacchetti 0 byte 0 } }
  • Implementata l'unione automatica degli elementi della set-list che si intersecano durante il funzionamento. In precedenza, quando era impostata l'opzione "unione automatica", l'unione veniva eseguita nella fase di dichiarazione delle regole, ma ora funziona anche quando nuovi elementi vengono aggiunti in modo incrementale durante l'operazione. Ad esempio, in fase di dichiarazione, l'elenco imposta y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8 , 3.3.3.4 , 3.3.3.5 } } verranno trasformati in elementi = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } e poi se aggiungi nuovi elementi # nft aggiungi elemento ip xy { 1.2.3.0 -1.2.4.255, 3.3.3.6 } apparirà come elementi = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }

    Quando rimuovi dall'elenco singoli elementi che rientrano negli elementi dell'intervallo esistente, l'intervallo viene accorciato o suddiviso.

  • All'ottimizzatore delle regole è stato aggiunto il supporto per combinare le regole di traduzione di indirizzi multipli (NAT) in un elenco di mappe, chiamato quando viene specificata l'opzione "-o/—optimize". Ad esempio, per la tabella set # cat ruleset.nft ip x { chain y { type nat hook postrouting priorità srcnat; calo della politica; ip saddr 1.1.1.1 tcp dport 8000 snat a 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat a 5.5.5.5:90 } }

    l'esecuzione di "nft -o -c -f ruleset.nft" convertirà le regole separate "ip saddr" in un elenco di mappe: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000: 4.4.4.4. 80, 2.2.2.2. 8001: 5.5.5.5. 90}

    Allo stesso modo, le espressioni grezze possono essere convertite in elenchi di mappe: # cat ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th ,160,128 0 0x31393032383939353831343037320e5301e vai a nat_dns_this_62 lunghezza udp 78-160,128 @th,0 0x31363436323733373931323934300e5301e vai a nat_dns_saturn_62 lunghezza udp 78-160,128 @th,0 0x32393535373539353636383732310e5302 62 78e vai a nat_dns_saturn_160,128 udp lunghezza 0-0 @th,38353439353637323038363633390 5303xXNUMXeXNUMXe vai a nat_dns_saturn_XNUMX drop } }

    dopo l'ottimizzazione otteniamo un elenco di mappe: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203: vai a nat_dns_dnstc, 62-78. 0x0e31393032383939353831343037320e: vai a nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : vai a nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e: vai a nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e: vai a nat_dns_saturn_5303 }

  • È consentito l'uso di espressioni grezze nelle operazioni di concatenazione. Ad esempio: #nft aggiungi regola xy ip saddr. @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } o tabella x { set y { typeof ip saddr . @ih,32,32 elementi = { 1.1.1.1 . 0x14 } } }
  • Aggiunto il supporto per specificare i campi di intestazione intera nelle operazioni di concatenazione: table inet t { map m1 { typeof udp length . @ ih,32,32 : elementi dell'intervallo dei flag di verdetto = { 20-80 . 0x14: accetta, 1-10. 0xa : drop } } catena c { tipo filtro hook priorità ingresso 0; calo della politica; lunghezza udp. @ih,32,32 vmap @m1 } }
  • Aggiunto supporto per reimpostare le opzioni TCP (funziona solo con kernel Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • L'esecuzione dei comandi di output della catena (“nft list chain xy”) è stata accelerata.

Fonte: opennet.ru

Aggiungi un commento