Release des Paketfilters nftables 0.9.5

Veröffentlicht Veröffentlichung des Paketfilters nftables 0.9.5, 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. Im Paket nftables sind Komponenten enthalten, die im Benutzermodus Paketfilterfunktionen bereitstellen, während die nf_tables-Subsystem im Kernel die Arbeit abwickelt, das seit Version 3.13 Bestandteil des Linux-Kernels ist. Die für den Betrieb von nftables 0.9.5 erforderlichen Änderungen sind im Kernel enthalten. Linux 5.7.

Auf Kernel-Ebene wird lediglich eine allgemeine Schnittstelle bereitgestellt, die unabhängig von einem bestimmten Protokoll ist und grundlegende Funktionen für das Extrahieren von Daten aus Paketen, das Ausführen von Datenoperationen und das Verwalten von Datenströmen bietet. Die eigentlichen Filterregeln und protokollspezifischen Handler werden in Bytecode im Benutzermodus kompiliert, anschließend wird dieser Bytecode über die Netlink-Schnittstelle in den Kernel geladen und dort in einer speziellen virtuellen Maschine ausgeführt, die an BPF (Berkeley Packet Filters) erinnert. Dieser Ansatz ermöglicht eine signifikante Reduzierung der Größe des auf Kernel-Ebene arbeitenden Filtercodes und verlagert alle Funktionen zur Regelparsing und Logik für die Protokollbearbeitung in den Benutzermodus.

Hauptneuheiten:

  • Es wurde Unterstützung für Paket- und Verkehrszählstände hinzugefügt, die an die Elemente der Menge gebunden sind. Zähler werden mit dem Schlüsselwort „counter“ aktiviert:

    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • Um die Anfangswerte der Zähler festzulegen, z. B. um vorherige Zähler nach einem Neustart wiederherzustellen, kann der Befehl „nft -f“ verwendet werden:

    # cat ruleset.nft
    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }
    # nft -f ruleset.nft
    # nft list ruleset
    table ip x {
    set y {
    typeof ip saddr
    counter
    elements = { 192.168.10.35 counter packets 1 bytes 84, 192.168.10.101 \
    counter p 192.168.10.135 counter packets 0 bytes 0 }
    }

    chain z {
    type filter hook output priority filter; policy accept;
    ip daddr @y
    }
    }

  • Die Unterstützung für Zähler wurde auch in die flowtable integriert:

    table ip foo {
    flowtable bar {
    hook ingress priority -100
    devices = { eth0, eth1 }
    counter
    }

    chain forward {
    type filter hook forward priority filter;
    flow add @bar counter
    }
    }

    Die Liste der Zähler kann mit dem Befehl „conntrack -L“ angezeigt werden:

    tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47278 dport=5201 packets=9 bytes=608 \
    src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47278 packets=8 bytes=428 [OFFLOAD] mark=0 \
    secctx=null use=2 tcp 6 src=192.168.10.2 dst=10.0.1.2 sport=47280 dport=5201 \
    packets=1005763 bytes=44075714753 src=10.0.1.2 dst=10.0.1.1 sport=5201 dport=47280 \
    packets=967505 bytes=50310268 [OFFLOAD] mark=0 secctx=null use=2

  • In den Verbindungssätzen (Konkatenation, bestimmte Adress- und Portkombinationen zur Vereinfachung der Zuordnung) wird die Verwendung der Direktive „typeof“ unterstützt, die den Datentyp der Elemente für die Bestandteile des Satzes definiert:

    table ip foo {
    set whitelist {
    typeof ip saddr . tcp dport
    elements = { 192.168.10.35 . 80, 192.168.10.101 . 80 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    ip daddr . tcp dport @whitelist accept
    }
    }

  • Die Direktive typeof ist jetzt auch auf Verbindungen in map-Listen anwendbar:

    table ip foo {
    map addr2mark {
    typeof ip saddr . tcp dport : meta mark
    elements = { 192.168.10.35 . 80 : 0x00000001,
    192.168.10.135 . 80 : 0x00000002 }
    }

    chain bar {
    type filter hook prerouting priority filter; policy drop;
    meta mark set ip daddr . tcp dport map @addr2mark accept
    }
    }

  • Unterstützung von Verbindungen mit Bereichen in anonymen (nicht benannten) Sätzen hinzugefügt:

    # nft add rule inet filter input ip daddr . tcp dport \
    { 10.0.0.0/8 . 10-23, 192.168.1.1-192.168.3.8 . 80-443 } accept

  • Die Möglichkeit zum Wegwerfen von Paketen mit 802.1q (VLAN) Flags bei der Verarbeitung von Netzwerkbrücken wurde bereitgestellt.

    # nft add rule bridge foo bar ether type vlan reject with tcp reset

  • Unterstützung der Zuordnung anhand der TCP-Sitzungs-ID (conntrack ID) hinzugefügt. Die conntrack ID kann mit der Option „—output id“ ermittelt werden:

    # conntrack -L —output id
    udp 17 18 src=192.168.2.118 dst=192.168.2.1 sport=36424 dport=53 packets=2 \
    bytes=122 src=192.168.2.1 dst=192.168.2.118 sport=53 dport=36424 packets=2 bytes=320 \
    [ASSURED] mark=0 use=1 id=2779986232

    # nft add rule foo bar ct id 2779986232 counter

Quelle: opennet.ru

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster