Veröffentlichung des Paketfilters nftables 1.0.3

Die Veröffentlichung der Paketfilter-Version nftables 1.0.3 wurde angekündigt, die die Filterinterfaces für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (zielt darauf ab, iptables, ip6tables, arptables und ebtables zu ersetzen). Die für die Funktion der Version nftables 1.0.3 erforderlichen Änderungen sind in den Linux-Kernel 5.18 integriert.

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:

  • In set-Listen wurde die Unterstützung für die Zuordnung von Namen von Netzwerkinterfaces durch eine Maske, zum Beispiel unter Verwendung des Symbols „*“: table inet testifsets { set simple_wild { type ifname flags interval elements = { „abcdef*“, „othername“, „ppp0“ } } chain v4icmp { type filter hook input priority 0; policy accept; iifname @simple_wild counter packets 0 bytes 0 iifname { „abcdef*“, „eth0“ } counter packets 0 bytes 0 } }
  • Die automatische Zusammenführung von sich überschneidenden Elementen der set-Listen während des Betriebs wurde implementiert. Früher wurde beim Setzen der Option „auto-merge“ die Zusammenführung in der Regeldeklarationsphase durchgeführt, nun erfolgt dies auch bei inkrementellem Hinzufügen neuer Elemente während des Betriebs. Zum Beispiel wird in der Deklarationsphase die Liste set y { flags interval auto-merge elements = { 1.2.3.0, 1.2.3.255, 1.2.3.0/24, 3.3.3.3, 4.4.4.4, 4.4.4.4-4.4.4.8, 3.3.3.4, 3.3.3.5 } } in elements = { 1.2.3.0/24, 3.3.3.3-3.3.3.5, 4.4.4.4-4.4.4.8 } umgewandelt, und wenn neue Elemente hinzugefügt werden # nft add element ip x y { 1.2.3.0-1.2.4.255, 3.3.3.6 } wird das Element zu elements = { 1.2.3.0-1.2.4.255, 3.3.3.3-3.3.3.6, 4.4.4.4-4.4.4.8 }.

    Beim Entfernen einzelner Elemente aus einer Liste, die in bestehende Elemente mit Bereichen fallen, wird der Bereich verkürzt oder aufgeteilt.

  • In den Regelnoptimierer, der bei Angabe der Option „-o/—optimize“ aufgerufen wird, wurde die Unterstützung für die Zusammenführung mehrerer NAT-Regeln in eine map-Liste hinzugefügt. Zum Beispiel für die Gruppe # cat ruleset.nft table ip x { chain y { type nat hook postrouting priority srcnat; policy drop; ip saddr 1.1.1.1 tcp dport 8000 snat to 4.4.4.4:80 ip saddr 2.2.2.2 tcp dport 8001 snat to 5.5.5.5:90 } }

    Die Ausführung von „nft -o -c -f ruleset.nft“ führt zur Umwandlung einzelner „ip saddr“-Regeln in eine map-Liste: snat to ip saddr . tcp dport map { 1.1.1.1 . 8000 : 4.4.4.4 . 80, 2.2.2.2 . 8001 : 5.5.5.5 . 90 }.

    Ähnlich können auch raw-Ausdrücke in map-Listen umgewandelt werden: # cat ruleset.nft table ip x { […] chain nat_dns_acme { udp length 47-63 @th,160,128 0x0e373135363130333131303735353203 goto nat_dns_dnstc udp length 62-78 @th,160,128 0x0e31393032383939353831343037320e goto nat_dns_this_5301 udp length 62-78 @th,160,128 0x0e31363436323733373931323934300e goto nat_dns_saturn_5301 udp length 62-78 @th,160,128 0x0e32393535373539353636383732310e goto nat_dns_saturn_5302 udp length 62-78 @th,160,128 0x0e38353439353637323038363633390e goto nat_dns_saturn_5303 drop } }

    Nach der Optimierung erhalten wir die map-Liste: udp length . @th,160,128 vmap { 47-63 . 0x0e373135363130333131303735353203 : goto nat_dns_dnstc, 62-78 . 0x0e31393032383939353831343037320e : goto nat_dns_this_5301, 62-78 . 0x0e31363436323733373931323934300e : goto nat_dns_saturn_5301, 62-78 . 0x0e32393535373539353636383732310e : goto nat_dns_saturn_5302, 62-78 . 0x0e38353439353637323038363633390e : goto nat_dns_saturn_5303 }

  • Die Verwendung von raw-Ausdrücken in Verkettungsoperationen ist erlaubt. Zum Beispiel: # nft add rule x y ip saddr . @ih,32,32 { 1.1.1.1 . 0x14, 2.2.2.2 . 0x1e } oder table x { set y { typeof ip saddr . @ih,32,32 elements = { 1.1.1.1 . 0x14 } } }
  • Die Unterstützung für die Angabe von Ganzzahlfeldern in den Kopfzeilen bei Verkettungsoperationen wurde hinzugefügt: table inet t { map m1 { typeof udp length . @ih,32,32 : verdict flags interval elements = { 20-80 . 0x14 : accept, 1-10 . 0xa : drop } } chain c { type filter hook input priority 0; policy drop; udp length . @ih,32,32 vmap @m1 } }
  • Die Unterstützung für das Zurücksetzen von TCP-Optionen wurde hinzugefügt (funktioniert nur mit Linux-Kern 5.18+): tcp flags syn reset tcp option sack-perm
  • Die Ausführung der Befehle zum Auflisten der Ketten („nft list chain x y“) wurde beschleunigt.

Quelle: opennet.ru

60GB SSD 8Gb DDR4