Erscheinung des Paketfilters nftables 0.9.4

Veröffentlicht Erscheinung des Paketfilters nftables 0.9.4, der sich als Ersatz für iptables, ip6table, arptables und ebtables entwickelt, durch die Vereinheitlichung der Schnittstellen für die Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken. In das Paket nftables sind Komponenten des Paketfilters integriert, die im Benutzerspeicher arbeiten, während auf Kernel-Ebene das Subsystem nf_tables bereitgestellt wird, das in den Linux-Kernel ab der Version 3.13 integriert ist. Die für die Funktion des Releases nftables 0.9.4 erforderlichen Änderungen sind im zukünftigen Kernel-Zweig enthalten. Linux 5.6.

Auf Kernel-Ebene wird nur eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll ist und grundlegende Funktionen zur Datenauslesung aus Paketen, zur Ausführung von Operationen mit Daten und zur Steuerung des Datenflusses bietet. Die tatsächlichen Filterregeln und protokollspezifischen Handler werden im Benutzerspeicher in Bytecode kompiliert und dann über die Netlink-Schnittstelle in den Kernel geladen, wo dieser Bytecode in einer speziellen virtuellen Maschine ausgeführt wird, die BPF (Berkeley Packet Filters) ähnelt. Dieser Ansatz ermöglicht es, die Größe des im Kernel laufenden Filtercodes erheblich zu reduzieren und alle Funktionen zur Regelanalyse und Logik für die Protokollverarbeitung in den Benutzerspeicher auszulagern.

Hauptneuheiten:

  • Unterstützung von Intervallen in den Konkatinationen (definierte Gruppen von Adressen und Ports, die das Matching erleichtern). Für eine Sammlung "whitelist", deren Elemente eine Konkatination sind, bedeutet die Angabe des Flags "interval", dass die Sammlung Intervalle in der Konkatination enthalten kann (früher konnte man für die Konkatination "ipv4_addr . ipv4_addr . inet_service" genaue Übereinstimmungen wie "192.168.10.35 . 192.68.11.123 . 80" angeben, nun können Gruppen von Adressen wie "192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80" angegeben werden):

    Tabelle ip foo {
    set whitelist {
    Typ ipv4_addr . ipv4_addr . inet_service
    flags interval
    Elemente = { 192.168.10.35-192.168.10.40 . 192.68.11.123-192.168.11.125 . 80 }
    }

    Kette bar {
    Typ filter hook prerouting Priorität filter; Richtlinie drop;
    ip saddr . ip daddr . tcp dport @whitelist akzeptieren
    }
    }

  • In Sets und Map-Listen ist die Verwendung der Direktive „typeof“ möglich, die das Format des Elements bei der Übereinstimmung definiert.
    Zum Beispiel:

    Tabelle ip foo {
    set whitelist {
    typeof ip saddr
    Elemente = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    Kette bar {
    Typ filter hook prerouting Priorität filter; Richtlinie drop;
    ip daddr @whitelist akzeptieren
    }
    }

    Tabelle ip foo {
    map addr2mark {
    typeof ip saddr : meta mark
    Elemente = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
    }
    }

  • Die Möglichkeit zur Verwendung von Anhängen in NAT-Bindungen wurde hinzugefügt, was es ermöglicht, Adresse und Port bei der Bestimmung von NAT-Transformationen basierend auf Map-Listen oder benannten Gruppen anzugeben:

    nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }

    nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \\; }
    nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations

  • Unterstützung für die Hardwarebeschleunigung durch Auslagerung bestimmter Filteroperationen auf die Netzwerkkarte. Die Beschleunigung wird über das Dienstprogramm ethtool aktiviert („ethtool -K eth0 hw-tc-offload on“), woraufhin sie in nftables für die Hauptkette mit dem Flag „offload“ aktiviert wird. Bei Verwendung des Linux-Kerns 5.6 wird Hardwarebeschleunigung für die Übereinstimmung von Headerfeldern und die Überprüfung der eingehenden Schnittstelle in Verbindung mit dem Empfang, Verwerfen, Duplizieren (dup) und Umleiten (fwd) von Paketen unterstützt. Im folgenden Beispiel werden Pakete, die von der Adresse 192.168.30.20 empfangen werden, auf der Ebene der Netzwerkkarte verworfen, ohne dass die Pakete an den Kernel weitergeleitet werden:

    # cat file.nft
    table netdev x {
    chain y {
    type filter hook ingress device eth0 priority 10; flags offload;
    ip saddr 192.168.30.20 drop
    }
    }
    # nft -f file.nft

  • Die Fehlermeldung zur Position des Fehlers in Regeln wurde verbessert.

    # nft delete rule ip y z handle 7
    Fehler: Regel konnte nicht verarbeitet werden: Datei oder Verzeichnis nicht gefunden
    delete rule ip y z handle 7
    ^

    # nft delete rule ip x x handle 7
    Fehler: Regel konnte nicht verarbeitet werden: Datei oder Verzeichnis nicht gefunden
    delete rule ip x x handle 7
    ^

    # nft delete table twst
    Fehler: Datei oder Verzeichnis nicht gefunden; meinten Sie die Tabelle „test“ in der Familie ip?
    delete table twst
    ^^^^

    Im ersten Beispiel wird gezeigt, dass die Tabelle „y“ im System fehlt, im zweiten, dass der Handler „7“ nicht vorhanden ist, und im dritten, dass ein Hinweis auf einen Tippfehler beim Eingeben des Tabellennamens ausgegeben wird.

  • Unterstützung für die Überprüfung von Slave-Schnittstellen durch Angabe von „meta sdif“ oder „meta sdifname“ hinzugefügt:

    … meta sdifname vrf1 …

  • Unterstützung für die Operation des Rechts- oder Linksschiebens hinzugefügt. Zum Beispiel, um ein vorhandenes Paketmarke um 1 Bit nach links zu verschieben und das kleinste Bit auf 1 zu setzen:

    … meta mark set meta mark lshift 1 or 0x1 …

  • Option „-V“ zur Anzeige erweiterter Versionsinformationen implementiert.

    # nft -V
    nftables v0.9.4 (Jive at Five)
    cli: readline
    json: yes
    minigmp: no
    libxtables: yes

  • Befehlszeilenoptionen müssen jetzt zwingend vor den Befehlen angegeben werden. Zum Beispiel muss „nft -a list ruleset“ angegeben werden, während der Befehl „nft list ruleset -a“ zu einer Fehlermeldung führt.

    Quelle: opennet.ru

60GB SSD 8Gb DDR4