Die Version 1.0.6 des Paketfilters nftables wurde veröffentlicht, der die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (geplant als Ersatz für iptables, ip6tables, arptables und ebtables). Das Paket nftables enthält Komponenten des Paketfilters, die im Benutzermodus arbeiten, während der Kernel-Level von der nf_tables-Subsystem bereitgestellt wird, das seit Version 3.13 Teil des Linux-Kernels ist. Auf der Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die nicht von einem bestimmten Protokoll abhängt und grundlegende Funktionen zum Extrahieren von Daten aus Paketen, zum Ausführen von Datenoperationen und zur Steuerung 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:
- Im Regeloptimierer, der bei der Angabe der Option «-o/—optimize» aufgerufen wird, ist eine automatische Regelverpackung durch deren Zusammenführung und Umwandlung in Map- und Set-Listen implementiert. Zum Beispiel werden die Regeln # cat ruleset.nft table ip x { chain y { type filter hook input priority filter; policy drop; meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept } } nach der Ausführung von «nft -o -c -f ruleset.nft» wie folgt umgewandelt: ruleset.nft:4:17-74: meta iifname eth1 ip saddr 1.1.1.1 ip daddr 2.2.2.3 accept ruleset.nft:5:17-74: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.2.4 accept ruleset.nft:6:17-77: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.3.0/24 accept ruleset.nft:7:17-83: meta iifname eth1 ip saddr 1.1.1.2 ip daddr 2.2.4.0-2.2.4.10 accept ruleset.nft:8:17-74: meta iifname eth2 ip saddr 1.1.1.3 ip daddr 2.2.2.5 accept in: iifname . ip saddr . ip daddr { eth1 . 1.1.1.1 . 2.2.2.3, eth1 . 1.1.1.2 . 2.2.2.4, eth1 . 1.1.1.2 . 2.2.3.0/24, eth1 . 1.1.1.2 . 2.2.4.0-2.2.4.10, eth2 . 1.1.1.3 . 2.2.2.5 } accept
- Der Optimierer kann auch Regeln in eine kompaktere Form umwandeln, wenn bereits einfache Set-Listen verwendet werden, wie zum Beispiel die Regeln: # cat ruleset.nft table ip filter { chain input { type filter hook input priority filter; policy drop; iifname "lo" accept ct state established,related accept comment "In Traffic, dem wir vertrauen" iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept } } Nach der Ausführung von "nft -o -c -f ruleset.nft" werden sie folgendermaßen verpackt: ruleset.nft:6:22-149: iifname "enp0s31f6" ip saddr { 209.115.181.102, 216.197.228.230 } ip daddr 10.0.0.149 udp sport 123 udp dport 32768-65535 accept ruleset.nft:7:22-143: iifname "enp0s31f6" ip saddr { 64.59.144.17, 64.59.150.133 } ip daddr 10.0.0.149 udp sport 53 udp dport 32768-65535 accept in: iifname . ip saddr . ip daddr . udp sport . udp dport { enp0s31f6 . 209.115.181.102 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 216.197.228.230 . 10.0.0.149 . 123 . 32768-65535, enp0s31f6 . 64.59.144.17 . 10.0.0.149 . 53 . 32768-65535, enp0s31f6 . 64.59.150.133 . 10.0.0.149 . 53 . 32768-65535 } accept
- Das Problem mit der Generierung von Bytecode zur Fusion von Intervallen, in denen Typen mit unterschiedlicher Byte-Reihenfolge verwendet werden, wie z.B. IPv4 (Netzwerk-Byte-Reihenfolge) und meta mark (System-Byte-Reihenfolge), wurde behoben. table ip x { map w { typeof ip saddr . meta mark : verdict flags interval counter elements = { 127.0.0.1-127.0.0.4 . 0x123434-0xb00122 : accept, 192.168.0.10-192.168.1.20 . 0x0000aa00-0x0000aaff : accept, } } chain k { type filter hook input priority filter; policy drop; ip saddr . meta mark vmap @w } }
- Es wurde eine Zuordnung seltener Protokolle unter Verwendung von Roh-Ausdrücken ermöglicht, z.B.: meta l4proto 91 @th,400,16 0x0 accept
- Probleme mit der Aktivierung von Regeln mit Intervallen wurden behoben: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Die JSON-API wurde verbessert, welche die Unterstützung von Ausdrücken in set- und map-Listen bietet.
- In den Erweiterungen der Python-Bibliothek nftables wurde das Hochladen von Regelsets für die Verarbeitung im Prüfmodus („-c“) ermöglicht und die Unterstützung für externe Variablendefinitionen hinzugefügt.
- In Elementen von set-Listen konnte das Hinzufügen von Kommentaren erlaubt werden.
- In der Byte-Ratelimitierung wurde die Angabe eines Nullwerts ermöglicht.
Quelle: opennet.ru
