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
| Familie | Verarbeiteter Datenverkehr |
|---|---|
ip | Nur IPv4 |
ip6 | Nur IPv6 |
inet | IPv4 und IPv6 (für Server empfohlen) |
arp | ARP-Protokoll |
bridge | Bridge-/Switch-Ebene |
netdev | Ingress 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
| Zustand | Bedeutung |
|---|---|
new | Erstes Paket einer neuen Verbindung |
established | Rücklaufverkehr für eine akzeptierte Verbindung |
related | Zu einer bestehenden Verbindung zugeordnet |
invalid | Kann nicht identifiziert werden — immer verwerfen |
untracked | Umgeht 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
- Zuerst sichern —
sudo iptables-save > ~/iptables-backup.txt - Übersetzen und überprüfen — wenden Sie nie automatisch übersetzte Regeln ohne Prüfung an
- Nicht-Produktionsumgebung testen — übersetzte Regeln zuerst auf Testserver anwenden
- Konsolensitzung bereithalten — Cloud-Konsole oder KVM-Zugang als Fallback
- iptables nach Bestätigung leeren —
sudo iptables -F && sudo iptables -X - Legacy-Dienst deaktivieren —
sudo 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
| Funktion | nftables | iptables | UFW | firewalld |
|---|---|---|---|---|
| Einzelnes Tool für alles | Ja | Nein (4 Tools) | Ja (Frontend) | Ja (Frontend) |
| IPv4 + IPv6 in einer Tabelle | Ja (inet) | Nein | Ja | Ja |
| Native Sets/Maps | Ja | Nein (braucht ipset) | Nein | Nein |
| Atomarer Regelaustausch | Ja (nft -f) | Nein | Nein | Teilweise |
| Vereinfachte Schnittstelle | Nein | Nein | Ja | Ja |
| Scripting-Flexibilität | Hoch | Mittel | Niedrig | Mittel |
| Leistung bei Skalierung | Ausgezeichnet | Gut | Gut | Gut |
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 acceptvor 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 verwendetdefine VAR = valuein Konfigurationsdateien; Sie können Shell-Variablen nicht direkt innft-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
inetum IPv4 und IPv6 aus einer einzigen Tabelle zu verwalten - Beginnen Sie immer mit
ct state established,related acceptundiif 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.confund laden Sie ihn atomar mitnft -f - Aktivieren Sie den nftables-systemd-Dienst damit der Regelsatz nach Neustarts bestehen bleibt
- Verwenden Sie
iptables-restore-translateum bestehende Regelsätze zu konvertieren und prüfen Sie sorgfältig vor der Anwendung