Po roku prac rozwojowych wydanie pakietowego filtra , rozwijającego się jako alternatywa dla iptables, ip6tables, arptables i ebtables poprzez unifikację interfejsów filtrowania pakietów dla IPv4, IPv6, ARP i mostów sieciowych. W pakiecie nftables znajdują się komponenty filtru pakietów działające w przestrzeni użytkownika, podczas gdy na poziomie jądra pracuje podsystem nf_tables, wchodzący w skład jądra Linux od wersji 3.13.
Na poziomie jądra udostępniany jest jedynie wspólny interfejs, niezależny od konkretnego protokołu, który zapewnia podstawowe funkcje wydobywania danych z pakietów, wykonywania operacji na danych i zarządzania przepływem.
Logika filtrowania i specyficzne dla protokołów przetwarzacze są kompilowane do bajtkodu w przestrzeni użytkownika, po czym ten bajtkod jest ładowany do jądra za pomocą interfejsu Netlink i wykonywany w specjalnej wirtualnej maszynie, przypominającej BPF (Berkeley Packet Filters). Takie podejście pozwala znacznie zmniejszyć rozmiar kodu filtrowania działającego na poziomie jądra i przenieść wszystkie funkcje analizy reguł i logiki pracy z protokołami do przestrzeni użytkownika.
Główne nowości:
- Wsparcie IPsec, umożliwiające mapowanie adresów tuneli w powiązaniu z pakietem, identyfikatorem żądania IPsec i tagiem SPI (Security Parameter Index). Na przykład,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Możliwe jest również sprawdzenie przejścia trasy przez tunel IPsec. Na przykład, aby zablokować ruch nieprzechodzący przez IPSec:
… filter output rt ipsec missing drop
- Wsparcie protokołu IGMP (Internet Group Management Protocol). Na przykład, aby odrzucić przychodzące zapytania IGMP o przynależność do grupy, można użyć reguły
nft add rule netdev foo bar igmp type membership-query counter drop
- Możliwość użycia zmiennych do określenia łańcuchów przejścia (jump / goto). Na przykład:
define dest = ber
add rule ip foo bar jump $dest - Wsparcie masek do identyfikacji systemów operacyjnych (OS Fingerprint) na podstawie wartości TTL w nagłówku. Na przykład, aby oznaczyć pakiety w zależności od systemu operacyjnego nadawcy, można użyć komendy:
… meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows" : 0x2,
"MacOS" : 0x3,
"unknown" : 0x0 }
… osf ttl skip version "Linux:4.20" - Możliwość mapowania adresu ARP nadawcy i adresu IPv4 systemu docelowego. Na przykład, aby zwiększyć licznik pakietów ARP wysyłanych z adresu 192.168.2.1, można użyć reguły:
table arp x {
chain y {
type filter hook input priority filter; policy accept;
arp saddr ip 192.168.2.1 counter packets 1 bytes 46
}
} - Wsparcie dla przezroczystego przekazywania żądań przez proxy (tproxy). Na przykład, aby przekierować żądania na port 80 do portu proxy 8080:
table ip x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 80 tproxy to :8080
}
} - Wsparcie dla znakowania gniazd z możliwością późniejszego uzyskania ustawionego znacznika przez setsockopt() w trybie SO_MARK. Na przykład:
table inet x {
chain y {
type filter hook prerouting priority -150; policy accept;
tcp dport 8080 mark set socket mark
}
} - Wsparcie dla wskazywania tekstowych nazw priorytetów dla łańcuchów. Na przykład:
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; } - Wsparcie dla etykiet SELinux (Secmark). Na przykład, aby zdefiniować etykietę „sshtag” w powiązaniu z kontekstem SELinux, możesz uruchomić:
nft add secmark inet filter sshtag „system_u:object_r:ssh_server_packet_t:s0”
A następnie użyć tej etykiety w regułach:
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 add rule inet filter input meta secmark set tcp dport map @secmapping - Możliwość wskazywania dostosowanych portów protokołów w formie tekstowej, jak określono w pliku /etc/services. Na przykład:
nft add rule x y tcp dport „ssh”
nft list ruleset -l
table x {
chain y {
…
tcp dport „ssh”
}
} - Możliwość sprawdzenia typu interfejsu sieciowego. Na przykład:
add rule inet raw prerouting meta iifkind „vrf” accept
- Udoskonalone wsparcie dla dynamicznej aktualizacji zawartości zbiorów (sets) przez wyraźne wskazanie flagi „dynamic”. Na przykład, aby zaktualizować zbiór „s” poprzez dodanie adresu źródłowego i zresetowanie wpisu w przypadku braku pakietów przez 30 sekund:
add table x
add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
add chain x y { type filter hook input priority 0; }
add rule x y update @s { ip saddr } - Możliwość ustawienia osobnego warunku dla wystąpienia timeoutu. Na przykład, aby nadpisać timeout domyślny dla pakietów przychodzących na port 8888 można podać:
table ip filter {
ct timeout agressive-tcp {
protocol tcp;
l3proto ip;
policy = {established: 100, close_wait: 4, close: 4}
}
chain output {
…
tcp dport 8888 ct timeout set „agressive-tcp”
}
} - Wsparcie dla NAT w rodzinie inet:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Udoskonalone narzędzia do wyświetlania informacji o błędach spowodowanych literówkami:
nft add chain filtre test
Błąd: Brak takiego pliku lub katalogu; czy miałeś na myśli tabelę „filter” w rodzinie ip?
add chain filtre test
^^^^^^ - Możliwość wskazywania nazw interfejsów w zbiorach (sets):
set sc {
type inet_service . ifname
elements = { „ssh” . „eth0” }
} - Uaktualniona składnia reguł flowtable:
nft add table x
nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }
…
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Ulepszona obsługa JSON.
Źródło: opennet.ru
