TL;DR — Kurzzusammenfassung
nftables ersetzt iptables als moderne Linux-Firewall. Lernen Sie nft-Syntax, Tabellenfamilien, Mengen, NAT, Ratenbegrenzung und Migration von iptables.
nftables ist der offizielle Nachfolger von iptables, ip6tables, arptables und ebtables, die seit Linux-Kernel 4.x in einem einzigen Framework vereint wurden. Wenn Sie noch Firewall-Regeln mit iptables schreiben, zeigt Ihnen dieser Leitfaden, warum nftables besser ist, wie Sie Ihre bestehenden Regeln migrieren und wie Sie mit nft eine vollständige Firewall von Grund auf aufbauen.
Voraussetzungen
- Linux-Kernel 4.x oder neuer (Ubuntu 20.04+, Debian 10+, RHEL/CentOS 8+, Fedora 32+).
- Root- oder sudo-Zugriff.
- Grundlegendes Verständnis von TCP/IP-Netzwerken (Ports, Protokolle, CIDR-Notation).
- Bestehende iptables-Regeln zum Migrieren (optional, aber hilfreich für den Kontext).
Warum nftables?
Das iptables-Ökosystem bestand aus vier separaten Tools — nftables ersetzt sie alle:
- Einheitliches IPv4/IPv6 — Die Familie
inetbehandelt beide in einem einzigen Regelwerk. - Atomare Regelersetzung — Das gesamte Regelwerk wird in einer einzigen Kernel-Transaktion angewendet.
- Bessere Syntax — Eine Regel kann mehrere Ports, Protokolle oder Adressen ohne Wiederholung abgleichen.
- Mengen und Karten — Speichern Sie Tausende von IPs oder Port-Bereichen als kernel-seitige Mengen für O(1)-Suche.
- Bessere Leistung — Weniger Kernel-Aufrufe. Große Regelwerke sind deutlich schneller.
- Ein einziger Befehl —
nftersetztiptables,ip6tables,arptablesundebtables.
Migration von iptables
Die iptables-nft-Kompatibilitätsschicht
Die meisten Distributionen liefern iptables-nft, einen Drop-in-Ersatz, der iptables-Befehle ausführt, aber Regeln im nftables-Kernel-Subsystem speichert:
# Prüfen, welches Backend Ihr iptables verwendet
iptables --version
# iptables v1.8.7 (nf_tables) ← verwendet bereits nftables-Backend
# iptables v1.8.7 (legacy) ← verwendet noch iptables-Backend
Regelübersetzung mit iptables-translate
# Eine einzelne Regel übersetzen
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Ausgabe: nft add rule ip filter INPUT tcp dport 22 counter accept
# Ein gespeichertes Regelwerk übersetzen
iptables-save | iptables-restore-translate -f /etc/nftables.conf
Grundlagen des nft-Befehls
# Gesamtes Regelwerk auflisten
nft list ruleset
# Eine spezifische Tabelle auflisten
nft list table inet filter
# Alles leeren (Vorsicht — löscht alle Regeln)
nft flush ruleset
# Regeln aus einer Datei laden
nft -f /etc/nftables.conf
# Eine Tabelle hinzufügen
nft add table inet filter
# Eine Tabelle löschen (und alle ihre Ketten und Regeln)
nft delete table inet filter
Tabellen und Ketten
Tabellenfamilien
| Familie | Behandelt |
|---|---|
ip | Nur IPv4-Pakete |
ip6 | Nur IPv6-Pakete |
inet | IPv4 und IPv6 (empfohlen für die meisten Regeln) |
arp | ARP-Pakete |
bridge | Pakete, die eine Linux-Bridge durchqueren |
netdev | Pakete von einem spezifischen Netzwerkgerät (ingress-Hook) |
Kettentypen und Hooks
| Kettentyp | Gültige Hooks | Übliche Priorität |
|---|---|---|
filter | prerouting, input, forward, output, postrouting | 0 |
nat | prerouting, input, output, postrouting | -100 |
route | output | -150 |
# Basis-Eingangskette mit drop-Policy erstellen
nft add chain inet filter input \
'{ type filter hook input priority 0 ; policy drop ; }'
# Weiterleitungskette erstellen
nft add chain inet filter forward \
'{ type filter hook forward priority 0 ; policy drop ; }'
Regelzyntax
Regeln bestehen aus Übereinstimmungen (Bedingungen) und Verdikten (Aktionen).
Häufige Übereinstimmungen
# Nach Quell-IP abgleichen
nft add rule inet filter input ip saddr 192.168.1.0/24 accept
# Nach Zielport abgleichen
nft add rule inet filter input tcp dport 443 accept
# Mehrere Ports in einer Regel
nft add rule inet filter input tcp dport { 80, 443, 8080 } accept
# Nach Verbindungsverfolgungsstatus abgleichen
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
# Nach Interface abgleichen
nft add rule inet filter input iifname "lo" accept
Häufige Aktionen (Verdikte)
accept # Paket erlauben
drop # Stillschweigend verwerfen
reject # Verwerfen und ICMP unreachable senden
log # Im Kernel-Log protokollieren (setzt Auswertung fort)
counter # Pakete zählen (setzt Auswertung fort)
jump name # Zu einer anderen Kette springen
return # Aus der aktuellen Kette zurückkehren
Mengen und Karten
Anonyme Mengen (Inline)
# HTTP und HTTPS in einer Regel erlauben
nft add rule inet filter input tcp dport { 80, 443 } accept
Benannte Mengen
# Benannte Menge von IPv4-Adressen erstellen
nft add set inet filter gesperrte_ips { type ipv4_addr ; }
nft add element inet filter gesperrte_ips { 1.2.3.4, 5.6.7.8 }
nft add rule inet filter input ip saddr @gesperrte_ips drop
# Menge mit Intervallen (CIDR-Bereiche)
nft add set inet filter vertrauenswuerdige_netze \
{ type ipv4_addr ; flags interval ; }
nft add element inet filter vertrauenswuerdige_netze \
{ 192.168.0.0/24, 10.0.0.0/8 }
Verdikt-Karten (vmaps)
nft add map inet filter port_verdikt \
{ type inet_service : verdict ; }
nft add element inet filter port_verdikt \
{ 22 : accept, 80 : accept, 443 : accept, 25 : drop }
nft add rule inet filter input tcp dport vmap @port_verdikt
NAT-Konfiguration
nft add table ip nat
nft add chain ip nat prerouting \
'{ type nat hook prerouting priority -100 ; }'
nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100 ; }'
# Masquerade (SNAT für ausgehenden Datenverkehr)
nft add rule ip nat postrouting oifname "eth0" masquerade
# DNAT (Portweiterleitung)
nft add rule ip nat prerouting \
tcp dport 8080 dnat to 192.168.1.100:80
Ratenbegrenzung
# Neue SSH-Verbindungen auf 3 pro Minute pro Quell-IP begrenzen
nft add rule inet filter input \
tcp dport 22 ct state new \
limit rate 3/minute burst 5 packets accept
# ICMP-Ping-Rate begrenzen
nft add rule inet filter input \
ip protocol icmp icmp type echo-request \
limit rate 10/second accept
Protokollierung
# Mit benutzerdefiniertem Präfix protokollieren
nft add rule inet filter input \
log prefix "FIREWALL-DROP: " level warn
# SSH-Zugriff protokollieren und erlauben
nft add rule inet filter input \
tcp dport 22 log prefix "SSH-ZUGRIFF: " level info accept
Persistenz: Regeln Speichern und Wiederherstellen
# Aktuelles Regelwerk speichern
nft list ruleset > /etc/nftables.conf
# systemd-Dienst aktivieren
systemctl enable --now nftables
systemctl reload nftables
Beispiel /etc/nftables.conf
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set vertrauenswuerdiges_ssh {
type ipv4_addr
flags interval
elements = { 192.168.1.0/24, 10.0.0.0/8 }
}
chain input {
type filter hook input priority 0 ; policy drop ;
iifname "lo" accept
ct state established,related accept
ct state invalid drop
ip saddr @vertrauenswuerdiges_ssh tcp dport 22 accept
tcp dport { 80, 443 } accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
}
chain forward {
type filter hook forward priority 0 ; policy drop ;
}
chain output {
type filter hook output priority 0 ; policy accept ;
}
}
Praktische Beispiele
Webserver (Nginx/Apache)
nft add table inet filter
nft add chain inet filter input \
'{ type filter hook input priority 0 ; policy drop ; }'
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input ct state invalid drop
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
nft add rule inet filter input ip protocol icmp accept
Gateway / Router
sysctl -w net.ipv4.ip_forward=1
nft add table ip nat
nft add chain ip nat postrouting \
'{ type nat hook postrouting priority 100 ; }'
nft add rule ip nat postrouting oifname "eth0" masquerade
nft add chain inet filter forward \
'{ type filter hook forward priority 0 ; policy drop ; }'
nft add rule inet filter forward \
iifname "eth1" oifname "eth0" ct state new,established,related accept
nft add rule inet filter forward \
iifname "eth0" oifname "eth1" ct state established,related accept
Vergleich: nftables vs iptables vs firewalld vs ufw
| Merkmal | nftables | iptables | firewalld | ufw |
|---|---|---|---|---|
| IPv4 + IPv6 vereint | Ja (inet) | Nein (separate Tools) | Ja (via nftables) | Teilweise |
| Atomare Aktualisierungen | Ja | Nein | Ja | Nein |
| Mengen / Karten | Nativ | ipset (extern) | Via Rich-Rules | Nein |
| Syntax | Modern, prägnant | Ausführlich | XML / CLI | Einfaches CLI |
| Leistung (große Regelwerke) | Hervorragend | Schlecht (lineares Scan) | Gut | Ausreichend |
| Direkte Kernel-Integration | Ja | Legacy (veraltet) | Frontend | Frontend |
| Lernkurve | Moderat | Niedrig (vertraut) | Niedrig | Sehr niedrig |
Debugging mit nft monitor und Zählern
# Alle netfilter-Ereignisse in Echtzeit überwachen
nft monitor
# Zählerwerte anzeigen
nft list table inet filter
# Zähler zurücksetzen ohne Regeln zu löschen
nft reset counters table inet filter
# Syntax prüfen ohne zu laden
nft -c -f /etc/nftables.conf
# Paketpfad verfolgen
nft add rule inet filter input meta nftrace set 1
nft monitor trace
Zusammenfassung
- nftables vereint iptables, ip6tables, arptables und ebtables in einem einzigen
nft-Befehl. - Verwenden Sie die Familie
inet, um IPv4 und IPv6 in einem einzigen Regelwerk zu behandeln. - Benannte Mengen und Verdikt-Karten ersetzen ipset und komplexe Mehrfachregel-Muster.
- Die atomare Regelersetzung via
nft -feliminiert das Teilaktualisierungsfenster, das iptables betrifft. - Persistieren Sie Regeln in
/etc/nftables.confund aktivieren Sienftables.servicemit systemd.