Veröffentlichung des Paketfilters , das sich als Ersatz für iptables, ip6tables, arptables und ebtables entwickelt, indem es die Filterinterfaces für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht. Das Paket nftables umfasst Komponenten des Paketfilters, die im Benutzerspace arbeiten, während auf Kernel-Ebene das nf_tables-Subsystem, das seit der Veröffentlichung 3.13 Bestandteil des Linux-Kernels ist, die Arbeit übernimmt. Die notwendigen Änderungen für die Funktion der Veröffentlichung nftables 0.9.4 sind in den zukünftigen Kernel-Zweig aufgenommen. .
Auf Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die unabhängig von einem bestimmten Protokoll ist und grundlegende Funktionen für das Extrahieren von Daten aus Paketen, das Ausführen von Datenoperationen und das Verwalten von Datenströmen bietet. Die eigentlichen Filterregeln und protokollspezifischen Handler werden in Bytecode im Benutzermodus kompiliert, anschließend wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und dort in einer speziellen virtuellen Maschine ausgeführt, die an BPF (Berkeley Packet Filters) erinnert. Dieser Ansatz ermöglicht eine signifikante Reduzierung der Größe des auf Kernel-Ebene arbeitenden Filtercodes und verlagert alle Funktionen zur Regelparsing und Logik für die Protokollbearbeitung in den Benutzermodus.
Hauptneuheiten:
- Unterstützung von Bereichen in Verbindungen (Konkatenation, bestimmte Adress- und Portbindungen, die die Zuordnung vereinfachen). Beispielsweise kann für eine Sammlung namens „whitelist“, deren Elemente eine Verbindung darstellen, das Setzen des Flags „interval“ anzeigen, dass die Sammlung Bereiche in der Verbindung umfassen kann (bei der Verbindung „ipv4_addr . ipv4_addr . inet_service“ konnten früher präzise Übereinstimmungen wie „192.168.10.35 . 192.68.11.123 . 80“ aufgelistet werden, und jetzt können Adressgruppen wie „192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80“ angegeben werden):
table ip foo {
set whitelist {
type ipv4_addr . ipv4_addr . inet_service
flags interval
elements = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip saddr . ip daddr . tcp dport @whitelist accept
}
} - In Mengen und Map-Listen wurde die Möglichkeit zur Nutzung der Direktive „typeof“ implementiert, die das Format des Elements bei der Zuordnung definiert.
Zum Beispiel:table ip foo {
set whitelist {
typeof ip saddr
elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}chain bar {
type filter hook prerouting priority filter; policy drop;
ip daddr @whitelist accept
}
}table ip foo {
map addr2mark {
typeof ip saddr : meta mark
elements = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Die Möglichkeit zur Nutzung von Verbindungen in NAT-Bindungen wurde hinzugefügt, wodurch Adressen und Ports bei der Definition von NAT-Transformationen basierend auf Map-Listen oder benannten Mengen angegeben werden können:
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \\; }
nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations - Hardwarebeschleunigung unterstützt die Auslagerung bestimmter Filteroperationen auf die Netzwerkkarte. Die Beschleunigung wird über das Dienstprogramm ethtool aktiviert („ethtool -K eth0 hw-tc-offload on“), wonach sie in nftables für die Hauptkette mit dem Flag „offload“ aktiviert wird. Bei Verwendung des Linux-Kernels 5.6 wird Hardwarebeschleunigung für die Header-Feldabgleichung und Überprüfung der eingehenden Schnittstelle in Verbindung mit dem Empfangen, Verwerfen, Duplizieren (dup) und Weiterleiten (fwd) von Paketen unterstützt. Im folgenden Beispiel werden die Verwerfungsoperationen für Pakete, die von der Adresse 192.168.30.20 kommen, auf der Ebene der Netzwerkkarte ausgeführt, ohne dass Pakete an den Kernel übergeben werden:
# cat file.nft
table netdev x {
chain y {
type filter hook ingress device eth0 priority 10; flags offload;
ip saddr 192.168.30.20 drop
}
}
# nft -f file.nft - Die Fehlermeldung über den Fehlerort in den Regeln wurde verbessert.
# nft delete rule ip y z handle 7
Error: Regel konnte nicht verarbeitet werden: Datei oder Verzeichnis nicht gefunden
delete rule ip y z handle 7
^# nft delete rule ip x x handle 7
Error: Regel konnte nicht verarbeitet werden: Datei oder Verzeichnis nicht gefunden
delete rule ip x x handle 7
^# nft delete table twst
Error: Datei oder Verzeichnis nicht gefunden; meinten Sie möglicherweise Tabelle ‚test‘ in der Familie ip?
delete table twst
^^^^Im ersten Beispiel wird angezeigt, dass die Tabelle „y“ im System fehlt, im zweiten, dass der Handler „7“ fehlt, und im dritten, dass eine Fehlermeldung beim Eingeben des Tabellennamens ausgegeben wird.
- Die Unterstützung für die Überprüfung des Slave-Interfaces wurde durch die Angabe von „meta sdif“ oder „meta sdifname“ hinzugefügt:
… meta sdifname vrf1 …
- Die Unterstützung für die Verschiebeoperation nach rechts oder links wurde hinzugefügt. Zum Beispiel, um das bestehende Paketlabel um 1 Bit nach links zu verschieben und das niedrigste Bit auf 1 zu setzen:
… meta mark set meta mark lshift 1 or 0x1 …
- Die Option „-V“ zur Anzeige erweiterten Versionsinformationen wurde implementiert.
# nft -V
nftables v0.9.4 (Jive at Five)
cli: readline
json: ja
minigmp: nein
libxtables: ja - Die Optionen der Befehlszeile müssen nun unbedingt vor den Kommandos angegeben werden. Zum Beispiel muss „nft -a list ruleset“ angegeben werden, während der Aufruf „nft list ruleset -a“ zu einer Fehlermeldung führen wird.
Quelle: opennet.ru
