Nach einem Jahr Entwicklung Veröffentlichung des Paketfilters , das sich als Ersatz für iptables, ip6tables, arptables und ebtables entwickelt, indem es die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht. Das nftables-Paket enthält Komponenten des Paketfilters, die im Benutzermodus arbeiten, während im Kernel die nf_tables-Subsysteme aktiv sind, die seit dem Linux-Kernel 3.13 enthalten sind.
Im Kernel wird lediglich eine allgemeine Schnittstelle bereitgestellt, die nicht von einem speziellen Protokoll abhängig ist und grundlegende Funktionen zur Datenextraktion aus Paketen, zur Durchführung von Datenoperationen und zur Flusskontrolle anbietet.
Die Filterlogik und die protokollspezifischen Handler werden im Benutzermodus in Bytecode kompiliert, der dann über die Netlink-Schnittstelle in den Kernel geladen und in einer speziellen virtuellen Maschine, ähnlich wie BPF (Berkeley Packet Filters), ausgeführt wird. Dieser Ansatz ermöglicht eine deutliche Reduzierung der Filtercodegröße, die im Kernel ausgeführt wird, und verlagert alle Funktionen zur Regelanalyse und zur Protokollverarbeitung in den Benutzermodus.
Hauptneuheiten:
- IPsec-Unterstützung, die die Zuordnung von Tunneladressen basierend auf dem Paket, der IPsec-Anforderungs-ID und dem SPI (Security Parameter Index) ermöglicht. Zum Beispiel,
… ipsec in ip saddr 192.168.1.0/24
… ipsec in spi 1-65536Es ist auch möglich, die Routenüberprüfung durch das IPsec-Tunnel durchzuführen. Zum Beispiel, um den Verkehr, der nicht über IPsec geht, zu blockieren:
… filter output rt ipsec missing drop
- Unterstützung des IGMP-Protokolls (Internet Group Management Protocol). Zum Beispiel, um eingehende IGMP-Mitgliedschaftsanfragen abzulehnen, kann folgende Regel verwendet werden:
nft add rule netdev foo bar igmp type membership-query counter drop
- Möglichkeit zur Verwendung von Variablen zur Definition von Sprungketten (jump / goto). Beispielsweise:
define dest = ber
add rule ip foo bar jump $dest - Unterstützung von Masken zur Identifizierung von Betriebssystemen (OS Fingerprint) basierend auf den TTL-Werten im Header. Zum Beispiel, um Pakete entsprechend dem Betriebssystem des Absenders zu markieren, kann der folgende Befehl verwendet werden:
… meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows" : 0x2,
"MacOS" : 0x3,
"unknown" : 0x0 }
… osf ttl skip version "Linux:4.20" - Möglichkeit zur Zuordnung der ARP-Adresse des Absenders zur IPv4-Adresse des Zielsystems. Zum Beispiel, um den Zähler für ARP-Pakete, die von der Adresse 192.168.2.1 gesendet werden, zu erhöhen, kann folgende Regel verwendet werden:
table arp x {
chain y {
Typfilter-Hook Eingangspriorität; Richtlinie akzeptieren;
arp saddr ip 192.168.2.1 Zähler Pakete 1 Bytes 46
}
} - Unterstützung für transparentes Durchleiten von Anfragen über Proxy (tproxy). Zum Beispiel, um Anfragen an Port 80 auf den Proxy-Port 8080 umzuleiten:
table ip x {
chain y {
Typfilter-Hook Prerouting Priorität -150; Richtlinie akzeptieren;
tcp dport 80 tproxy auf :8080
}
} - Unterstützung für die Markierung von Sockets mit der Möglichkeit, die gesetzte Markierung über setsockopt() im SO_MARK-Modus abzurufen. Zum Beispiel:
Tabelle inet x {
chain y {
Typfilter-Hook Prerouting Priorität -150; Richtlinie akzeptieren;
tcp dport 8080 mark set socket mark
}
} - Unterstützung für die Angabe von textuellen Bezeichnungen für Prioritäten in Chains. Zum Beispiel:
nft add chain ip x raw { typ filter hook prerouting priorität raw; }
nft add chain ip x filter { typ filter hook prerouting priorität filter; }
nft add chain ip x filter_later { typ filter hook prerouting priorität filter + 10; } - Unterstützung für SELinux-Tags (Secmark). Zum Beispiel, um das Tag 'sshtag' im Zusammenhang mit dem SELinux-Kontext zu definieren, können Sie ausführen:
nft add secmark inet filter sshtag 'system_u:object_r:ssh_server_packet_t:s0'
Und dann dieses Tag in Regeln verwenden:
nft add rule inet filter input tcp dport 22 meta secmark set 'sshtag'
nft add map inet filter secmapping { typ inet_service : secmark; }
nft add element inet filter secmapping { 22 : 'sshtag' }
nft add rule inet filter input meta secmark set tcp dport map @secmapping - Die Möglichkeit, Ports, die an Protokolle gebunden sind, textuell anzugeben, wie sie in der Datei /etc/services definiert sind. Zum Beispiel:
nft add rule x y tcp dport 'ssh'
nft list ruleset -l
Tabelle x {
chain y {
…
tcp dport «ssh»
}
} - Die Möglichkeit, den Typ des Netzwerk-Interfaces zu überprüfen. Zum Beispiel:
add rule inet raw prerouting meta iifkind «vrf» accept
- Verbesserte Unterstützung für die dynamische Aktualisierung von Inhaltssätzen (sets) durch explizite Angabe des Flags «dynamic». Zum Beispiel, um den Satz «s» durch Hinzufügen der Quelladresse zu aktualisieren und den Eintrag zurückzusetzen, wenn innerhalb von 30 Sekunden keine Pakete empfangen werden:
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 } - Die Möglichkeit, eine separate Bedingung für das Auslösen des Timeouts festzulegen. Zum Beispiel, um das standardmäßige Timeout für Pakete, die an Port 8888 empfangen werden, zu überschreiben, kann angegeben werden:
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»
}
} - Unterstützung von NAT für die Familie inet:
table inet nat {
…
ip6 daddr dead::2::1 dnat to dead:2::99
} - Verbesserte Fehlerausgabemöglichkeiten aufgrund von Tippfehlern:
nft add chain filtre test
Fehler: Datei oder Verzeichnis nicht gefunden; meinten Sie Tabelle «filter» in der Familie ip?
add chain filtre test
^^^^^^ - Die Möglichkeit, Schnittstellennamen in Sätzen (sets) anzugeben:
set sc {
type inet_service . ifname
elements = { «ssh» . «eth0» }
} - Der Syntax der flowtable-Regeln wurde aktualisiert:
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 - Verbesserte Unterstützung für JSON.
Quelle: opennet.ru
