Veröffentlichung des Paketfilters nftables 1.0.7

Die Veröffentlichung der Paketfilterversion nftables 1.0.7 wurde bekannt gegeben, die die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (zielgerichtet als Ersatz für iptables, ip6tables, arptables und ebtables). Im Paket nftables sind Komponenten des Paketfilters enthalten, die im Benutzerspeicher arbeiten, während auf Kernel-Ebene das Subsystem nf_tables, das seit Version 3.13 Teil des Linux-Kernels ist, die Aufgaben übernimmt. Auf Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die nicht vom speziellen Protokoll abhängt und grundlegende Funktionen zur Extraktion von Daten aus Paketen, zur Durchführung von Datenoperationen und zur Steuerung des Datenflusses bereitstellt.

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:

  • 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, was es ermöglicht, einfache Ausdrücke zur Überprüfung von Headers in gekapselten Paketen zu verwenden. Zum Beispiel zur Überprüfung IP-Adressen im Header eines verschachtelten Pakets aus VxLAN können jetzt Regeln verwendet werden (ohne dass eine vorherige Dekapselung des VxLAN-Headers und die Bindung des Filters an das Interface 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 }
  • Es wurde die Unterstützung für die automatische Fusion von Resten nach der teilweisen Löschung eines Set-Elements implementiert, was das Entfernen eines Elements oder eines Teils eines Bereichs aus einem bestehenden Bereich ermöglicht (früher konnte der Bereich nur vollständig entfernt werden). Zum Beispiel bleiben nach der Löschung des Elements 25 aus dem Set-Bereich mit den Bereichen 24-30 und 40-50 die Elemente 24, 26-30 und 40-50 übrig. Die Korrekturen, die für den Betrieb der automatischen Fusion erforderlich sind, werden in Restversionen stabiler Kernzweige ab 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 Kontaktadressen und Bereichen bei der Zuordnung von Netzwerkadressübersetzung (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, mit dem die Zeit der letzten Verwendung eines Regel- oder Set-Elements ermittelt werden kann. Diese Möglichkeit wird ab dem Linux-Kernel 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 last used 1s591ms timeout 1h expires 59m58s409ms, 172.67.69.19 . 443 last used 4s636ms timeout 1h expires 59m55s364ms, 142.250.201.72 . 443 last used 4s748ms timeout 1h expires 59m55s252ms, 172.67.70.134 . 443 last used 4s688ms timeout 1h expires 59m55s312ms, 35.241.9.150 . 443 last used 5s204ms timeout 1h expires 59m54s796ms, 138.201.122.174 . 443 last used 4s537ms timeout 1h expires 59m55s463ms, 34.160.144.191 . 443 last used 5s205ms timeout 1h expires 59m54s795ms, 130.211.23.194 . 443 last used 4s436ms timeout 1h expires 59m55s564ms } } }
  • Die Möglichkeit, Quoten in Set-Listen zu definieren, wurde hinzugefügt. Um beispielsweise eine Quote für den Datenverkehr für jede Ziel-IP-Adresse festzulegen, kann Folgendes angegeben werden: 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 erlaubt. Wenn zum Beispiel die Zieladresse und die VLAN-ID als Schlüssel verwendet werden, kann die VLAN-Nummer direkt angegeben werden (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 neuer Befehl „destroy“ wurde hinzugefügt, der eine unwiderrufliche Löschung von Objekten ermöglicht (im Gegensatz zum Befehl delete generiert er bei dem Versuch, ein nicht vorhandenes Objekt zu löschen, keinen ENOENT-Fehler). Für die Verwendung wird mindestens der Linux-Kernel 6.3-rc benötigt. destroy table ip filter

Quelle: opennet.ru

60GB SSD 8Gb DDR4