Die Ausgabe des Paketfilters nftables 1.0.6 wurde veröffentlicht, der die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und netzwerkbridges vereinheitlicht (zielt darauf ab, iptables, ip6tables, arptables und ebtables zu ersetzen). Das Paket nftables enthält Komponenten des Paketfilters, die im Benutzermodus arbeiten, während im Kernel die nf_tables-Untersystem, die seit Version 3.13 Teil des Linux-Kernels ist, die Funktionalität bereitstellt. Im Kernel wird lediglich eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll ist und grundlegende Funktionen zum Extrahieren von Daten aus Paketen, zur Durchführung von Datenoperationen und zur Steuerung des Datenflusses 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.
Hauptänderungen:
- Im Regeloptimierer, der bei Angabe der Option „-o/—optimize“ aufgerufen wird, wurde eine automatische Regelverpackung durch deren Kombination und Umwandlung in map- und set-Listen eingerichtet. Zum Beispiel 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“ werden in folgender Weise 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, die bereits einfache Set-Listen verwenden, in eine kompaktere Form umwandeln, zum Beispiel 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 we originate, we trust» 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 wie folgt 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 into: 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 der Bytecode-Generierung zur Zusammenführung von Intervallen, in denen Typen mit unterschiedlicher Byte-Reihenfolge verwendet werden, zum Beispiel IPv4 (Netzwerk-Byte-Reihenfolge) und meta mark (systematische Byte-Reihenfolge), wurde gelöst. 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 } }
- Die Zuordnung seltener Protokolle bei der Verwendung von Raw-Ausdrücken wurde eingerichtet, zum Beispiel: meta l4proto 91 @th,400,16 0x0 accept
- Die Probleme beim Einfügen von Regeln mit Intervallen wurden gelöst: insert rule x y tcp sport { 3478-3497, 16384-16387 } counter accept
- Die JSON-API wurde verbessert, in der nun Unterstützung für Ausdrücke in Set- und Map-Listen verfügbar ist.
- In den Erweiterungen der Python-Bibliothek nftables ist das Laden von Regelsets zur Verarbeitung im Prüfbetrieb («-c») erlaubt worden, und es wurde Unterstützung für externe Variablenzuweisungen hinzugefügt.
- In den Elementen der Set-Listen ist das Hinzufügen von Kommentaren erlaubt.
- Bei der Byte-Ratelimitierung ist die Angabe eines Nullwerts erlaubt worden.
Quelle: opennet.ru
