vydání balíkového filtru , vyvinutý jako náhrada za iptables, ip6tables, arptables a ebtables sjednocením rozhraní pro filtrování paketů pro IPv4, IPv6, ARP a síťové mosty. Balíček nftables obsahuje komponenty pro filtrování paketů, které pracují v uživatelském prostoru, zatímco na úrovni jádra zajišťuje činnost podvýkon nf_tables, který je součástí jádra Linux od verze 3.13. Požadované změny pro fungování verze nftables 0.9.2 jsou zahrnuty v jádře Linux 5.3.
Na úrovni jádra je poskytováno pouze obecné rozhraní, nezávislé na konkrétním protokolu a zajišťující základní funkce získávání dat z paketů, provádění operací s daty a řízení toku. Přímá logika filtrování a specifické pro protokoly zpracovatele jsou kompilovány do bajtkódu v uživatelském prostoru, který je potom nahrán do jádra pomocí rozhraní Netlink a vykonáván ve speciální virtuální stroji, která připomíná BPF (Berkeley Packet Filters). Tento přístup významně snižuje velikost kódu filtrování, který pracuje na úrovni jádra, a přenáší všechny funkce analýzy pravidel a logiku práce s protokoly do uživatelského prostoru.
Hlavní novinky:
- Možnost kontroly čísla portu z hlavičky paketu transportní vrstvy bez ohledu na typ protokolu čtvrté vrstvy:
add rule x y ip protocol { tcp, udp } th dport 53
- Podpora obnovy životnosti souboru prvků:
add element ip x y { 1.1.1.1 timeout 30s expires 15s }
- Možnost kontroly jednotlivých možností (lsrr, rr, ssrr a ra) z paketů IPv4:
add rule x y ip option rr exists drop
Pro možnosti směrování je možné zkontrolovat pole type, ptr, length a addr:
add rule x y ip option rr type 1 drop
- Ve výrazech je nyní povoleno uvádět síťové prefixy a rozsahy adres:
iifname ens3 snat to 10.0.0.0/28
iifname ens3 snat to 10.0.0.1-10.0.0.15 - Podpora používání proměnných v definicích řetězců:
define default_policy = accept
add chain ip foo bar { type filter hook input priority filter; policy $default_policy } - Určení priority řetězce může nyní probíhat jak v číselné, tak v symbolické podobě:
define prio = filter
define prionum = 10
define prioffset = "filter - 150"add table ip foo
add chain ip foo bar { type filter hook input priority $prio; }
add chain ip foo ber { type filter hook input priority $prionum; }
add chain ip foo bor { type filter hook input priority $prioffset; } - Byla implementována podpora modulu synproxy. Například pro umístění TCP portu 8888 pod ochranu synproxy lze použít sadu pravidel:
tabulka ip x {
chain y {
type filter hook prerouting priority raw; policy accept;
tcp dport 8888 tcp flags syn notrack
}chain z {
type filter hook forward priority filter; policy accept;
tcp dport 8888 ct state invalid,untracked synproxy mss 1460 \
wscale 7 timestamp sack-perm ct state invalid drop
}
} - Pro určení v tabulce conntrack očekávaných dalších připojení souvisejících s aktuálním připojením, která se používají v protokolech a scénářích vyžadujících navázání několika připojení, lze nyní určovat politiky prostřednictvím standartních sad pravidel. Například pro stanovení očekávaných po připojení k TCP portu 8888 následných připojení na port 5432 lze uvést následující pravidla:
tabulka x {
ct expectation myexpect {
protocol tcp
dport 5432
timeout 1h
size 12
l3proto ip
}chain input {
type filter hook input priority 0;
ct state new tcp dport 8888 ct expectation set myexpect
ct state established,related counter accept
}
}
Zdroj: opennet.ru
