După un an de dezvoltare lansarea filtrului de pachete , în dezvoltare ca înlocuitor pentru iptables, ip6tables, arptables și ebtables prin unificarea interfețelor de filtrare a pachetelor pentru IPv4, IPv6, ARP și punți de rețea. Pachetul nftables include componente ale filtrului de pachete care operează în spațiul utilizatorului, în timp ce la nivel de kernel funcționează subsistemul nf_tables, parte integrantă a kernelului Linux început cu versiunea 3.13.
La nivel de kernel se oferă doar o interfață generală, independentă de protocolul specific, care furnizează funcții de bază pentru extragerea datelor din pachete, executarea operațiunilor asupra datelor și gestionarea fluxului.
Logica de filtrare și handler-ele specificate pentru protocoale sunt compilate în bytecode în spațiul utilizatorului, după care acest bytecode este încărcat în kernel prin intermediul interfeței Netlink și executat într-o mașină virtuală specială, asemănătoare BPF (Berkeley Packet Filters). Această abordare permite reducerea semnificativă a dimensiunii codului de filtrare care operează la nivel de kernel și transferarea tuturor funcțiilor de analiză a regulilor și a logicii de lucru cu protocoalele în spațiul utilizatorului.
Noutăți principale:
- Suport pentru IPsec, care permite asocierea adreselor tunelurilor în legătură cu pachetul, identificatorul cererii IPsec și eticheta SPI (Security Parameter Index). De exemplu,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Este, de asemenea, posibil să se verifice trecerea printr-un tunel IPsec. De exemplu, pentru a bloca traficul care nu trece prin IPSec:
… filter output rt ipsec missing drop
- Suport pentru protocolul IGMP (Internet Group Management Protocol). De exemplu, pentru a respinge cererile IGMP de apartenență la grup, se poate utiliza regula
nft add rule netdev foo bar igmp type membership-query counter drop
- Posibilitatea de a folosi variabile pentru a defini lanțurile de salt (jump / goto). De exemplu:
define dest = ber
add rule ip foo bar jump $dest - Suport pentru măști prin care se identifică sistemele de operare (OS Fingerprint) pe baza valorilor TTL din antet. De exemplu, pentru a marca pachetele în funcție de sistemul de operare al expeditorului, se poate utiliza comanda:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Posibilitatea de a corela adresa ARP a expeditorului cu adresa IPv4 a sistemului țintă. De exemplu, pentru a crește contorul pachetelor ARP trimise de la adresa 192.168.2.1, se poate folosi regula:
table arp x {
lanț y {
tip fere hook de filtrare, prioritate de filtrare; politica de acceptare;
arp saddr ip 192.168.2.1 contor pachete 1 bytes 46
}
} - Suport pentru îmbunătățirea transparentă a cererilor prin intermediul proxy-ului (tproxy). De exemplu, pentru a redirecționa cererile de pe portul 80 pe portul proxy 8080:
tabelă ip x {
lanț y {
tip fere hook prerouting, prioritate -150; politica de acceptare;
tcp dport 80 tproxy către :8080
}
} - Suport pentru marcarea socket-urilor cu posibilitatea de a obține ulterior marca stabilită prin setsockopt() în modul SO_MARK. De exemplu:
tabel inet x {
lanț y {
tip fere hook prerouting, prioritate -150; politica de acceptare;
tcp dport 8080 marcă set socket mark
}
} - Suport pentru specificarea denumirilor textuale pentru priorități în lanțuri. De exemplu:
nft adaugă lanț ip x raw { tip fere hook prerouting prioritate raw; }
nft adaugă lanț ip x filter { tip fere hook prerouting prioritate filter; }
nft adaugă lanț ip x filter_later { tip fere hook prerouting prioritate filter + 10; } - Suport pentru etichete SELinux (Secmark). De exemplu, pentru a defini eticheta „sshtag” în legătură cu contextul SELinux, se poate lansa:
nft adaugă secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
Și apoi folosi această etichetă în reguli:
nft adaugă regulă inet filter input tcp dport 22 meta secmark set «sshtag»
nft adaugă hartă inet filter secmapping { tip inet_service : secmark; }
nft adaugă element inet filter secmapping { 22 : «sshtag» }
nft adaugă regulă inet filter input meta secmark set tcp dport map @secmapping - Posibilitatea de a specifica porturile asociate protocoalelor în format text, așa cum sunt definite în fișierul /etc/services. De exemplu:
nft adaugă regulă x y tcp dport «ssh»
nft list ruleset -l
tabelă x {
lanț y {
…
tcp dport «ssh»
}
} - Posibilitatea de a verifica tipul interfeței de rețea. De exemplu:
adaugă regulă inet raw prerouting meta iifkind «vrf» accept
- Suport îmbunătățit pentru actualizarea dinamică a conținutului seturilor (sets) prin specificarea explicită a flag-ului «dynamic». De exemplu, pentru a actualiza setul «s» prin adăugarea adresei sursă și resetarea înregistrării în cazul în care nu există pachete timp de 30 de secunde:
adaugă tabel x
adaugă set x s { tip ipv4_addr; dimensiune 128; timeout 30s; flag-uri dinamic; }
adaugă lanț x y { tip fere hook input prioritate 0; }
adaugă regulă x y actualizează @s { ip saddr } - Posibilitatea de a stabili o condiție separată pentru îndeplinirea timeout-ului. De exemplu, pentru a suprascrie timeout-ul implicit pentru pachetele care ajung pe portul 8888, se poate specifica:
tabel ip filter {
ct timeout agresive-tcp {
protocol tcp;
l3proto ip;
politica = {established: 100, close_wait: 4, close: 4}
}
lanț output {
…
tcp dport 8888 ct timeout set «agressive-tcp»
}
} - Suport NAT pentru familia inet:
tabel inet nat {
…
ip6 daddr dead::2::1 dnat către dead:2::99
} - Instrumente îmbunătățite pentru afișarea mesajelor de eroare cauzate de greșeli de tipar:
nft adaugă lanț filtre test
Eroare: Nu există astfel de fișiere sau directoare; ai vrut să spui tabel «filter» în familia ip?
adaugă lanț filtre test
^^^^^^ - Posibilitatea de a specifica numele interfețelor în seturi (sets):
set sc {
tip inet_service . ifname
elemente = { «ssh» . «eth0» }
} - Sintaxa regulilor flowtable a fost actualizată:
nft adaugă tabel x
nft adaugă flowtable x ft { hook ingress prioritate 0; dispozitive = { eth0, wlan0 }; }
…
nft adaugă regulă x forward ip protocol { tcp, udp } flux adaugă @ft - Suportul pentru JSON a fost îmbunătățit.
Sursa: opennet.ro
