Egy év fejlesztés után
A kernelszint csak egy általános, protokoll-független interfészt biztosít, amely alapvető funkciókat biztosít az adatok csomagokból történő kinyeréséhez, adatműveletek végrehajtásához és az áramlásvezérléshez.
Magát a szűrési logikát és a protokoll-specifikus kezelőket a felhasználói térben bájtkódba fordítják, majd ezt a bájtkódot a Netlink interfész segítségével betöltik a kernelbe, és egy speciális, BPF-re (Berkeley Packet Filters) emlékeztető virtuális gépen hajtják végre. Ez a megközelítés lehetővé teszi a kernel szintjén futó szűrőkód méretének jelentős csökkentését, és a protokollokkal való munkavégzéshez szükséges elemzési szabályok és logikák összes funkciójának áthelyezését a felhasználói térbe.
Főbb újítások:
- IPsec-támogatás, amely lehetővé teszi az alagútcímek párosítását csomag, IPsec-kérésazonosító és SPI (Security Parameter Index) címke alapján. Például,
... ipsec az ip saddr 192.168.1.0/24-ben
... ipsec in spi 1-65536Azt is ellenőrizheti, hogy egy útvonal áthalad-e egy IPsec-alagúton. Például a forgalom blokkolásához nem IPSec-en keresztül:
… filter output rt ipsec hiányzó csepp
- Az IGMP (Internet Group Management Protocol) támogatása. Használhat például egy szabályt a bejövő IGMP-csoporttagsági kérelmek elvetésére
nft add szabály netdev foo bar igmp type Member-query counter drop
- Lehetőség változók használatára átmeneti láncok meghatározásához (ugrás / goto). Például:
define dest = ber
szabály hozzáadása ip foo bar ugrás $dest - Az operációs rendszerek azonosítására szolgáló maszkok támogatása (OS ujjlenyomat) a fejlécben található TTL-értékek alapján. Például a csomagok küldő operációs rendszere alapján történő megjelöléséhez használhatja a következő parancsot:
... meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows": 0x2,
"MacOS": 0x3,
"ismeretlen": 0x0 }
... osf ttl "Linux:4.20" verzió kihagyása - Lehetőség a küldő ARP-címének és a célrendszer IPv4-címének egyeztetésére. Például a 192.168.2.1 címről küldött ARP-csomagok számlálójának növeléséhez használhatja a következő szabályt:
táblázat arp x {
lánc y {
típusú szűrő horog bemeneti prioritás szűrő; szabályzat elfogadása;
arp saddr ip 192.168.2.1 számláló csomagok 1 bájt 46
}
} - A kérések átlátható továbbításának támogatása proxyn (tproxy) keresztül. Például a 80-as port hívásainak a 8080-as proxyportra történő átirányításához:
táblázat ip x {
lánc y {
típusú szűrő horog előrevezetési prioritás -150; szabályzat elfogadása;
tcp dport 80 tproxy a :8080-ra
}
} - A socketek jelölésének támogatása a setsockopt() segítségével a set mark további megszerzésének lehetőségével SO_MARK módban. Például:
táblázat inet x {
lánc y {
típusú szűrő horog előrevezetési prioritás -150; szabályzat elfogadása;
tcp dport 8080 mark set socket mark
}
} - Támogatja a láncok elsőbbségi szövegneveinek megadását. Például:
nft add chain ip x raw { type filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; } - SELinux címkék támogatása (Secmark). Például az "sshtag" címke SELinux kontextusban történő meghatározásához futtassa a következőket:
nft add secmark inet szűrő sshtag "system_u:object_r:ssh_server_packet_t:s0"
Ezután használja ezt a címkét a szabályokban:
nft add szabály inet szűrő bemenet tcp dport 22 meta secmark set "sshtag"
nft add map inet filter secmapping { type inet_service : secmark; }
nft add element inet filter secmapping { 22 : "sshtag" }
nft add szabály inet szűrő bemenet meta secmark set tcp dport map @secmapping - Lehetőség a protokollokhoz rendelt portok szöveges formában történő megadására, az /etc/services fájlban meghatározottak szerint. Például:
nft add szabály xy tcp dport "ssh"
nft lista szabálykészlet -l
táblázat x {
lánc y {
...
tcp dport "ssh"
}
} - Lehetőség a hálózati interfész típusának ellenőrzésére. Például:
add szabály inet raw prerouting meta iifkind "vrf" elfogadja
- Továbbfejlesztett támogatás a készletek tartalmának dinamikus frissítéséhez a „dinamikus” jelző kifejezett megadásával. Például az "s" készlet frissítéséhez a forráscím hozzáadásához és a bejegyzés alaphelyzetbe állításához, ha 30 másodpercig nincs csomag:
x táblázat hozzáadása
add set xs { type ipv4_addr; 128-as méret; timeout 30s; dinamikus zászlók; }
add chain xy { type filter hook input priority 0; }
xy szabály hozzáadása frissítés @s { ip saddr } - Külön időtúllépési feltétel beállításának lehetősége. Például a 8888-as porton érkező csomagok alapértelmezett időtúllépésének felülbírálásához a következőket adhatja meg:
táblázat ip filter {
ct timeout aggressive-tcp {
tcp protokoll;
l3proto ip;
policy = {létrehozott: 100, bezárás_várakozás: 4, bezárás: 4}
}
lánc kimenet {
...
tcp dport 8888 ct időtúllépés beállítása "agresszív-tcp"
}
} - NAT támogatás az inet családhoz:
táblázat inet nat {
...
ip6 daddr dead::2::1 dnat to dead:2::99
} - Továbbfejlesztett elírási hibajelentés:
nft add láncszűrő teszt
Hiba: Nincs ilyen fájl vagy könyvtár; családi ip-n a táblázat „szűrő”-re gondoltál?
láncszűrő teszt hozzáadása
^^^^^^ - Lehetőség interfésznevek megadására készletekben:
set sc {
írja be az inet_service parancsot. ifname
elements = { "ssh" . "eth0" }
} - Frissített folyamatábra-szabályok szintaxisa:
nft x táblázat hozzáadása
nft add flowtable x ft { hook ingress priority 0; eszközök = { eth0, wlan0 }; }
...
nft add rule x forward ip protokoll { tcp, udp } flow add @ft - Továbbfejlesztett JSON-támogatás.
Forrás: opennet.ru