Veröffentlichung des Paketfilters nftables 0.9.1

Nach einem Jahr Entwicklung vorgestellt Freigabe des Paketfilters nftables 0.9.1, das sich als Ersatz für iptables, ip6tables, arptables und ebtables entwickelt, indem es die Schnittstellen zur Paketfilterung für IPv4, IPv6, ARP und Netzwerkbrücken vereinheitlicht. Das nftables-Paket enthält Benutzermoduskomponenten des Paketfilters, während auf Kernel-Ebene das nf_tables-Subsystem bereitgestellt wird, das seit der Version 3.13 Teil des Linux-Kernels ist.

Auf Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die unabhängig vom spezifischen Protokoll die grundlegenden Funktionen zum Extrahieren von Daten aus Paketen, zum Ausführen von Datenoperationen und zum Verwalten von Datenströmen bietet.
Die Filterlogik und die protokollspezifischen Handler werden in Bytecode im Benutzermodus kompiliert, woraufhin dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und in einer speziellen virtuellen Maschine ausgeführt wird, die BPF (Berkeley Packet Filters) ähnelt. Dieser Ansatz ermöglicht es, die Größe des auf Kernel-Ebene arbeitenden Filtercodes erheblich zu reduzieren und alle Funktionen zur Regelinterpretation und logischen Verarbeitung der Protokolle in den Benutzermodus auszulagern.

Hauptneuheiten:

  • Unterstützung von IPsec, das die Zuordnung von Tunneladressen an Paket, IPsec-Anforderungs-ID und SPI (Security Parameter Index)-Tag ermöglicht. Zum Beispiel,

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

    Es ist auch möglich, die Durchreise über ein IPsec-Tunnel zu überprüfen. Zum Beispiel, um Verkehr, der nicht über IPsec läuft, zu blockieren:

    … filter output rt ipsec missing drop

  • Unterstützung des IGMP-Protokolls (Internet Group Management Protocol). Zum Beispiel, um eingehende IGMP-Anfragen nach Gruppenmitgliedschaft abzulehnen, kann folgende Regel verwendet werden:

    nft add rule netdev foo bar igmp type membership-query counter drop

  • Möglichkeit der Verwendung von Variablen zur Definition von Sprungketten (jump / goto). Zum Beispiel:

    define dest = ber
    add rule ip foo bar jump $dest

  • Unterstützung von Masken zur Identifizierung von Betriebssystemen (OS Fingerprint) basierend auf den TTL-Werten im Header. Zum Beispiel, um Pakete abhängig vom Betriebssystem des Absenders zu kennzeichnen, kann der Befehl verwendet werden:

    … meta mark set osf ttl skip name map { "Linux" : 0x1,
    "Windows" : 0x2,
    "MacOS" : 0x3,
    "unknown" : 0x0 }
    … osf ttl skip version "Linux:4.20"

  • Möglichkeit der Zuordnung der ARP-Adresse des Absenders zur IPv4-Adresse des Zielsystems. Zum Beispiel, um den Zähler für ARP-Pakete zu erhöhen, die von der Adresse 192.168.2.1 gesendet werden, kann folgende Regel verwendet werden:

    table arp x {
    chain y {
    type filter hook input priority filter; policy accept;
    arp saddr ip 192.168.2.1 counter packets 1 bytes 46
    }
    }

  • Unterstützung für transparentes Proxy-Passing von Anfragen (tproxy). Zum Beispiel, um Anfragen an Port 80 auf den Proxy-Port 8080 umzuleiten:

    table ip x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 80 tproxy to :8080
    }
    }

  • Unterstützung für das Markieren von Sockets mit der Möglichkeit, das gesetzte Mark durch setsockopt() im SO_MARK-Modus abzurufen. Beispielsweise:

    table inet x {
    chain y {
    type filter hook prerouting priority -150; policy accept;
    tcp dport 8080 mark set socket mark
    }
    }

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

    nft add chain ip x raw { type filter hook prerouting priority raw; }
    nft add chain ip x filter { type filter hook prerouting priority filter; }
    nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; }

  • Unterstützung für SELinux-Tags (Secmark). Zum Beispiel kann zum Festlegen des Tags "sshtag" im Kontext von SELinux Folgendes ausgeführt werden:

    nft add secmark inet filter sshtag "system_u:object_r:ssh_server_packet_t:s0"

    Und dann kann dieses Tag in Regeln verwendet werden:

    nft add rule inet filter input 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 add rule inet filter input meta secmark set tcp dport map @secmapping

  • Möglichkeit zur Angabe von Protokollgebundenen Ports in Textform, wie sie in der Datei /etc/services definiert sind. Zum Beispiel:

    nft add rule x y tcp dport "ssh"
    nft list ruleset -l
    table x {
    chain y {

    tcp dport "ssh"
    }
    }

  • Möglichkeit zur Überprüfung des Typs des Netzwerkinterfaces. Zum Beispiel:

    add rule inet raw prerouting meta iifkind "vrf" accept

  • Verbesserte Unterstützung für die dynamische Aktualisierung von Satzinhalten (sets) durch explizite Angabe des "dynamic"-Flags. Zum Beispiel, um den Satz "s" mit der Hinzufügung der Quelladresse zu aktualisieren und den Eintrag zurückzusetzen, wenn innerhalb von 30 Sekunden keine Pakete empfangen werden:

    add table x
    add set x s { type ipv4_addr; size 128; timeout 30s; flags dynamic; }
    add chain x y { type filter hook input priority 0; }
    add rule x y update @s { ip saddr }

  • Möglichkeit, eine separate Bedingung für das Eintreten eines Zeitüberschreitens festzulegen. Zum Beispiel, um die Standard-Zeitüberschreitung für Pakete, die an Port 8888 ankommen, zu ändern:

    table ip filter {
    ct timeout agressive-tcp {
    protocol tcp;
    l3proto ip;
    policy = {established: 100, close_wait: 4, close: 4}
    }
    chain output {

    tcp dport 8888 ct timeout set "agressive-tcp"
    }
    }

  • Unterstützung für NAT für die Familie inet:

    table inet nat {

    ip6 daddr dead::2::1 dnat to dead:2::99
    }

  • Verbesserte Werkzeuge zur Ausgabe von Fehlerinformationen aufgrund von Tippfehlern:

    nft add chain filtre test

    Error: No such file or directory; did you mean table "filter" in family ip?
    add chain filtre test
    ^^^^^^

  • Möglichkeit zur Angabe von Schnittstellennamen in Mengen (sets):

    set sc {
    type inet_service . ifname
    elements = { "ssh" . "eth0" }
    }

  • Aktualisierter Syntax für flowtable-Regeln:

    nft add table x
    nft add flowtable x ft { hook ingress priority 0; devices = { eth0, wlan0 }; }

    nft add rule x forward ip protocol { tcp, udp } flow add @ft

  • Verbesserte Unterstützung für JSON.

Quelle: opennet.ru

60GB SSD 8Gb DDR4