Warum nftables und Docker nicht zusammenpassen – und wie iptables‑legacy dein System rettet
Docker ist für viele Admins das Rückgrat ihrer Self‑Hosting‑Infrastruktur. Container starten, Ports mappen, Reverse‑Proxy davor – fertig. Zumindest in der Theorie. In der Praxis stolpern viele Nutzer über ein Problem, das selten offen dokumentiert wird: Docker und nftables sind bis heute keine guten Freunde.
Dieser Artikel erklärt, warum das so ist, welche Symptome auftreten, wie man sie erkennt – und warum die Umstellung auf iptables‑legacy oft die einzig stabile Lösung ist.
🔥 Das Grundproblem: Docker spricht iptables, nicht nftables
Docker wurde in einer Zeit entwickelt, in der iptables der Standard war.
Als Linux später nftables eingeführt hat, wurde eine Kompatibilitätsschicht geschaffen: iptables‑nft.
Diese soll iptables‑Regeln in nftables übersetzen.
In der Theorie klingt das gut.
In der Praxis führt es zu:
- unvollständigen NAT‑Regeln
- fehlenden DNAT‑Einträgen
- kaputten DOCKER‑Chains
- Race‑Conditions beim Start
- nicht erreichbaren Containern
- mysteriösen Netzwerkfehlern
- Debugging‑Höllen
Docker glaubt weiterhin, iptables zu benutzen – aber die Regeln landen in nftables, wo sie nicht immer korrekt umgesetzt werden.
🧩 Was Docker eigentlich tut
Docker erzeugt beim Start:
- eigene Chains (
DOCKER,DOCKER-USER,DOCKER-ISOLATION-STAGE-1, …) - NAT‑Regeln für Port‑Weiterleitungen
- MASQUERADE‑Regeln für Container‑Netzwerke
- Routing‑Einträge für Bridges
Diese Regeln sind iptables‑Regeln.
Wenn nftables aktiv ist, werden sie durch die Kompatibilitätsschicht übersetzt – und genau dort passieren Fehler.
🚨 Typische Symptome, wenn nftables aktiv ist
Viele Nutzer erkennen das Problem erst spät, weil die Symptome diffus sind:
1. Port‑Mappings funktionieren nicht
docker ps zeigt:
0.0.0.0:8081->80/tcp
Aber:
curl http://127.0.0.1:8081
→ Timeout.
2. Die DOCKER‑Chain ist leer
In nftables:
chain DOCKER {
}
Keine DNAT‑Regeln, keine Weiterleitungen.
3. Docker‑Netzwerke brechen nach Neustarts
Fehler wie:
network not found
oder
failed to create endpoint
4. Reverse‑Proxies funktionieren nicht mehr
Caddy, Traefik oder Nginx melden:
- 502 Bad Gateway
- Connection refused
- Gateway timeout
5. nftables‑Regeln überschreiben Docker‑Regeln
Besonders fatal, wenn man eigene nftables‑Regeln nutzt.
🧨 Warum das passiert: Die Kompatibilitätsschicht ist nicht vollständig
iptables‑nft ist ein Übersetzer – aber kein perfekter.
Probleme entstehen besonders bei:
- NAT‑Regeln
- dynamischen Chains
- Race‑Conditions beim Booten
- parallelen Firewall‑Diensten
- komplexen Docker‑Netzwerken
- Port‑Mappings mit mehreren Bridges
Docker erwartet, dass iptables sofort und deterministisch reagiert.
nftables tut das nicht immer.
🛠️ Die Lösung: iptables‑legacy aktivieren
Die stabilste Lösung ist überraschend einfach:
Docker wieder mit iptables‑legacy betreiben.
Das bedeutet:
- nftables deaktivieren
- iptables‑legacy aktivieren
- Docker neu initialisieren
Danach:
- DOCKER‑Chains funktionieren wieder
- Port‑Mappings funktionieren zuverlässig
- NAT‑Regeln erscheinen sofort
- keine Race‑Conditions mehr
- Reverse‑Proxies laufen stabil
- Container‑Netzwerke sind reproduzierbar
Für Self‑Hosting‑Setups ist das oft die einzig sinnvolle Wahl.
🧠 Wann nftables trotzdem sinnvoll ist
nftables ist moderner, schneller und eleganter.
Es ist großartig für:
- Firewalls ohne Docker
- Router
- Gateways
- komplexe Regelwerke
- statische Server
Aber:
Wenn Docker im Spiel ist, gewinnt iptables‑legacy fast immer.
🧩 Empfehlung für Self‑Hoster
Für Setups wie:
- WordPress
- Nextcloud
- Caddy
- Traefik
- MariaDB
- WireGuard
- Heimserver
- VPS‑Tunnel
- Cloudflare‑Proxy
ist die stabilste Kombination:
- iptables‑legacy
- Docker
- Reverse‑Proxy
- keine nftables‑Firewall parallel
Damit vermeidet man 95 % aller Docker‑Netzwerkprobleme.
🧵 Fazit
nftables ist die Zukunft der Linux‑Firewall – aber Docker lebt noch in der Vergangenheit.
Solange Docker intern iptables‑Regeln erzeugt, bleibt die Kombination mit nftables fehleranfällig.
Wer Docker stabil betreiben will, sollte:
- nftables deaktivieren
- iptables‑legacy aktivieren
- Docker neu initialisieren
Danach laufen Port‑Mappings, Reverse‑Proxies und Container‑Netzwerke wieder zuverlässig.