Die Kernel-Ebene stellt lediglich eine generische protokollunabhängige Schnittstelle bereit, die grundlegende Funktionen zum Extrahieren von Daten aus Paketen, zum Durchführen von Datenoperationen und zur Flusskontrolle bereitstellt. Die Filterregeln und protokollspezifischen Handler werden im Userspace in Bytecode kompiliert, woraufhin dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und im Kernel in einer speziellen virtuellen Maschine ausgeführt wird, die an BPF (Berkeley Packet Filters) erinnert. Mit diesem Ansatz können Sie die Größe des auf Kernelebene ausgeführten Filtercodes erheblich reduzieren und alle Funktionen der Analyseregeln und Logik für die Arbeit mit Protokollen in den Benutzerbereich verschieben.
Wichtigste Neuerungen:
- Unterstützung für Bereiche in Verbindungen (Verkettung, bestimmte Bündel von Adressen und Ports, die den Vergleich vereinfachen). Beispielsweise zeigt die Angabe des „Intervall“-Flags für einen Satz „Whitelist“, dessen Elemente ein Anhang sind, an, dass der Satz Bereiche im Anhang enthalten kann (für den Anhang „ipv4_addr . ipv4_addr . inet_service“ war es bisher möglich, genaue Listen aufzulisten Übereinstimmungen der Form „192.168.10.35. 192.68.11.123“, und jetzt können Sie Adressgruppen „80-192.168.10.35-192.168.10.40“ angeben:
Tisch-IP foo {
Whitelist festlegen {
Geben Sie ipv4_addr ein. ipv4_addr. inet_service
Flags-Intervall
Elemente = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125. 80}
}Kettenschiene {
Typ-Filter-Hook-Pre-Routing-Prioritätsfilter; Politikabfall;
ip saddr. IP Daddr. TCP-Dport @whitelist akzeptieren
}
} - In Sets und Map-Listen ist es möglich, die „typeof“-Direktive zu verwenden, die beim Matching das Format des Elements bestimmt.
Zum Beispiel:Tisch-IP foo {
Whitelist festlegen {
Art der IP-Adresse
Elemente = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}Kettenschiene {
Typ-Filter-Hook-Pre-Routing-Prioritätsfilter; Politikabfall;
ip daddr @whitelist akzeptieren
}
}Tisch-IP foo {
Kartenadresse2mark {
Art der IP-Adresse: Metamarke
Elemente = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - Es wurde die Möglichkeit hinzugefügt, Joins in NAT-Bindungen zu verwenden, wodurch Sie eine Adresse und einen Port angeben können, wenn Sie NAT-Transformationen basierend auf Zuordnungslisten oder benannten Mengen definieren:
NFT-Regel hinzufügen IP nat pre dnat ip addr . Port-zu-IP-Saddr-Karte {1.1.1.1: 2.2.2.2. dreißig }
NFT Map IP NAT Destinations hinzufügen { Geben Sie ipv4_addr ein. inet_service: ipv4_addr. inet_service \\; }
NFT-Regel hinzufügen IP nat pre dnat ip addr . Port zu IP-Saddr. TCP-Port-Karte @destinations - Unterstützung für Hardwarebeschleunigung mit einigen Filtervorgängen, die von der Netzwerkkarte ausgeführt werden. Die Beschleunigung wird über das Dienstprogramm ethtool („ethtool -K eth0 hw-tc-offload on“) aktiviert und anschließend in nftables für die Hauptkette mithilfe des Flags „offload“ aktiviert. Bei Verwendung des Linux-Kernels 5.6 wird Hardwarebeschleunigung für den Header-Feldabgleich und die Inspektion eingehender Schnittstellen in Kombination mit dem Empfangen, Verwerfen, Duplizieren (dup) und Weiterleiten (fwd) von Paketen unterstützt. Im folgenden Beispiel werden die Vorgänge zum Verwerfen von Paketen, die von der Adresse 192.168.30.20 kommen, auf der Ebene der Netzwerkkarte ausgeführt, ohne dass die Pakete an den Kernel weitergeleitet werden:
# cat-Datei.nft
Tabelle netdev x {
Kette y {
Typ Filter Hook Ingress Device ETH0 Priority 10; Flaggen entladen;
IP Saddr 192.168.30.20 Drop
}
}
# nft -f file.nft - Verbesserte Informationen über den Ort eines Fehlers in den Regeln.
# NFT-Löschregel IP YZ-Handle 7
Fehler: Regel konnte nicht verarbeitet werden: Keine solche Datei oder kein solches Verzeichnis
Regel löschen IP-YZ-Handle 7
^# NFT-Löschregel IP xx Handle 7
Fehler: Regel konnte nicht verarbeitet werden: Keine solche Datei oder kein solches Verzeichnis
Regel löschen IP xx Handle 7
^# NFT-Löschtabelle Twst
Fehler: Keine solche Datei oder kein solches Verzeichnis; Meinten Sie die Tabelle „Test“ in der Familien-IP?
Tabelle twst löschen
^^^^Das erste Beispiel zeigt, dass die Tabelle „y“ nicht im System vorhanden ist, das zweite, dass der Handler „7“ fehlt, und das dritte, dass bei der Eingabe des Tabellennamens eine Tippfehleraufforderung angezeigt wird.
- Unterstützung für die Überprüfung der Slave-Schnittstelle durch Angabe von „meta sdif“ oder „meta sdifname“ hinzugefügt:
... meta sdifname vrf1 ...
- Unterstützung für Rechts- oder Linksschaltvorgänge hinzugefügt. Um beispielsweise ein vorhandenes Paketetikett um 1 Bit nach links zu verschieben und das Nebenbit auf 1 zu setzen:
… Metamarke gesetzt Metamarke lshift 1 oder 0x1 …
- Option „-V“ implementiert, um erweiterte Versionsinformationen anzuzeigen.
# nft -V
nftables v0.9.4 (Jive at Five)
cli:readline
json: ja
minigmp: nein
libxtables: ja - Befehlszeilenoptionen müssen jetzt vor Befehlen angegeben werden. Sie müssen beispielsweise „nft -a list Ruleset“ angeben, aber die Ausführung von „nft list Ruleset -a“ führt zu einem Fehler.
Source: opennet.ru