TL;DR — Kurzzusammenfassung

nftables ersetzt iptables unter Linux mit sauberer Syntax und atomarem Regelladung. Leitfaden mit Sets, NAT, Ratenbegrenzung und Webserver-Firewall.

nftables ist das moderne Paketklassifizierungs-Framework des Linux-Kernels und der offizielle Ersatz für die veraltete Tool-Chain iptables, ip6tables, arptables und ebtables. Seit Kernel 3.13 verfügbar und jetzt das Standard-Backend auf Debian 10+, Ubuntu 20.10+, RHEL 8+ und Fedora 18+, bietet nftables eine einheitliche Befehlsschnittstelle, natives Set-basiertes Matching und atomares Regelsatz-Laden, das die inhärenten Sicherheitslücken bei regel-weisen iptables-Updates eliminiert. Dieser Leitfaden behandelt den vollständigen Migrationspfad — von der Installation von nftables und dem Verständnis seiner Objekthierarchie bis hin zum Aufbau einer produktionsbereiten Webserver-Firewall mit Sets, Ratenbegrenzung, NAT und persistenter systemd-Integration.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes haben:

  • Einen Linux-Server mit Kernel 3.13 oder höher (Ubuntu 20.04+, Debian 10+ oder RHEL 8+ empfohlen)
  • Terminalzugang mit sudo-Rechten
  • SSH-Zugang zum Server bei Remote-Konfiguration — halten Sie eine zweite Sitzung als Sicherheitsnetz offen
  • Vertrautheit mit TCP/UDP-Ports und grundlegenden IP-Netzwerken
  • Exportierte iptables-Regeln wenn Sie diese migrieren möchten (sudo iptables-save > ~/iptables-backup.txt)

Warum nftables iptables Ersetzt

Die veraltete Netfilter-Tool-Chain hat sich über zwei Jahrzehnte organisch entwickelt und resultierte in vier separaten Utilities (iptables, ip6tables, arptables, ebtables), jede mit eigener Syntax, Kernel-Schnittstelle und Erweiterungsmechanismus. nftables wurde von Grund auf entwickelt um diese strukturellen Probleme zu lösen.

Einheitliches Framework

Ein einzelner nft-Befehl ersetzt alle vier veralteten Tools. Eine einzige inet-Familientabelle verarbeitet gleichzeitig IPv4 und IPv6, was die Notwendigkeit eliminiert, jede Regel für beide Adressfamilien zu duplizieren.

Bessere Syntax

nftables verwendet eine strukturierte Grammatik die natürlicher zu lesen ist als iptables-Flags:

# iptables
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# nftables-Äquivalent
nft add rule inet filter input tcp dport 443 ct state new accept

Atomares Regelladung

Mit iptables erfolgt das Hinzufügen und Entfernen von Regeln einzeln — es gibt eine Race Condition zwischen jeder einzelnen Operation. nftables lädt einen vollständigen Regelsatz als einzelne atomare Transaktion via nft -f, wodurch die Firewall nie in einem teilweisen Zustand ist.

Native Sets und Maps

iptables erfordert die separate ipset-Erweiterung für effizientes Matching gegen große IP- oder Port-Listen. nftables beinhaltet Sets und Maps nativ, mit Unterstützung für Timeouts, konkatenierte Schlüssel und Verdict-Maps ohne zusätzliche Pakete.

Grundlagen des nft-Befehls

nftables organisiert alles in einer dreistufigen Hierarchie: Tabellen enthalten Chains, Chains enthalten Regeln. Jede Tabelle gehört einer Adressfamilie an.

Adressfamilien

FamilieVerarbeiteter Datenverkehr
ipNur IPv4
ip6Nur IPv6
inetIPv4 und IPv6 (für Server empfohlen)
arpARP-Protokoll
bridgeBridge-/Switch-Ebene
netdevIngress auf einer bestimmten Schnittstelle

Tabellenverwaltung

sudo nft add table inet filter          # Tabelle erstellen
sudo nft list tables                    # alle Tabellen auflisten
sudo nft delete table inet filter       # Tabelle und Inhalt löschen
sudo nft flush table inet filter        # alle Regeln entfernen, Struktur behalten

Chain-Verwaltung

Basis-Chains sind an einen Netfilter-Hook gebunden. Sie erfordern einen type, hook und priority:

sudo nft add chain inet filter input   { type filter hook input priority 0 \; policy drop \; }
sudo nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
sudo nft add chain inet filter output  { type filter hook output priority 0 \; policy accept \; }

Regelverwaltung

sudo nft add rule inet filter input tcp dport 22 accept      # am Ende hinzufügen
sudo nft insert rule inet filter input tcp dport 22 accept   # am Anfang einfügen
sudo nft list chain inet filter input                         # mit Handles anzeigen
sudo nft delete rule inet filter input handle 5               # nach Handle löschen

Aufbau einer Basis-Firewall

Die folgende Sequenz baut eine vollständige Referenz-Firewall Schritt für Schritt auf.

Schritt 1 — Tabelle und Chains erstellen

sudo nft add table inet filter
sudo nft add chain inet filter input   { type filter hook input priority 0 \; policy drop \; }
sudo nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
sudo nft add chain inet filter output  { type filter hook output priority 0 \; policy accept \; }

Schritt 2 — Etablierte Verbindungen und Loopback akzeptieren

Diese Regeln müssen zuerst kommen damit bestehende Sitzungen nicht unterbrochen werden:

sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input ct state invalid drop
sudo nft add rule inet filter input iif lo accept

Schritt 3 — ICMP erlauben

sudo nft add rule inet filter input ip protocol icmp limit rate 10/second burst 20 packets accept
sudo nft add rule inet filter input ip6 nexthdr icmpv6 limit rate 10/second burst 20 packets accept

Schritt 4 — Service-Ports erlauben

sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

Schritt 5 — Abschluss-Ablehnung

Senden Sie einen ICMP-Fehler an nicht übereinstimmenden Datenverkehr anstatt ihn still zu verwerfen:

sudo nft add rule inet filter input reject with icmpx type port-unreachable

Sets und Maps für Effizientes Regelmanagement

Sets eliminieren die Notwendigkeit, eine Regel pro Port oder IP-Adresse zu schreiben. Sie können dynamisch aktualisiert werden ohne die Regeln zu ändern die sie referenzieren.

Anonyme Sets (Inline)

sudo nft add rule inet filter input tcp dport { 22, 80, 443, 8443 } accept

Benannte Sets

sudo nft add set inet filter tcp_accepted { type inet_service \; }
sudo nft add element inet filter tcp_accepted { 22, 80, 443 }
sudo nft add rule inet filter input tcp dport @tcp_accepted accept

# Ports hinzufügen oder entfernen ohne die Regel zu berühren
sudo nft add element inet filter tcp_accepted { 8080 }
sudo nft delete element inet filter tcp_accepted { 8080 }

IP-Blockliste mit Automatischem Ablauf

sudo nft add set inet filter blocklist { type ipv4_addr \; timeout 24h \; }
sudo nft add element inet filter blocklist { 203.0.113.10, 198.51.100.5 }
sudo nft add rule inet filter input ip saddr @blocklist drop

Konkatenierte Sets (Mehrfeld-Matching)

sudo nft add set inet filter db_access { type ipv4_addr . inet_service \; }
sudo nft add element inet filter db_access { 10.0.1.20 . 3306, 10.0.1.21 . 5432 }
sudo nft add rule inet filter input ip saddr . tcp dport @db_access accept

Ratenbegrenzung und Verbindungsverfolgung

Globale SSH-Ratenbegrenzung

sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 5/minute burst 10 packets accept
sudo nft add rule inet filter input tcp dport 22 ct state new drop

Quell-IP-Ratenbegrenzung mit Metern

sudo nft add rule inet filter input tcp dport 22 ct state new \
  meter ssh_limit { ip saddr limit rate 3/minute burst 5 packets } accept

Verbindungsverfolgungszustände

ZustandBedeutung
newErstes Paket einer neuen Verbindung
establishedRücklaufverkehr für eine akzeptierte Verbindung
relatedZu einer bestehenden Verbindung zugeordnet
invalidKann nicht identifiziert werden — immer verwerfen
untrackedUmgeht explizit conntrack

NAT und Port-Weiterleitung

NAT-Tabelle erstellen

sudo nft add table inet nat
sudo nft add chain inet nat prerouting  { type nat hook prerouting priority -100 \; }
sudo nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; }

Masquerade (Source-NAT für Router/VPNs)

sudo nft add rule inet nat postrouting oif "eth0" masquerade

Port-Weiterleitung (Destination-NAT)

sudo nft add rule inet nat prerouting iif "eth0" tcp dport 8080 dnat to 10.0.0.50:80
sudo nft add rule inet filter forward ip daddr 10.0.0.50 tcp dport 80 ct state new accept
sudo nft add rule inet filter forward ct state established,related accept

IP-Weiterleitung aktivieren:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-nftables.conf
sudo sysctl -p /etc/sysctl.d/99-nftables.conf

Protokollierung und Überwachung

sudo nft add rule inet filter input ct state invalid log prefix "nft_invalid: " level warn drop
sudo journalctl -k --grep="nft_" -f
sudo nft monitor

Regelsätze Speichern und Wiederherstellen

sudo nft list ruleset | sudo tee /etc/nftables.conf
sudo nft -c -f /etc/nftables.conf      # Syntax-Trockentest
sudo nft -f /etc/nftables.conf          # atomar anwenden

Migration von iptables

Einzelne Regeln Übersetzen

iptables-translate -A INPUT -p tcp --dport 443 -j ACCEPT
# Ausgabe: nft add rule ip filter INPUT tcp dport 443 counter accept

Vollständigen Regelsatz Übersetzen

sudo iptables-save > /tmp/ipt-backup.txt
iptables-restore-translate -f /tmp/ipt-backup.txt > /tmp/nft-migrated.nft
sudo nft -f /tmp/nft-migrated.nft

Bewährte Migrationspraktiken

  1. Zuerst sichernsudo iptables-save > ~/iptables-backup.txt
  2. Übersetzen und überprüfen — wenden Sie nie automatisch übersetzte Regeln ohne Prüfung an
  3. Nicht-Produktionsumgebung testen — übersetzte Regeln zuerst auf Testserver anwenden
  4. Konsolensitzung bereithalten — Cloud-Konsole oder KVM-Zugang als Fallback
  5. iptables nach Bestätigung leerensudo iptables -F && sudo iptables -X
  6. Legacy-Dienst deaktivierensudo systemctl disable iptables

systemd-Integration

sudo systemctl enable nftables
sudo systemctl start nftables
sudo systemctl reload nftables    # atomares Regelsatz-Neuladen

Vergleich: nftables vs iptables vs UFW vs firewalld

FunktionnftablesiptablesUFWfirewalld
Einzelnes Tool für allesJaNein (4 Tools)Ja (Frontend)Ja (Frontend)
IPv4 + IPv6 in einer TabelleJa (inet)NeinJaJa
Native Sets/MapsJaNein (braucht ipset)NeinNein
Atomarer RegelaustauschJa (nft -f)NeinNeinTeilweise
Vereinfachte SchnittstelleNeinNeinJaJa
Scripting-FlexibilitätHochMittelNiedrigMittel
Leistung bei SkalierungAusgezeichnetGutGutGut

Praxisszenario: Webserver und Reverse-Proxy

Sie haben einen Produktionsserver auf dem Nginx als Reverse-Proxy vor zwei Anwendungsservern unter 10.0.0.10 und 10.0.0.11 läuft, mit einer öffentlichen Schnittstelle (eth0) und einer internen (eth1). Anforderungen: SSH-Zugang nur von Ihrem Management-CIDR, öffentliches HTTP/HTTPS, Backend-Datenverkehr nur aus dem internen Netzwerk und SSH-Brute-Force-Schutz.

#!/usr/sbin/nft -f

flush ruleset

define WAN = eth0
define LAN = eth1
define MGMT_CIDR = 10.10.10.0/24

table inet filter {
    set mgmt_hosts {
        type ipv4_addr
        flags interval
        elements = { $MGMT_CIDR }
    }

    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif lo accept
        ip protocol icmp limit rate 10/second burst 20 packets accept
        ip saddr @mgmt_hosts tcp dport 22 ct state new \
          meter ssh_mgmt { ip saddr limit rate 5/minute burst 10 packets } accept
        tcp dport { 80, 443 } accept
        reject with icmpx type port-unreachable
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
        ct state established,related accept
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Tücken und Sonderfälle

  • Regelreihenfolge ist wichtig — nftables wertet Regeln von oben nach unten aus. Platzieren Sie ct state established,related accept vor allen Drop-Regeln.
  • Keine Standard-Tabellen oder Chains — nftables startet leer. Wenn Sie vergessen eine Chain zu erstellen, wird der Datenverkehr überhaupt nicht gefiltert.
  • flush ruleset ist destruktiv — schließen Sie es immer am Anfang von Konfigurationsdateien ein, führen Sie es aber nie interaktiv auf einem Live-Server ohne Backup-Plan aus.
  • Variablen erfordern define — nftables verwendet define VAR = value in Konfigurationsdateien; Sie können Shell-Variablen nicht direkt in nft-Befehlen verwenden.
  • iptables und nftables können in Konflikt geraten — wenn beide laufen, gelten Regeln aus beiden Frameworks unabhängig voneinander.

Fehlerbehebung

Regeln bleiben nach Neustart nicht erhalten: Prüfen Sie ob der Dienst aktiviert ist mit sudo systemctl is-enabled nftables. Stellen Sie sicher dass /etc/nftables.conf flush ruleset am Anfang enthält und gültige nft-Syntax hat.

SSH nach Regelanwendung gesperrt: Zugang über Cloud-Konsole, dann sudo nft flush ruleset ausführen. Konfiguration neu aufbauen mit SSH-Erlaubnis bevor eine Drop-Policy gesetzt wird.

Kernel-Modul fehlt: lsmod | grep nf_tables ausführen. Falls fehlend, laden mit sudo modprobe nf_tables nft_chain_nat nft_ct.

Syntaxfehler in Konfigurationsdatei: sudo nft -c -f /etc/nftables.conf für einen Trockentest verwenden der die genaue Zeile und den Fehler meldet ohne Änderungen anzuwenden.

Zusammenfassung

nftables ist der produktionsbereite Ersatz für iptables auf jedem Linux-System mit Kernel 3.13 oder höher. Sein einheitlicher nft-Befehl, native Sets und Maps, atomares Regelladung und sauberere Syntax beheben jede wichtige strukturelle Schwäche der veralteten Tool-Chain.

Wichtige Erkenntnisse:

  • Verwenden Sie die Adressfamilie inet um IPv4 und IPv6 aus einer einzigen Tabelle zu verwalten
  • Beginnen Sie immer mit ct state established,related accept und iif lo accept
  • Verwenden Sie benannte Sets um Listen von Ports und IPs zu verwalten ohne Regeln neu zu schreiben
  • Schützen Sie Authentifizierungsdienste mit Pro-IP-Metern statt globaler Ratenbegrenzung
  • Speichern Sie den Regelsatz in /etc/nftables.conf und laden Sie ihn atomar mit nft -f
  • Aktivieren Sie den nftables-systemd-Dienst damit der Regelsatz nach Neustarts bestehen bleibt
  • Verwenden Sie iptables-restore-translate um bestehende Regelsätze zu konvertieren und prüfen Sie sorgfältig vor der Anwendung

Verwandte Artikel