Po roce vývoje
Úroveň jádra poskytuje pouze generické rozhraní nezávislé na protokolu, které poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.
Samotná logika filtrování a obslužné rutiny specifické pro protokol jsou v uživatelském prostoru zkompilovány do bajtkódu, načež je tento bajtkód načten do jádra pomocí rozhraní Netlink a spuštěn ve speciálním virtuálním stroji připomínajícím BPF (Berkeley Packet Filters). Tento přístup umožňuje výrazně snížit velikost filtrovacího kódu běžícího na úrovni jádra a přesunout všechny funkce parsovacích pravidel a logiky pro práci s protokoly do uživatelského prostoru.
Hlavní inovace:
- Podpora IPsec, umožňující shodu adres tunelu na základě paketu, ID požadavku IPsec a tagu SPI (Security Parameter Index). Například,
... ipsec v ip saddr 192.168.1.0/24
... ipsec ve spi 1-65536Je také možné zkontrolovat, zda trasa prochází tunelem IPsec. Chcete-li například blokovat provoz mimo IPSec:
… výstup filtru rt ipsec chybí pokles
- Podpora protokolu IGMP (Internet Group Management Protocol). Pomocí pravidla můžete například zahodit příchozí žádosti o členství ve skupině IGMP
nft přidat pravidlo netdev foo bar igmp typ členství-dotaz counter drop
- Možnost použití proměnných k definování přechodových řetězců (skok / goto). Například:
definovat dest = ber
přidat pravidlo ip foo bar skok $dest - Podpora masek k identifikaci operačních systémů (OS Fingerprint) na základě hodnot TTL v záhlaví. Chcete-li například označit pakety na základě OS odesílatele, můžete použít příkaz:
... meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows": 0x2,
"MacOS": 0x3,
"neznámý" : 0x0 }
... osf ttl přeskočit verzi "Linux:4.20" - Schopnost porovnat ARP adresu odesílatele a IPv4 adresu cílového systému. Chcete-li například zvýšit počítadlo paketů ARP odeslaných z adresy 192.168.2.1, můžete použít pravidlo:
tabulka arp x {
řetěz y {
typ filter hook input priority filter; přijmout politiku;
arp saddr ip 192.168.2.1 čítačové pakety 1 bajty 46
}
} - Podpora transparentního předávání požadavků přes proxy (tproxy). Chcete-li například přesměrovat volání na port 80 na port proxy 8080:
tabulka ip x {
řetěz y {
priorita předsměrování háku typu filtru -150; přijmout politiku;
tcp dport 80 tproxy na :8080
}
} - Podpora označování soketů s možností dalšího získání nastavené značky pomocí setsockopt() v režimu SO_MARK. Například:
tabulka inet x {
řetěz y {
priorita předsměrování háku typu filtru -150; přijmout politiku;
tcp dport 8080 mark nastavit značku socketu
}
} - Podpora pro specifikaci prioritních textových názvů pro řetězce. Například:
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; } - Podpora SELinux tagů (Secmark). Chcete-li například definovat značku "sshtag" v kontextu SELinux, můžete spustit:
nft přidat secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"
A pak použijte toto označení v pravidlech:
nft add rule inet filter input 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 přidat pravidlo inet filter input meta secmark set tcp dport map @secmapping - Schopnost specifikovat porty přiřazené protokolům v textové podobě, jak jsou definovány v souboru /etc/services. Například:
nft přidat pravidlo xy tcp dport "ssh"
nft seznam pravidel -l
tabulka x {
řetěz y {
...
tcp dport "ssh"
}
} - Schopnost zkontrolovat typ síťového rozhraní. Například:
přidat pravidlo inet raw prerouting meta iifkind "vrf" přijmout
- Vylepšená podpora pro dynamickou aktualizaci obsahu sad explicitním určením příznaku „dynamic“. Chcete-li například aktualizovat sadu "s" pro přidání zdrojové adresy a resetování položky, pokud po dobu 30 sekund nejsou žádné pakety:
přidat tabulku x
add set xs { type ipv4_addr; velikost 128; časový limit 30s; dynamické příznaky; }
add chain xy { type filter hook input priority 0; }
přidat pravidlo xy aktualizovat @s { ip saddr } - Možnost nastavit samostatnou podmínku časového limitu. Chcete-li například přepsat výchozí časový limit pro pakety přicházející na port 8888, můžete zadat:
tabulka ip filtr {
ct timeout agresivní-tcp {
protokol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
řetězový výstup {
...
tcp dport 8888 ct timeout nastaven na "aggressive-tcp"
}
} - Podpora NAT pro inet rodinu:
tabulka inet nat {
...
ip6 daddr dead::2::1 dnat to dead:2::99
} - Vylepšené hlášení překlepů:
nft přidat test řetězového filtru
Chyba: Žádný takový soubor nebo adresář; měli jste na mysli „filtr“ tabulky v rodinné ip?
přidat test řetězového filtru
^^^^^^ - Schopnost specifikovat názvy rozhraní v sadách:
set sc {
zadejte inet_service . ifname
elementy = { "ssh" . "eth0" }
} - Aktualizovaná syntaxe pravidel flowtable:
nft přidat tabulku x
nft add flowtable x ft { hook ingress priority 0; zařízení = { eth0, wlan0 }; }
...
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Vylepšená podpora JSON.
Zdroj: opennet.ru