nftables-Paketfilter 1.0.0-Version

Die Veröffentlichung des Paketfilters nftables 1.0.0 wurde veröffentlicht, der Paketfilterungsschnittstellen für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht (mit dem Ziel, iptables, ip6table, arptables und ebtables zu ersetzen). Die Änderungen, die erforderlich sind, damit die Version nftables 1.0.0 funktioniert, sind im Linux 5.13-Kernel enthalten. Eine wesentliche Änderung der Versionsnummer ist nicht mit grundsätzlichen Änderungen verbunden, sondern lediglich eine Folge der konsequenten Fortführung der Nummerierung in Dezimalschreibweise (Vorgängerversion war 0.9.9).

Das nftables-Paket enthält Paketfilterkomponenten, die im Benutzerbereich ausgeführt werden, während die Arbeit auf Kernelebene vom Subsystem nf_tables bereitgestellt wird, das seit Version 3.13 Teil des Linux-Kernels ist. Die Kernel-Ebene stellt nur eine generische protokollunabhängige Schnittstelle bereit, die grundlegende Funktionen zum Extrahieren von Daten aus Paketen, zum Durchführen von Datenoperationen und zur Flusskontrolle bereitstellt.

Die Filterregeln selbst und protokollspezifische Handler werden in User-Space-Bytecode kompiliert. Anschließend wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und im Kernel in einer speziellen virtuellen Maschine ausgeführt, die BPF (Berkeley Packet Filters) ähnelt. Dieser Ansatz ermöglicht es, die Größe des auf Kernelebene ausgeführten Filtercodes erheblich zu reduzieren und alle Funktionen der Parsing-Regeln und die Logik der Arbeit mit Protokollen in den Benutzerbereich zu verlagern.

Wichtigste Neuerungen:

  • Den Set-Listen wurde Unterstützung für das Maskenelement „*“ hinzugefügt, das für alle Pakete ausgelöst wird, die nicht unter andere im Set definierte Elemente fallen. Tabelle x { Map Blocklist { Typ ipv4_addr: Verdict Flags Intervallelemente = { 192.168.0.0/16: Akzeptieren, 10.0.0.0/8: Akzeptieren, *: Löschen } } Kette y { Typ Filter Hook Prerouting Priority 0; Politik akzeptieren; ip saddr vmap @blocklist } }
  • Es ist möglich, Variablen über die Befehlszeile mit der Option „--define“ zu definieren. # cat test.nft Tabelle netdev x { Kette y { Typ Filter Hook Ingress Devices = $dev Priority 0; Politikabfall; } } # nft –define dev="{ eth0, eth1 }" -f test.nft
  • In Map-Listen ist die Verwendung von konstanten (zustandsbehafteten) Ausdrücken erlaubt: Tabelle inet Filter { Map Portmap { Typ inet_service: Urteil Zählerelemente = { 22 Zählerpakete 0 Bytes 0: Sprung ssh_input, * Zählerpakete 0 Bytes 0: Drop } } Chain ssh_input { } Chain wan_input { tcp dport vmap @portmap } Chain Prerouting { Typ Filter Hook Prerouting Priority Raw; Politik akzeptieren; iif vmap { "lo" : jump wan_input } } }
  • Befehl „list Hooks“ hinzugefügt, um eine Liste von Handlern für eine bestimmte Paketfamilie anzuzeigen: # nft list Hooks IP Device Eth0 Family IP { Hook Ingress { +0000000010 Chain Netdev xy [nf_tables] +0000000300 Chain Inet MW [nf_tables] } Hook Input { -0000000100 Kette ip ab [nf_tables] +0000000300 Kette inet mz [nf_tables] } Hook Forward { -0000000225 selinux_ipv4_forward 0000000000 Kette IP AC [nf_tables] } Hook Ausgabe { -0000000225 selinux_ipv4_output } Hook Postrouting { +0000000225 4 selinux_ipvXNUMX_postroute } }
  • Warteschlangenblöcke ermöglichen die Kombination von Jhash-, Symhash- und Numgen-Ausdrücken, um Pakete an Warteschlangen im Benutzerbereich zu verteilen. … Warteschlange zu Symhash Mod 65536 … Warteschlangen-Flags umgehen zu Numgen Inc Mod 65536 … Warteschlange zu Jhash oif. Meta Mark Mod 32 „queue“ kann auch mit Map-Listen kombiniert werden, um eine Warteschlange im Benutzerbereich basierend auf beliebigen Schlüsseln auszuwählen. ... Warteschlangen-Flags werden zur oifname-Karte umgeleitet { "eth0" : 0, "ppp0" : 2, "eth1" : 2 }
  • Es ist möglich, Variablen, die eine Setliste enthalten, auf mehrere Karten zu erweitern. define interfaces = { eth0, eth1 } Tabelle ip x { Kette y { Typ Filter Hook Eingabepriorität 0; Politik akzeptieren; iifname vmap { lo : akzeptieren, $interfaces : drop } } } # nft -f x.nft # nft list Ruleset Table ip x { chain y { type filterhook input priority 0; Politik akzeptieren; iifname vmap { „lo“ : akzeptieren, „eth0“ : löschen, „eth1“ : löschen } } }
  • Das Kombinieren von Vmaps (Verdict Map) in Intervallen ist zulässig: # nft add Rule xy tcp dport . ip saddr vmap { 1025-65535 . 192.168.10.2: akzeptieren }
  • Vereinfachte Syntax für NAT-Zuordnungen. Erlaubt, Adressbereiche anzugeben: ... snat to ip saddr map { 10.141.11.4 : 192.168.2.2-192.168.2.4 } oder explizite IP-Adressen und Ports: ... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 } oder Kombinationen von IP-Bereichen und Ports: ... dnat zu ip saddr . TCP-Port-Karte { 192.168.1.2 . 80: 10.141.10.2-10.141.10.5. 8888-8999 }

Source: opennet.ru

Kommentar hinzufügen