nftables-Paketfilter 0.9.1-Version

Nach einem Jahr Entwicklung eingereicht Paketfilterfreigabe nftables 0.9.1, entwickelt als Ersatz für iptables, ip6table, arptables und ebtables durch die Vereinheitlichung von Paketfilterschnittstellen für IPv4, IPv6, ARP und Netzwerkbrücken. 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 Filterlogik selbst und protokollspezifische Handler werden im Benutzerbereich in Bytecode kompiliert. Anschließend wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und in einer speziellen virtuellen Maschine ausgeführt, die an BPF (Berkeley Packet Filters) erinnert. Mit diesem Ansatz können Sie die Größe des auf Kernelebene ausgeführten Filtercodes erheblich reduzieren und alle Funktionen der Analyseregeln und Logik für die Arbeit mit Protokollen in den Benutzerbereich verschieben.

Wichtigste Neuerungen:

  • IPsec-Unterstützung ermöglicht den Abgleich von Tunneladressen basierend auf Paket, IPsec-Anfrage-ID und SPI-Tag (Security Parameter Index). Zum Beispiel,

    ... ipsec in ip saddr 192.168.1.0/24
    ... ipsec in spi 1-65536

    Es besteht auch die Möglichkeit zu prüfen, ob eine Route durch einen IPsec-Tunnel verläuft. Um beispielsweise Datenverkehr zu blockieren, der nicht über IPSec erfolgt:

    … Filterausgabe rt ipsec fehlender Drop

  • Unterstützung für IGMP (Internet Group Management Protocol). Sie können beispielsweise eine Regel verwenden, um eingehende IGMP-Gruppenmitgliedschaftsanfragen zu verwerfen

    NFT-Regel hinzufügen Netdev FOO Bar IGMP Typ Membership-Query Counter Drop

  • Möglichkeit der Verwendung von Variablen zur Definition von Übergangsketten (Jump / Goto). Zum Beispiel:

    definiere dest = ber
    Regel hinzufügen ip foo bar jump $dest

  • Unterstützung für Masken zur Identifizierung von Betriebssystemen (OS-Fingerprint) anhand von TTL-Werten im Header. Um beispielsweise Pakete anhand des Absender-Betriebssystems zu markieren, können Sie den folgenden Befehl verwenden:

    ... Meta-Markierung gesetzt OSF TTL Skip Name Map { "Linux" : 0x1,
    „Windows“: 0x2,
    „MacOS“: 0x3,
    "unbekannt" : 0x0 }
    ... osf ttl Version „Linux:4.20“ überspringen

  • Möglichkeit, die ARP-Adresse des Absenders und die IPv4-Adresse des Zielsystems abzugleichen. Um beispielsweise den Zähler der von der Adresse 192.168.2.1 gesendeten ARP-Pakete zu erhöhen, können Sie die folgende Regel verwenden:

    Tabelle Arp x {
    Kette y {
    Typfilter-Hook-Eingabeprioritätsfilter; Politik akzeptieren;
    Arp Saddr IP 192.168.2.1 Zählerpakete 1 Byte 46
    }
    }

  • Unterstützung für die transparente Weiterleitung von Anfragen über einen Proxy (tproxy). Um beispielsweise Anrufe an Port 80 an den Proxy-Port 8080 umzuleiten:

    Tisch-IP x {
    Kette y {
    Typfilter-Hook-Prerouting-Priorität -150; Politik akzeptieren;
    TCP-Dport 80 tproxy auf:8080
    }
    }

  • Unterstützung für das Markieren von Sockets mit der Möglichkeit, die gesetzte Markierung zusätzlich über setsockopt() im SO_MARK-Modus zu erhalten. Zum Beispiel:

    Tabelle inet x {
    Kette y {
    Typfilter-Hook-Prerouting-Priorität -150; Politik akzeptieren;
    TCP-Dport 8080-Markierung setzt Socket-Markierung
    }
    }

  • Unterstützung für die Angabe von Prioritätstextnamen für Ketten. Zum Beispiel:

    nft add chain ip x raw { Typ Filter Hook Prerouting Priority Raw; }
    NFT Add Chain IP X Filter { Typ Filter Hook Prerouting Priority Filter; }
    nft add chain ip x filter_later { Typ Filter Hook Prerouting Priority Filter + 10; }

  • Unterstützung für SELinux-Tags (Secmark). Um beispielsweise das Tag „sshtag“ in einem SELinux-Kontext zu definieren, können Sie Folgendes ausführen:

    nft fügt secmark inet filter sshtag „system_u:object_r:ssh_server_packet_t:s0“ hinzu

    Und dann verwenden Sie diese Bezeichnung in den Regeln:

    NFT Regel hinzufügen Inet Filter Eingabe TCP Dport 22 Meta Secmark Set „sshtag“

    nft add map inet filter secmapping { type inet_service : secmark; }
    nft add element inet filter secmapping { 22 : „sshtag“ }
    NFT Regel hinzufügen Inet Filter Eingabe Meta Secmark Set TCP Dport Map @secmapping

  • Möglichkeit, den Protokollen zugewiesene Ports in Textform anzugeben, wie sie in der Datei /etc/services definiert sind. Zum Beispiel:

    NFT-Regel hinzufügen xy TCP-Port „ssh“
    NFT-Listenregelsatz -l
    Tabelle x {
    Kette y {
    ...
    TCP-Port „ssh“
    }
    }

  • Möglichkeit, den Typ der Netzwerkschnittstelle zu überprüfen. Zum Beispiel:

    Regel hinzufügen inet raw prerouting meta iifkind „vrf“ akzeptieren

  • Verbesserte Unterstützung für die dynamische Aktualisierung des Inhalts von Sätzen durch explizite Angabe des „dynamischen“ Flags. Um beispielsweise den Satz „s“ zu aktualisieren, um die Quelladresse hinzuzufügen und den Eintrag zurückzusetzen, wenn 30 Sekunden lang keine Pakete vorhanden sind:

    Tabelle x hinzufügen
    add set xs { type ipv4_addr; Größe 128; Timeout 30s; Flags dynamisch; }
    Kette hinzufügen xy { Typ Filter Hook Eingabepriorität 0; }
    Regel hinzufügen xy update @s { ip saddr }

  • Möglichkeit, eine separate Timeout-Bedingung festzulegen. Um beispielsweise das Standard-Timeout für an Port 8888 ankommende Pakete zu überschreiben, können Sie Folgendes angeben:

    Tabelle IP-Filter {
    ct-Timeout aggressive-tcp {
    Protokoll TCP;
    l3proto ip;
    Policy = {established: 100, close_wait: 4, close: 4}
    }
    Kettenausgang {
    ...
    TCP-Dport 8888 CT-Timeout-Set „aggressive-tcp“
    }
    }

  • NAT-Unterstützung für die Inet-Familie:

    Tabelle inet nat {
    ...
    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Verbesserte Möglichkeiten zur Fehlerberichterstattung aufgrund von Tippfehlern:

    NFT-Kettenfiltertest hinzufügen

    Fehler: Keine solche Datei oder kein solches Verzeichnis; Meinten Sie die Tabelle „Filter“ in der Familien-IP?
    Kettenfiltertest hinzufügen
    ^^^^^^

  • Möglichkeit, Schnittstellennamen in Sätzen anzugeben:

    setze sc {
    Geben Sie inet_service ein. ifname
    elements = { "ssh" . "eth0" }
    }

  • Aktualisierte Syntax der Flowtable-Regeln:

    NFT Tabelle x hinzufügen
    nft add flowtable x ft { Hook Ingress Priority 0; Geräte = { eth0, wlan0 }; }
    ...
    nft Regel hinzufügen x IP-Protokoll weiterleiten { tcp, udp } Fluss hinzufügen @ft

  • Verbesserte JSON-Unterstützung.

Source: opennet.ru

Kommentar hinzufügen