A fost publicat un nou release al filtrului de pachete nftables 1.0.6, care unifică interfețele de filtrare a pachetelor pentru IPv4, IPv6, ARP și punți de rețea (destinat înlocuirii iptables, ip6tables, arptables și ebtables). Filtrul nftables include componente de filtrare a pachetelor care funcționează în spațiul utilizatorului, iar la nivelul kernelului, funcționalitatea este asigurată de subsystema nf_tables, inclusă în kernelul Linux începând cu versiunea 3.13. La nivel de kernel este furnizată doar o interfață generală, independentă de protocolul utilizat, care oferă funcții de bază pentru extragerea datelor din pachete, efectuarea operațiunilor pe date și gestionarea fluxului.
Regulile de filtrare și handler-ii specifici pentru protocoale sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în nucleu prin intermediul interfeței Netlink și executat în nucleu într-un mod special mașina virtuală, similar cu BPF (Berkeley Packet Filters). Această abordare permite reducerea semnificativă a dimensiunii codului de filtrare care funcționează la nivel de nucleu și mutarea tuturor funcțiilor de analiză a regulilor și logica de funcționare cu protocoalele în spațiul utilizatorului.
Modificări principale:
- În optimizatorul de reguli, apelat prin opțiunea „-o/—optimize”, este implementată ambalarea automată a regulilor prin combinarea și transformarea acestora în liste de tip map și set. De exemplu, regulile # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } după executarea „nft -o -c -f ruleset.nft” vor fi transformate astfel: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept în: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
- Optimizatorul poate, de asemenea, să transforme în forme mai compacte regulile care folosesc deja liste set simple, de exemplu regulile: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname «lo» accept ct state established,related accept comment «În traficul pe care-l generăm, avem încredere» iifname «enp0s31f6» ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname «enp0s31f6» ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } după executarea «nft -o -c -f ruleset.nft» vor fi ambalate astfel: ruleset.nft:6:22-149: iifname «enp0s31f6» ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname «enp0s31f6» ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept în: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } accept
- Problema generării de bytecode pentru combinarea intervalelor în care se aplică tipuri cu ordine diferită de octeți, cum ar fi IPv4 (ordine de octet de rețea) și meta mark (ordine de octet a sistemului), a fost rezolvată. table ip x { map w { typeof ip saddr . meta mark : verdict flags interval counter elements = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr . meta mark vmap @w } }
- A fost realizată maparea protocoalelor rare folosind expresii raw, de exemplu: meta l4proto 91 @th,400,16 0x0 accept
- S-au rezolvat problemele cu includerea regulilor cu intervale: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- API-ul JSON a fost îmbunătățit, adăugând suport pentru expresii în liste set și map.
- În extensiile bibliotecii Python nftables a fost permisă încărcarea seturilor de reguli pentru procesare în modul de verificare («-c») și a fost adăugată suportul pentru definirea externă a variabilelor.
- În elementele listelor set a fost permisă adăugarea comentariilor.
- În byte ratelimit a fost permisă specificarea valorii zero.
Sursa: opennet.ro
