Po roce vývoje vydání balíkového filtru , který se vyvíjí jako náhrada za iptables, ip6tables, arptables a ebtables díky unifikaci rozhraní filtrací paketů pro IPv4, IPv6, ARP a síťové mosty. Balík nftables zahrnuje komponenty balíkového filtru pracující v uživatelském prostoru, zatímco na úrovni jádra zajišťuje funkci subsystém nf_tables, začleněný do jádra Linuxu počínaje verzí 3.13.
Na úrovni jádra je poskytováno pouze obecné rozhraní, které nezávisí na konkrétním protokolu a poskytuje základní funkce pro extrakci dat z paketů, provádění operací s daty a řízení toku.
Přímo logika filtrování a specifické zpracovatele protokolů se kompilují do bajtkódu v uživatelském prostoru, který se poté načítá do jádra prostřednictvím rozhraní Netlink a vykonává se ve speciálním virtuálním stroji podobném BPF (Berkeley Packet Filters). Takový přístup umožňuje výrazně zmenšit velikost kódu filtrování, který pracuje na úrovni jádra, a přesunout všechny funkce analýzy pravidel a logiky práce s protokoly do uživatelského prostoru.
Hlavní novinky:
- Podpora IPsec, která umožňuje mapování adres tunelů v závislosti na paketu, identifikátoru žádosti IPsec a značce SPI (Security Parameter Index). Například,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Je také možné zkontrolovat průchodnost trasy skrze tunel IPsec. Například, pro blokování provozu neprocházejícího přes IPSec:
… filter output rt ipsec missing drop
- Podpora protokolu IGMP (Internet Group Management Protocol). Například, pro odmítnutí příchozích IGMP dotazů na příslušnost k skupině lze použít pravidlo
nft add rule netdev foo bar igmp type membership-query counter drop
- Možnost využití proměnných pro určení řetězců přechodu (jump / goto). Například:
define dest = ber
add rule ip foo bar jump $dest - Podpora masek pro identifikaci operačních systémů (OS Fingerprint) na základě hodnot TTL v hlavičce. Například, pro označení paketů v závislosti na operačním systému odesílatele lze použít příkaz:
… meta mark set osf ttl skip name map { «Linux» : 0x1,
«Windows» : 0x2,
«MacOS» : 0x3,
«unknown» : 0x0 }
… osf ttl skip version «Linux:4.20» - Možnost porovnání ARP adresy odesílatele a IPv4 adresy cílového systému. Například, pro zvýšení počítače ARP paketů odeslaných z adresy 192.168.2.1 lze použít pravidlo:
table arp x {
chain y {
typ filtru hook vstup priorita filtru; politika akceptovat;
arp saddr ip 192.168.2.1 counter pakety 1 bajty 46
}
} - Podpora průhledného přesměrování dotazů přes proxy (tproxy). Například pro přesměrování požadavků na port 80 na port proxy 8080:
tabulka ip x {
chain y {
typ filtru hook prerouting priorita -150; politika akceptovat;
tcp dport 80 tproxy na :8080
}
} - Podpora značení socketů s možností dalšího získání nastavené značky pomocí setsockopt() v módu SO_MARK. Například:
tabulka inet x {
chain y {
typ filtru hook prerouting priorita -150; politika akceptovat;
tcp dport 8080 značka nastavit socket značka
}
} - Podpora uvedení textových názvů priorit pro řetězce. Například:
nft přidat řetězec ip x raw { typ filtru hook prerouting priorita raw; }
nft přidat řetězec ip x filter { typ filtru hook prerouting priorita filter; }
nft přidat řetězec ip x filter_later { typ filtru hook prerouting priorita filter + 10; } - Podpora označení SELinux (Secmark). Například pro určení značky «sshtag» v souvislosti s kontextem SELinux můžete spustit:
nft přidat secmark inet filter sshtag «system_u:object_r:ssh_server_packet_t:s0»
A poté použít tuto značku v pravidlech:
nft přidat pravidlo inet filter input tcp dport 22 meta secmark nastavit «sshtag»
nft přidat mapu inet filter secmapping { typ inet_service : secmark; }
nft přidat prvek inet filter secmapping { 22 : «sshtag» }
nft přidat pravidlo inet filter input meta secmark nastavit tcp dport mapa @secmapping - Možnost uvedení portů přiřazených protokolům v textovém formátu, jak jsou definovány v souboru /etc/services. Například:
nft přidat pravidlo x y tcp dport «ssh»
nft vypsat pravidlovou sadu -l
tabulka x {
chain y {
…
tcp dport «ssh»
}
} - Možnost kontroly typu síťového rozhraní. Například:
přidat pravidlo inet raw prerouting meta iifkind «vrf» akceptovat
- Vylepšená podpora dynamického aktualizování obsahu sad (sets) pomocí explicitního určení vlajky «dynamic». Například pro aktualizaci sady «s» s přidáním zdrojové adresy a resetováním záznamu v případě nepřítomnosti paketů po dobu 30 sekund:
přidat tabulku x
přidat sadu x s { typ ipv4_addr; velikost 128; timeout 30s; vlajky dynamické; }
přidat řetězec x y { typ filtru hook input priorita 0; }
přidat pravidlo x y aktualizovat @s { ip saddr } - Možnost stanovit jednotlivou podmínku nástupu časového limitu. Například pro přepsání výchozího časového limitu pro pakety přicházející na port 8888 můžete uvést:
tabulka ip filter {
ct timeout agresivní-tcp {
protokol tcp;
l3proto ip;
politika = {established: 100, close_wait: 4, close: 4}
}
řetězec output {
…
tcp dport 8888 ct timeout nastavit «agresivní-tcp»
}
} - Podpora NAT pro rodinu inet:
tabulka inet nat {
…
ip6 daddr dead::2::1 dnat na dead:2::99
} - Vylepšené prostředky výstupu informací o chybách z důvodu překlepů:
nft přidat řetězec filtre test
Chyba: Žádný takový soubor nebo adresář; mysleli jste tabulku «filter» v rodině ip?
přidat řetězec filtre test
^^^^^^ - Možnost uvedení názvů rozhraní v sadách (sets):
sada sc {
typ inet_service . ifname
prvky = { «ssh» . «eth0» }
} - Aktualizován syntaktický tvar pravidel flowtable:
nft přidat tabulku x
nft přidat flowtable x ft { hook ingress priorita 0; zařízení = { eth0, wlan0 }; }
…
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Zlepšená podpora JSON.
Zdroj: opennet.ru
