Anleitungen

nftables – Der unverzichtbare iptables-Nachfolger für moderne Gateway-Server

Im Artikel Server als Router habe ich nftables als erwähnt Firewall und NAT-Backbone. Im Artikel DNS Poisoning, ich werde ein Beispiel für nftables-Regeln zum Umleiten von Port 53 und zum Blockieren von DoH geben. Aber es scheint, als hätten diese beiden Artikel nftables nicht die Plattform gegeben, die es verdient – obwohl dies meiner Meinung nach das Tool ist, das heute das leistungsfähigste im Linux-Netzwerk-Ökosystem ist.

Dieser Artikel ist ein praktischer Leitfaden für NFTables aus der Perspektive eines Gateway-Servers – nicht nur eine Theorie, sondern auch die Regeln, die ich tatsächlich verwende jeden Tag auf einem Heimserver. Für diejenigen, die die beiden vorherigen Artikel gelesen haben, ist dies das fehlende Teil, das alles zusammenhält.

Warum nftables, nicht iptables?

iptables begleitet Linux-Administratoren seit mehr als 20 Jahren. Aber es hat drei grundlegende Schwächen, die die Verwendung erschweren im modernen Maßstab:

  • Lineare Verarbeitung – jedes Paket wird Regel für Regel nacheinander überprüft. Wenn Sie in iptables 100 Regeln in der FORWARD-Kette haben, muss das Paket 100 Mal getestet, bevor die endgültige Regel erreicht wurde. nftables verwendet Set-Hashing und Maps, wodurch Suchvorgänge O(1) sind – konstant, unabhängig von 10 oder 10.000 Regeln.
  • Zwei separate Tools – iptables für IPv4, ip6tables für IPv6, arptables für ARP, ebtables für Bridge. Jeder hat eine andere Syntax. nftables erledigt alles in einem Tool: nft.
  • Ausführliche und fehleranfällige Syntax – iptables erfordert Flags wie -A, -I, -s, -d, --dport, dessen Sequenz starr ist. nftables hat eine deklarativere und konsistentere Syntax.

Aber der Vorteil von nftables, den ich am meisten empfinde, ist die atomare Regelersetzung. Wenn Sie in iptables alle Regeln löschen und von vorne beginnen möchten Zunächst müssen sie einzeln gelöscht werden – und während dieses Löschvorgangs befindet sich die Firewall in einem leeren (unsicheren) Zustand. nftables kann den gesamten Regelsatz in einem Vorgang aktualisieren Atomic verwendet nft -f ruleset.nft. Es gibt keine Lücke, in der die Firewall keine Regeln hat.

Grundkonzepte von nftables

Bevor wir uns mit den Faustregeln befassen, ist es wichtig, die drei Hierarchieebenen von nftables zu verstehen:

  • Tische – Behälter für Ketten. Jede Tabelle hat eine Familie (ip, ip6, inet, arp, Bridge, netdev). Für den Gateway-Server können wir ihn einfach verwenden inet, das IPv4 und IPv6 gleichzeitig verarbeitet.
  • Ketten – Abfolge von Regeln. Es gibt Basisketten (Hooks gebunden: Prerouting, Input, Forward, Output, Postrouting) und reguläre Ketten (ein Aufruf von einer anderen Regel, beispielsweise einem Funktionsaufruf).
  • Regeln – enthält Ausdrücke (Bedingungen) und Urteile (Aktionen: Akzeptieren, Löschen, Ablehnen, Springen, Gehe zu, Zurück, Fortfahren).

Dies ist ein Beispiel für eine minimale Tabelle und Kette für ein Gateway:

table inet gateway {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        iif lo accept
        tcp dport {22, 80, 443} accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
        ip saddr 192.168.1.0/24 accept
    }
    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
        oif eth0 masquerade
    }
}

Hinweis: Richtlinienabfall in Eingabe- und Weiterleitungsketten. Die Standardeinstellung lautet „Verweigern“ – nur explizit zugelassener Datenverkehr kann passieren. Sicherheitsprinzipien das grundlegendste, das in Heimroutern leider selten implementiert wird.

1. NAT-Maskerade – Das Herzstück des Gateway-Servers

Im Artikel „Server als Router“ ist dies die wichtigste Regel. Ohne diese Möglichkeit können Geräte im lokalen Netzwerk nicht auf das Internet zugreifen, da der Server keine Pakete weiterleitet sie ins Internet.

table inet nat {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        oifname "eth0" masquerade
    }
}

masquerade ersetzt automatisch die Quelladresse jedes Pakets, das über eth0 ausgeht, durch die Server-IP. Wenn die Antwort zurückgegeben wird, nftables gibt die ursprüngliche Adresse des Geräts im lokalen Netzwerk zurück. Alle Geräte hinter dem Server können ohne zusätzliche Konfiguration im Internet surfen.

Vergleichen Sie mit iptables:

# iptables — verbose, dua aturan terpisah untuk IPv4 dan IPv6
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

nftables verarbeitet IPv4 und IPv6 in einer Zeile mit der inet-Familie. Sauberer, es kann weniger schief gehen.

2. Portweiterleitung – Zugriff auf Dienste von außen

Manchmal möchten wir, dass Dienste im lokalen Netzwerk über das Internet zugänglich sind – zum Beispiel ein Webserver unter der IP-Adresse 192.168.1.10:80. In nftables wird dies als Ziel bezeichnet NAT(dstnat) und erfolgt im Chain-Prerouting:

table inet nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        tcp dport 80 dnat to 192.168.1.10:80
        tcp dport 443 dnat to 192.168.1.10:443
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        # Izinkan traffic ke server internal
        tcp dport {80, 443} ip daddr 192.168.1.10 ct state new accept
    }
}

Hinweis: Neben dem DNA-Prerouting benötigen wir auch Regeln in der Weiterleitungskette, um Datenverkehr zur internen IP zuzulassen. Viele tun es Ich habe das vergessen und mich gefragt, warum die Portweiterleitung nicht funktioniert – obwohl das Paket NAT-fähig war, wurde es per Chain Forward verworfen.

3. DNS-Kontrolle – DoH umleiten und blockieren

Dies ist die Regel, die ich im Artikel über DNS-Vergiftung behandelt habe – wie man alle Geräte in einem Netzwerk dazu zwingt, einen lokalen DNS-Server zu verwenden:

table inet dns-control {
    chain prerouting {
        type nat hook prerouting priority -100; policy accept;
        # Redirect semua DNS ke DNSMasq lokal (192.168.1.2)
        udp dport 53 dnat to 192.168.1.2:53
        tcp dport 53 dnat to 192.168.1.2:53
    }

    chain forward {
        type filter hook forward priority 0; policy accept;
        # Blokir DoH ke provider publik
        tcp dport 443 ip daddr {1.1.1.0/24, 8.8.8.0/24, 9.9.9.0/24} drop
    }
}

Der Unterschied zur Version im DNS-Poisoning-Artikel: Hier verwende ich set literal {1.1.1.0/24, 8.8.8.0/24, 9.9.9.0/24}. nftables ändern sich Dieser Satz wird zu einer Hash-Tabelle im Kernel – O(1)-Suche, unabhängig davon, wie viele IPs sich im Satz befinden. In iptables muss für jede IP eine separate Regel überprüft werden eins nach dem anderen.

4. Bandbreitenbegrenzung pro Gerät – Intervall und Burst

Eine der Funktionen, die mir am Gateway-Server am besten gefällt, ist, dass er die Bandbreite pro Gerät begrenzen kann. In nftables erfolgt dies mit meters oder Kontingente:

table inet bandwidth {
    chain forward {
        type filter hook forward priority 0; policy accept;

        # Batasi device 192.168.1.50 maksimal 10MB per 6 jam
        ip saddr 192.168.1.50 quota over 10 mbytes until 6h drop
        ip saddr 192.168.1.51 quota over 50 mbytes until 12h drop
    }
}

Die oben genannten Regeln verfolgen die von einem bestimmten Gerät gesendete Datenmenge. Wenn das Kontingent überschritten wird, wird das nächste Paket bis zum Zurücksetzen des Kontingents verworfen. Sehr nützlich für digitale Grenzen – geben Sie Ihrem Kind alle 6 Stunden 10 MB Internet, danach müssen Sie auf einen Reset warten.

Aber das ist eine einfache Quote. Zur Ratenbegrenzung (Begrenzung der Geschwindigkeit, nicht der Menge) verfügt nftables über limit:

# Batasi kecepatan download device: maksimal 1MB/s dengan burst 2MB
ip saddr 192.168.1.50 limit rate 1 mbytes/second burst 2 mbytes accept
ip saddr 192.168.1.50 drop

Die erste Regel erlaubt Pakete, solange sie innerhalb des Ratenlimits liegen. Die zweite Regel verwirft Pakete, die das Limit überschreiten. Der Effekt: Das Gerät hat maximale Downloads 1 MB/s, mit 2 MB Burst zum Ausgleich von Schwankungen.

5. Verbindungsverfolgung – Ausführung bestehender Verbindungen zulassen

Die Regel, die Anfänger am häufigsten vergessen, ist die Verbindungsverfolgung. Ohne dies müsste jedes Paket in einer einzelnen TCP-Verbindung alle Regeln durchlaufen Firewall – ineffizient.

chain forward {
    type filter hook forward priority 0; policy drop;

    # Izinkan koneksi yang sudah established
    ct state established,related accept

    # Hanya koneksi baru yang diperiksa
    ct state invalid drop
    ip saddr 192.168.1.0/24 accept
}

Die ct state established,related accept-Regel befindet sich in der ersten Zeile. Das heißt, nach der ersten Verbindung werden nachfolgende Pakete zugelassen in derselben Verbindung (einschließlich Antwortpakete aus dem Internet) werden ohne erneute Prüfung sofort akzeptiert. Dies spart CPU und beschleunigt den Durchsatz erheblich bedeutsam.

6. Protokollierung – Sehen, was nicht sichtbar ist

nftables verfügt über eine integrierte Protokollierungsfunktion – sie akzeptiert/verwirft nicht nur Protokolle, sondern kann auch detaillierte Paketmetadaten protokollieren:

chain forward {
    type filter hook forward priority 0; policy drop;

    ct state established,related accept

    # Log semua koneksi baru yang mencoba keluar
    ip saddr 192.168.1.0/24 ct state new log prefix "FWD:NEW: " accept

    # Log paket aneh yang di-drop
    log prefix "FWD:DROP: " drop
}

Mit log prefix kann der Ursprung jeder Protokollzeile identifiziert werden. In /var/log/kern.log sieht ein Eintrag wie folgt aus:

kernel: FWD:NEW: IN=eth1 OUT=eth0 SRC=192.168.1.50 DST=203.0.113.5 PROTO=TCP SPT=45123 DPT=443

Für Gateway-Server sind diese Protokolle sehr nützlich für:

  • Erkennen Sie Geräte, die versuchen, auf verdächtige Domänen/IPs zuzugreifen
  • Überprüfen Sie, ob die Firewallregeln wie erwartet funktionieren
  • Debuggen einer Verbindung, die keine Verbindung zum Internet herstellen kann – handelt es sich um einen Ausfall der Firewall oder um ein anderes Problem?

7. Erweitert: Benannte Sets für eine einfache Verwaltung

Dies ist die Funktion, die nftables iptables wirklich überlegen macht: benannte Mengen. Anstatt IPs einzeln in die Regeln zu schreiben, erstellen wir Sätze kann gefüllt/geleert werden, ohne dass der gesamte Regelsatz neu geladen werden muss:

table inet filter {
    set blocked-ips {
        type ipv4_addr
        flags interval
        auto-merge
    }

    set blocked-domains {
        type ipv4_addr
        flags interval
    }

    chain forward {
        type filter hook forward priority 0; policy accept;
        ip saddr @blocked-ips drop
        ip daddr @blocked-domains drop
    }
}

# Isi set (bisa kapan saja, tanpa reload)
nft add element inet filter blocked-ips { 192.168.1.50, 192.168.1.51 }
nft add element inet filter blocked-domains { 203.0.113.0/24 }

Der Vorteil: Wir können mit einem Befehl nft add element oder nft delete element IPs zum Set hinzufügen/entfernen. Keine Notwendigkeit Schreiben Sie den gesamten Regelsatz neu. Sehr gut geeignet für die Integration mit Überwachungs-Dashboards wie dem, das ich im Server-Artikel als Router besprochen habe – nur ein Endpunkt API, die nft add element aufruft, um Geräte vom Dashboard zu blockieren.

8. Erweitert: Karten für selektives Routing

Maps in nftables ermöglichen es uns, verschiedene Aktionen basierend auf Bedingungen auszuführen – eine Art Switch-Case im Kernel:

table inet nat {
    map port-forward {
        type inet_service : dnat_addr
        elements = {
            80  : 192.168.1.10,
            443 : 192.168.1.10,
            22  : 192.168.1.20,
            32400 : 192.168.1.30,
        }
    }

    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        tcp dport vmap @port-forward dnat to :tcp dport
    }
}

Diese Karte definiert, welche Ports an welche IPs weitergeleitet werden. Wenn eine Verbindung zu Port 80 besteht, sucht nftables sofort nach der entsprechenden IP-Adresse, um sie zuzuordnen und zu dnaten. O(1), ohne dass verschachtelte Regeln erforderlich sind. Möchten Sie eine Portweiterleitung hinzufügen? Fügen Sie einfach Elemente zur Karte hinzu. Möchten Sie es löschen? Löschen Sie einfach das Element. Es besteht keine Notwendigkeit, die Hauptregeln zu berühren.

Leistung: nftables vs. iptables in der realen Welt

Ich habe einmal einen einfachen Test auf demselben Server durchgeführt – Debian 12, Kernel 6.1, Intel Celeron N3350 CPU. Mit 50 IP-Blockierungsregeln in iptables, Durchsatz von 940 Mbit/s auf etwa 720 Mbit/s gesenkt. Mit den gleichen Regeln in nftables unter Verwendung von set bleibt der Durchsatz bei 930+ Mbit/s.

Die Ursache: iptables prüft jede Regel linear. Jedes Paket muss 50 Regeln erfüllen. nftables mit einem Hash-Set führen einfach eine Suche durch – O(1). Je mehr Regeln, desto größer der Unterschied.

Auf einem Heim-Gateway-Server mit einer Bandbreite von 100–500 Mbit/s ist dieser Unterschied möglicherweise nicht spürbar. Aber für diejenigen, die Gigabit-Anschlüsse oder Tausende von Sperrregeln haben, Der Unterschied ist sehr signifikant.

Schlussfolgerung

nftables ist nicht nur ein Ersatz für iptables – es ist ein konzeptioneller Sprung in der Art und Weise, wie wir Firewalls unter Linux verwalten. Mit Syntax Mit sauberer, besserer Leistung und Funktionen wie benannten Sets, Karten und Kontingenten bietet nftables vollständige Kontrolle über den Netzwerkverkehr ein Weg, der bisher mit iptables ohne ein kompliziertes Skript nicht möglich war.

Wenn Sie den Artikel Server als Router gelesen haben und DNS-Vergiftung, Jetzt haben Sie eine weitere Waffe in Ihrem Arsenal: nftables als Muskel, der Firewall-, NAT- und Filterregeln schnell ausführt Kernel-nativ. DNSMasq ist das Gehirn, das bestimmt, wohin eine Domain geleitet werden soll. Und nftables als eine Hand, die nur für den Verkehr sorgt der legitime kann passieren.

Die Kombination aus DNSMasq + nftables + Gateway-Server ist die Grundlage einer Heimnetzwerk-Infrastruktur, die leistungsstark, kostengünstig und – was am wichtigsten ist – Sie ist Wer hat die volle Kontrolle?

Zur vollständigen Referenz: man nft im Terminal ist Ihr bester Freund. Oder besuchen Sie wiki.nftables.org für die offizielle Dokumentation.