lansarea filtrului de pachete , dezvoltându-se ca o alternativă la iptables, ip6tables, arptables și ebtables, prin unificarea interfețelor de filtrare a pachetelor pentru IPv4, IPv6, ARP și poduri de rețea. Pachetul nftables include componente de filtrare a pachetelor care funcționează în spațiul utilizatorului, în timp ce la nivelul nucleului, activitatea este asigurată de subsystemul nf_tables, care face parte din nucleul Linux începând cu versiunea 3.13. Modificările necesare pentru lansarea nftables 0.9.4 sunt incluse în ramura viitoare a nucleului .
La nivel de kernel se oferă doar o interfață generală, independentă de protocolul specific și care oferă funcții de bază pentru extragerea datelor din pachete, efectuarea de operațiuni cu date și gestionarea fluxului. Reguli de filtrare direct și gestionarii specifici pentru protocoale sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în kernel cu ajutorul interfeței Netlink și executat în kernel într-o mașină virtuală specială, asemănătoare cu BPF (Berkeley Packet Filters). Această abordare permite reducerea semnificativă a dimensiunii codului de filtrare care rulează la nivel de kernel și externalizarea tuturor funcțiilor de analiză a regulilor și logicii de lucru cu protocoalele în spațiul utilizatorului.
Noutăți principale:
- Suport pentru intervale în concatenări (concatenation, anumite legături de adrese și porturi, care simplifică potrivirea). De exemplu, pentru un set „whitelist”, al cărui elemente sunt concatenări, specificarea unei flag „interval” va arăta că setul poate include intervale în concatenare (pentru concatenarea „ipv4_addr . ipv4_addr . inet_service” anterior se puteau enumera potriviri exacte de tip „192.168.10.35 . 192.68.11.123 . 80”, iar acum se pot specifica grupuri de adrese „192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80”):
table ip foo {
set whitelist {
type ipv4_addr . ipv4_addr . inet_service
flags interval
elements = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr . ip daddr . tcp dport @whitelist accept
}
} - În seturi și liste mapate, este posibilă utilizarea directivei „typeof”, care determină formatul elementului în timpul potrivirii.
De exemplu:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr : meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - A fost adăugată posibilitatea utilizării concatenărilor în regulile NAT, ceea ce permite specificarea adresei și portului la definirea transformărilor NAT pe baza listelor mapate sau a seturilor denumite:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \; }
nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations - Suport pentru accelerarea hardware-ului prin transferul unor operațiuni de filtrare pe umerii plăcii de rețea. Accelerarea se activează prin utilitarul ethtool („ethtool -K eth0 hw-tc-offload on”), după care este activată în nftables pentru lanțul principal cu ajutorul flag-ului „offload”. Folosind nucleul Linux 5.6, se sprijină accelerarea hardware-ului pentru potrivirea câmpurilor antetului și verificarea interfeței de intrare în combinație cu acceptarea, eliminarea, duplicarea (dup) și redirecționarea (fwd) pachetelor. În exemplul de mai jos, operațiile de eliminare a pachetelor care vin de la adresa 192.168.30.20 sunt efectuate la nivelul plăcii de rețea, fără a transmite pachetele nucleului:
# cat file.nft
table netdev x {
lanț y {
tipul filtrului hook ingress dispozitiv eth0 prioritate 10; steaguri offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Îmbunătățită informarea despre locația erorii în reguli.
# nft delete rule ip y z handle 7
Eroare: Nu s-a putut procesa regula: Nu există un astfel de fișier sau director
șterge regula ip y z handle 7
^# nft delete rule ip x x handle 7
Eroare: Nu s-a putut procesa regula: Nu există un astfel de fișier sau director
șterge regula ip x x handle 7
^# nft delete table twst
Eroare: Nu există un astfel de fișier sau director; ai vrut să spui tabela „test” în familia ip?
șterge tabela twst
^^^^În primul exemplu se arată că tabela „y” lipsește din sistem, în al doilea, că lipsește handlerul „7”, iar în al treilea, că se afișează un indiciu despre o greșeală de tipar când se introduce numele tabelei.
- A fost adăugată suportul pentru verificarea interfeței slave prin specificarea „meta sdif” sau „meta sdifname”:
… meta sdifname vrf1 …
- A fost adăugată suportul pentru operația de deplasare la dreapta sau la stânga. De exemplu, pentru a deplasa un marcaj de pachet existent la stânga cu 1 bit și a seta bitul inferior la 1:
… meta mark set meta mark lshift 1 or 0x1 …
- A fost implementată opțiunea „-V” pentru a afișa informații detaliate despre versiune.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: yes
minigmp: no
libxtables: yes - Opțiunile liniei de comandă trebuie acum să fie specificate înaintea comenzilor. De exemplu, trebuie să specifici „nft -a list ruleset”, iar lansarea „nft list ruleset -a” va produce o eroare.
Sursa: opennet.ro
