Després d'un any de desenvolupament
El nivell del nucli només proporciona una interfície genèrica independent del protocol que proporciona funcions bàsiques per extreure dades dels paquets, realitzar operacions de dades i controlar el flux.
La pròpia lògica de filtratge i els controladors específics del protocol es compilen en bytecode a l'espai de l'usuari, després del qual aquest bytecode es carrega al nucli mitjançant la interfície Netlink i s'executa en una màquina virtual especial que recorda BPF (Berkeley Packet Filters). Aquest enfocament us permet reduir significativament la mida del codi de filtratge que s'executa al nivell del nucli i moure totes les funcions d'anàlisi de regles i lògica per treballar amb protocols a l'espai d'usuari.
Principals innovacions:
- Suport IPsec, que permet la concordança d'adreces de túnel basades en paquets, ID de sol·licitud IPsec i etiqueta SPI (índex de paràmetres de seguretat). Per exemple,
... ipsec a ip saddr 192.168.1.0/24
... ipsec a spi 1-65536També és possible comprovar si una ruta passa per un túnel IPsec. Per exemple, per bloquejar el trànsit no mitjançant IPSec:
… la sortida del filtre rt ipsec falta gota
- Suport per a IGMP (Internet Group Management Protocol). Per exemple, podeu utilitzar una regla per descartar les sol·licituds de pertinença a un grup IGMP entrants
nft add rule netdev foo bar tipus igmp caiguda del comptador de consultes de pertinença
- Possibilitat d'utilitzar variables per definir cadenes de transició (jump/goto). Per exemple:
define dest = ber
afegir regla ip foo bar jump $dest - Suport per a màscares per identificar sistemes operatius (OS Fingerprint) en funció dels valors TTL de la capçalera. Per exemple, per marcar paquets segons el sistema operatiu del remitent, podeu utilitzar l'ordre:
... meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows": 0x2,
"MacOS": 0x3,
"desconegut": 0x0}
... osf ttl omet la versió "Linux:4.20" - Capacitat de fer coincidir l'adreça ARP del remitent i l'adreça IPv4 del sistema de destinació. Per exemple, per augmentar el comptador de paquets ARP enviats des de l'adreça 192.168.2.1, podeu utilitzar la regla següent:
taula arp x {
cadena y {
tipus de filtre ganxo d'entrada filtre de prioritat; acceptar la política;
arp saddr ip 192.168.2.1 comptador de paquets 1 bytes 46
}
} - Suport per a l'enviament transparent de sol·licituds mitjançant un proxy (tproxy). Per exemple, per redirigir les trucades al port 80 al port intermediari 8080:
taula ip x {
cadena y {
tipus de prioritat de preenrutament de ganxo de filtre -150; acceptar la política;
tcp dport 80 tproxy a:8080
}
} - Suport per marcar sòcols amb la possibilitat d'obtenir la marca establerta mitjançant setsockopt() en mode SO_MARK. Per exemple:
taula inet x {
cadena y {
tipus de prioritat de preenrutament de ganxo de filtre -150; acceptar la política;
tcp dport 8080 mark set marca de sòcol
}
} - Suport per especificar noms de text prioritaris per a cadenes. Per exemple:
nft add chain ip x raw { tipus filter hook prerouting prioritat raw; }
nft add chain ip x filter { tipus filter hook prerouting prioritat filtre; }
nft add chain ip x filter_later { tipus filter hook prerouting priority filter + 10; } - Suport per a etiquetes SELinux (Secmark). Per exemple, per definir l'etiqueta "sshtag" en un context SELinux, podeu executar:
nft afegir secmark filtre inet sshtag "system_u:object_r:ssh_server_packet_t:s0"
A continuació, utilitzeu aquesta etiqueta a les regles:
nft afegir regla inet filtre entrada tcp dport 22 meta secmark set "sshtag"
nft afegir mapa inet filtre secmapping { tipus inet_service: secmark; }
nft afegir element filtre inet secmapping { 22 : "sshtag" }
nft afegir regla inet filter input meta secmark set tcp dport map @secmapping - Capacitat d'especificar els ports assignats als protocols en forma de text, tal com es defineixen al fitxer /etc/services. Per exemple:
nft afegir regla xy tcp dport "ssh"
conjunt de regles de llista nft -l
taula x {
cadena y {
...
tcp dport "ssh"
}
} - Possibilitat de comprovar el tipus d'interfície de xarxa. Per exemple:
afegir regla inet raw prerouting meta iifkind "vrf" acceptar
- Suport millorat per a l'actualització dinàmica del contingut dels conjunts especificant explícitament la marca "dinàmica". Per exemple, per actualitzar el conjunt "s" per afegir l'adreça d'origen i restablir l'entrada si no hi ha paquets durant 30 segons:
afegir taula x
afegir conjunt xs { tipus ipv4_addr; talla 128; temps d'espera 30 s; banderes dinàmiques; }
afegir cadena xy { tipus filtre ganxo entrada prioritat 0; }
afegir regla xy actualitzar @s { ip saddr } - Possibilitat d'establir una condició de temps d'espera per separat. Per exemple, per anul·lar el temps d'espera predeterminat per als paquets que arriben al port 8888, podeu especificar:
filtre ip de taula {
ct timeout aggressive-tcp {
protocol tcp;
l3proto ip;
política = {established: 100, close_wait: 4, close: 4}
}
sortida en cadena {
...
tcp dport 8888 ct timeout definit "aggressive-tcp"
}
} - Suport NAT per a la família inet:
taula inet nat {
...
ip6 daddr mort::2::1 dnat a mort:2::99
} - Informe d'errors d'ortografia millorat:
nft afegir prova de filtre de cadena
Error: no hi ha cap fitxer o directori; Voleu dir "filtre" de la taula a la IP familiar?
afegir una prova de filtre de cadena
^^^^^^ - Capacitat d'especificar noms d'interfície en conjunts:
set sc {
escriviu inet_service . ifname
elements = { "ssh" . "eth0"}
} - Sintaxi de regles de la taula de flux actualitzada:
nft afegir taula x
nft add flowtable x ft { prioritat d'entrada del ganxo 0; dispositius = { eth0, wlan0 }; }
...
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Suport JSON millorat.
Font: opennet.ru