Rilascio del filtro di pacchetto nftables 1.0.3

È stata rilasciata la versione 1.0.3 del filtro pacchetti nftables, che unifica le interfacce di filtraggio dei pacchetti per IPv4, IPv6, ARP e ponti di rete (mirando a sostituire iptables, ip6tables, arptables ed ebtables). Le modifiche necessarie per il funzionamento della versione 1.0.3 di nftables sono incluse nel kernel Linux 5.18.

Il pacchetto nftables include componenti del filtro pacchetti che operano nello spazio utente, mentre a livello kernel, il funzionamento è garantito dal sottosistema nf_tables, incluso nel kernel Linux dalla versione 3.13. A livello kernel viene fornita solo un'interfaccia generica, non dipendente dal protocollo specifico, che offre funzionalità di base per l'estrazione dei dati dai pacchetti, l'esecuzione di 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, dopo di che questo bytecode viene caricato nel kernel tramite l'interfaccia Netlink e viene eseguito nel kernel in un'area speciale. macchina virtuale, che ricorda i BPF (Berkeley Packet Filters). Questo approccio consente di ridurre significativamente la dimensione del codice di filtraggio che opera a livello di kernel, spostando tutte le funzioni di analisi delle regole e la logica di gestione dei protocolli nello spazio utente.

Novità principali:

  • Nei set di elenchi è stata aggiunta la supporto per il confronto dei nomi delle interfacce di rete tramite maschera, ad esempio, definita utilizzando il simbolo «*»: table inet testifsets { set simple_wild { type ifname flags interval elements = { «abcdef*», «othername», «ppp0» } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { «abcdef*», «eth0» } counter packets 0 bytes 0 } }
  • È stata introdotta l'unione automatica degli elementi in conflitto delle liste set durante l'operatività. In precedenza, con l'opzione "auto-merge" l'unione avveniva in fase di dichiarazione delle regole, ma ora si attiva anche durante l'aggiunta incrementale di nuovi elementi nel processo operativo. Ad esempio, al momento della dichiarazione, la lista set 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 } } verrà trasformata in elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } e poi, se vengono aggiunti nuovi elementi # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } assumerà la forma elements = { 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 si rimuovono elementi singoli dalla lista che rientrano in elementi esistenti con intervalli, l'intervallo viene accorciato o suddiviso.

  • Nell'ottimizzatore di regole, chiamato quando viene specificata l'opzione «-o/—optimize», è stata aggiunta la supporto per la combinazione di più regole di traduzione degli indirizzi (NAT) in una lista map. Ad esempio, per il set # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }

    l'esecuzione di «nft -o -c -f ruleset.nft» porterà alla trasformazione delle regole «ip saddr» separate in una lista map: 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 }

    Analogamente, anche le espressioni raw possono essere trasformate in liste map: # 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 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }

    dopo l'ottimizzazione otterremo un elenco map-c: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }

  • È consentito l'uso di espressioni raw nelle operazioni di concatenazione. Ad esempio: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } oppure table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
  • Aggiunta la supporto per la specifica di campi interi negli header nelle operazioni di concatenazione: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
  • Aggiunta la supporto per il reset delle opzioni TCP (funziona solo con il kernel Linux 5.18+): tcp flags syn reset tcp option sack-perm
  • Accelerato l'esecuzione dei comandi di output delle catene («nft list chain x y»).

Fonte: opennet.ru

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster