Die Veröffentlichung der Paketfilter-Version nftables 1.0.7 wurde bekannt gegeben, die die Schnittstellen für die Paketfilterung von IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (zielt darauf ab, iptables, ip6tables, arptables und ebtables zu ersetzen). Im Paket nftables sind Komponenten des Paketfilters enthalten, die im Benutzermodus arbeiten, während im Kernel die nf_tables-Subsystem die Funktionalität bereitstellt, die seit der Version 3.13 des Linux-Kernels Teil ist. Auf Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll ist und grundlegende Funktionen zum Extrahieren von Daten aus Paketen, Ausführen von Operationen mit Daten und Steuern des Datenflusses bietet.
Die Filterregeln und protokollspezifischen Handler werden im Benutzermodus in Bytecode kompiliert, der anschließend über die Netlink-Schnittstelle in den Kernel geladen und dort in einem speziellen Kontext ausgeführt wird. virtuellen Maschine, die BPF (Berkeley Packet Filter) ähnelt. Dieser Ansatz ermöglicht eine signifikante Reduzierung der Größe des Filtercodes, der auf Kernel-Ebene arbeitet, und verlagert alle Funktionen zur Regelparserung und Logikbearbeitung von Protokollen in den Benutzermodus.
Wesentliche Änderungen:
- Für Systeme mit dem Linux-Kernel 6.2+ wurde die Unterstützung für die Protokollzuordnung von vxlan, geneve, gre und gretap hinzugefügt, wodurch einfache Ausdrücke zur Überprüfung von Headern in gekapselten Paketen verwendet werden können. Zum Beispiel, um zu überprüfen, IP-Adressen im Header eines gekapselten Pakets von VxLAN kann nun eine Regel verwendet werden (ohne dass eine vorherige Deinkapsulierung des VxLAN-Headers und das Binden des Filters an die Schnittstelle vxlan0 erforderlich sind): … udp dport 4789 vxlan ip protocol udp … udp dport 4789 vxlan ip saddr 1.2.3.0/24 … udp dport 4789 vxlan ip saddr . vxlan ip daddr { 1.2.3.4 . 4.3.2.1 }
- Die Unterstützung für die automatische Zusammenführung von Resten nach der teilweisen Löschung eines Elements in einer Set-Liste wurde implementiert. Dies ermöglicht das Entfernen eines Elements oder eines Teils eines Bereichs aus einem bestehenden Bereich (zuvor konnte der Bereich nur vollständig gelöscht werden). Zum Beispiel, nach der Löschung des Elements 25 aus der Set-Liste mit den Bereichen 24-30 und 40-50 bleiben in der Liste 24, 26-30 und 40-50 übrig. Die notwendigen Korrekturen für die Funktion der automatischen Zusammenführung werden in den stabilen Korrekturversionen der Kernversionen 5.10+ angeboten. # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24-30, 40-50 } } } # nft delete element ip x y { 25 } # nft list ruleset table ip x { set y { typeof tcp dport flags interval auto-merge elements = { 24, 26-30, 40-50 } } }
- Die Verwendung von Kontaktierung und Bereichen beim Mapping von Adressübersetzungen (NAT) ist erlaubt. table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; dnat to ip daddr . tcp dport map { 10.1.1.136 . 80 : 1.1.2.69 . 1024, 10.1.1.10-10.1.1.20 . 8888-8889 : 1.1.2.69 . 2048-2049 } persistent } }
- Die Unterstützung des Ausdrucks „last“ wurde hinzugefügt, der es ermöglicht, die letzte Verwendung eines Elements einer Regel oder eines Set-Listen einzusehen. Diese Funktion wird ab Kernel-Version 5.14 unterstützt. table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h } chain z { type filter hook output priority filter; policy accept; update @y { ip daddr . tcp dport } } } # nft list set ip x y table ip x { set y { typeof ip daddr . tcp dport size 65535 flags dynamic,timeout last timeout 1h elements = { 172.217.17.14 . 443 zuletzt verwendet 1s591ms timeout 1h läuft ab in 59m58s409ms, 172.67.69.19 . 443 zuletzt verwendet 4s636ms timeout 1h läuft ab in 59m55s364ms, 142.250.201.72 . 443 zuletzt verwendet 4s748ms timeout 1h läuft ab in 59m55s252ms, 172.67.70.134 . 443 zuletzt verwendet 4s688ms timeout 1h läuft ab in 59m55s312ms, 35.241.9.150 . 443 zuletzt verwendet 5s204ms timeout 1h läuft ab in 59m54s796ms, 138.201.122.174 . 443 zuletzt verwendet 4s537ms timeout 1h läuft ab in 59m55s463ms, 34.160.144.191 . 443 zuletzt verwendet 5s205ms timeout 1h läuft ab in 59m54s795ms, 130.211.23.194 . 443 zuletzt verwendet 4s436ms timeout 1h läuft ab in 59m55s564ms } } }
- Die Möglichkeit zur Festlegung von Quoten in Set-Listen wurde hinzugefügt. Um beispielsweise eine Traffic-Quote für jede Ziel-IP-Adresse festzulegen, können Sie Folgendes angeben: table netdev x { set y { typeof ip daddr size 65535 quota over 10000 mbytes } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } } # nft add element inet x y { 8.8.8.8 } # ping -c 2 8.8.8.8 # nft list ruleset table netdev x { set y { type ipv4_addr size 65535 quota over 10000 mbytes elements = { 8.8.8.8 quota over 10000 mbytes used 196 bytes } } chain y { type filter hook egress device «eth0» priority filter; policy accept; ip daddr @y drop } }
- Die Verwendung von Konstanten in Set-Listen ist jetzt erlaubt. Wenn Sie beispielsweise die Zieladresse und die VLAN-ID als Schlüssel in der Liste verwenden, können Sie die VLAN-Nummer direkt angeben (daddr . 123): table netdev t { set s { typeof ether saddr . vlan id size 2048 flags dynamic,timeout timeout 1m } chain c { type filter hook ingress device eth0 priority 0; policy accept; ether type != 8021q update @s { ether daddr . 123 } counter } }
- Ein neues Kommando „destroy“ wurde hinzugefügt, um Objekte ohne Vorbehalt zu löschen (im Gegensatz zum Befehl delete generiert es keinen ENOENT-Fehler beim Versuch, ein nicht vorhandenes Objekt zu löschen). Ein Mindestkern von Linux 6.3-rc wird benötigt. destroy table ip filter
Quelle: opennet.ru
