Veröffentlichung des Paketfilters nftables 0.9.9

Die Veröffentlichung des Paketfilters nftables 0.9.9 wurde veröffentlicht, der die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (zielt darauf ab, iptables, ip6table, arptables und ebtables zu ersetzen). Gleichzeitig wurde die begleitende Bibliothek libnftnl 1.2.0 veröffentlicht, die eine Low-Level-API für die Interaktion mit dem nf_tables-System bereitstellt. Die für die Funktion des nftables 0.9.9 erforderlichen Änderungen sind im Linux-Kernel 5.13-rc1 enthalten.

Das Paket nftables umfasst Komponenten des Paketfilters, die im Benutzermodus arbeiten, während auf Kernel-Ebene das Subsystem nf_tables, das seit Version 3.13 Teil des Linux-Kernels ist, die Arbeit bereitstellt. Auf Kernel-Ebene wird nur eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll ist und grundlegende Funktionen zum Extrahieren von Daten aus Paketen, Ausführen von Datenoperationen und Steuern des Flusses bietet.

Die eigentlichen Filterregeln und protokollspezifischen Handler werden im Benutzermodus in Bytecode kompiliert, danach wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und dort in einem speziellen virtuellen Maschine, der an BPF (Berkeley Packet Filters) erinnert, ausgeführt. Dieser Ansatz ermöglicht es, die Größe des im Kernel arbeitenden Filtercodes erheblich zu reduzieren und alle Funktionen zur Regel-Parsing und zur Logik der Protokollverarbeitung in den Benutzermodus auszulagern.

Hauptneuheiten:

  • Die Möglichkeit, die Verarbeitung des Flowtable auf die Seite des Netzwerkadapters auszulagern, wurde implementiert, die mit dem Flag 'offload' aktiviert werden kann. Flowtable ist ein Mechanismus zur Optimierung des Paketweiterleitungswegs, bei dem die vollständige Durchlauf aller Regelverarbeitungsketten nur für das erste Paket angewendet wird, während alle anderen Pakete im Fluss direkt weitergeleitet werden. table ip global { flowtable f { hook ingress priority filter + 1 devices = { lan3, lan0, wan } flags offload } chain forward { type filter hook forward priority filter; policy accept; ip protocol { tcp, udp } flow add @f } chain post { type nat hook postrouting priority filter; policy accept; oifname «wan» masquerade } }
  • Die Unterstützung für das Anhängen einer Flagge an die Tabelle für die Bindung an einen Besitzer wurde hinzugefügt, die die exklusive Nutzung der Tabelle durch einen Prozess ermöglicht. Wenn der Prozess beendet wird, wird die an ihn gebundene Tabelle automatisch gelöscht. Informationen über den Prozess werden in der Regel-Dump als Kommentar angezeigt: table ip x { # progname nft flags owner chain y { type filter hook input priority filter; policy accept; counter packets 1 bytes 309 } }
  • Die Unterstützung für die Spezifikation IEEE 802.1ad (VLAN-Stapeln oder QinQ) wurde hinzugefügt, die Mittel zur Einspeisung mehrerer VLAN-Tags in einen Ethernet-Frame definiert. Zum Beispiel kann zur Überprüfung des Typs eines externen Ethernet-Frames 8021ad und vlan id=342 die Konstruktion … ether type 802.1ad vlan id 342 verwendet werden, um den externen Typ des Ethernet-Frames 8021ad/vlan id=1, das verschachtelte 802.1q/vlan id=2, sowie die weitere Einkapselung eines IP-Pakets zu überprüfen: … ether type 8021ad vlan id 1 vlan type 8021q vlan id 2 vlan type ip counter
  • Die Unterstützung für die Verwaltung von Ressourcen mit einer einheitlichen Hierarchie von cgroups v2 wurde hinzugefügt. Der Hauptunterschied zwischen cgroups v2 und v1 ist die Verwendung einer gemeinsamen cgroups-Hierarchie für alle Arten von Ressourcen, anstelle von separaten Hierarchien zur Verteilung von CPU-Ressourcen, zur Regulierung des Speicherverbrauchs und für Ein-/Ausgaben. Zum Beispiel kann zur Überprüfung, ob der Speicherort des Sockets auf der ersten Ebene der cgroupv2 der Maske „system.slice“ entspricht, die folgende Konstruktion verwendet werden: … socket cgroupv2 level 1 „system.slice“
  • Es wurde die Möglichkeit hinzugefügt, die Bestandteile von SCTP-Paketen zu überprüfen (die erforderliche Funktionalität wird in Kernel Linux 5.14 verfügbar sein). Zum Beispiel kann zur Überprüfung, ob im Paket ein Chunk vom Typ ‚data‘ und mit dem Feld ‘type’ vorhanden ist, Folgendes angegeben werden: … sctp chunk data exists … sctp chunk data type 0
  • Die Ausführung der Regel-Bereitstellung mit dem Flag „-f“ wurde ungefähr halbiert. Auch die Ausgabe der Regel-Liste wurde beschleunigt.
  • Es wurde eine kompakte Form zur Überprüfung von gesetzten Bits in Flags bereitgestellt. Zum Beispiel kann zur Überprüfung, dass die Statusbits snat und dnat nicht gesetzt sind, Folgendes angegeben werden: … ct status ! snat,dnat für die Überprüfung, dass das SYN-Bit in der Bitmaske syn,ack gesetzt ist: … tcp flags syn / syn,ack für die Überprüfung, dass die Bits fin und rst in der Bitmaske syn,ack,fin,rst nicht gesetzt sind: … tcp flags != fin,rst / syn,ack,fin,rst
  • Es wurde die Verwendung des Schlüsselworts „verdict“ in den Definitionen von typeof für set/map erlaubt: add map x m { typeof iifname . ip protocol . th dport : verdict; }

Quelle: opennet.ru

60GB SSD 8Gb DDR4