wydanie pakietowego filtra , rozwijającego się jako zamiennik iptables, ip6tables, arptables i ebtables poprzez unifikację interfejsów filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych. Pakiet nftables zawiera komponenty filtra pakietów działające w przestrzeni użytkownika, podczas gdy na poziomie jądra działa podsystem nf_tables, który jest częścią jądra Linux od wydania 3.13. Niezbędne do działania wydania nftables 0.9.2 zmiany są zawarte w jądrze Linux 5.3.
Na poziomie jądra udostępniany jest jedynie ogólny interfejs, niezależny od konkretnego protokołu, który zapewnia podstawowe funkcje wyodrębniania danych z pakietów, wykonywania operacji na danych i zarządzania ruchem. Logika filtrowania oraz specyficzne dla protokołów przetwarzacze są kompilowane do bajtkodu w przestrzeni użytkownika, a następnie ten bajtkod jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w specjalnej maszynie wirtualnej, przypominającej BPF (Berkeley Packet Filters). Tego rodzaju podejście pozwala znacznie zmniejszyć rozmiar kodu filtrowania działającego na poziomie jądra oraz przenieść wszystkie funkcje analizy reguł i logiki obsługi protokołów do przestrzeni użytkownika.
Główne nowości:
- Możliwość sprawdzenia numeru portu z nagłówka pakietu warstwy transportowej, niezależnie od typu protokołu warstwy 4:
add rule x y ip protocol { tcp, udp } th dport 53
- Wsparcie dla przywracania czasu życia zestawu elementów:
add element ip x y { 1.1.1.1 timeout 30s expires 15s }
- Możliwość sprawdzenia pojedynczych opcji (lsrr, rr, ssrr i ra) z pakietów IPv4:
add rule x y ip option rr exists drop
Dla opcji routingu możliwa jest kontrola pól type, ptr, length i addr:
add rule x y ip option rr type 1 drop
- W wyrażeniach teraz dozwolone jest wskazywanie prefiksów sieciowych i zakresów adresów:
iifname ens3 snat to 10.0.0.0/28
iifname ens3 snat to 10.0.0.1-10.0.0.15 - Wsparcie dla użycia zmiennych w definicjach łańcuchów:
define default_policy = accept
add chain ip foo bar { type filter hook input priority filter; policy $default_policy } - Określenie priorytetu łańcucha może teraz odbywać się zarówno w formie numerycznej, jak i symbolicznej:
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; } - Zostało wprowadzone wsparcie dla modułu synproxy. Na przykład, aby zabezpieczyć port TCP 8888 przy użyciu synproxy, można zastosować następujący zestaw reguł:
table 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
}
} - Aby określić w tabeli conntrack powiązane z bieżącym połączeniem oczekiwane dodatkowe połączenia, które są stosowane w protokołach i scenariuszach wymagających nawiązania wielu połączeń, można teraz definiować polityki przez standardowe zbiory reguł. Na przykład, aby określić oczekiwane połączenia do portu TCP 8888 jako następne połączenia do portu 5432, można wskazać następujące reguły:
table 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
}
}
Źródło: opennet.ru
