Docker mit nftables ausprobiert
Die Docker Engine 29 unter Linux unterstützt erstmals Firewalls auf nftables-Basis. Die Funktion ist explizit noch experimentell, aber wegen der zunehmenden Probleme mit dem veralteten iptables-Backend geht für Docker langfristig kein Weg daran vorbei. Also habe ich mir gedacht, probiere ich das Feature einfach einmal aus. Mein Testkandidat war Fedora 43 (eine reale Installation auf einem x86-Mini-PC sowie eine virtuelle Maschine unter ARM).
Inbetriebnahme
Das nft-Backend aktivieren Sie mit der folgenden Einstellung in der Datei /etc/docker/daemon.json:
{
"firewall-backend": "nftables"
}
Diese Datei existiert normalerweise nicht, muss also erstellt werden. Die Syntax ist hier zusammengefasst.
Die Docker-Dokumentation weist darauf hin, dass Sie außerdem IP-Forwarding erlauben müssen. Alternativ können Sie Docker anweisen, auf Forwarding zu verzichten ("ip-forward": false in daemon.json) — aber dann funktionieren grundlegende Netzwerkfunktionen nicht.
# Datei /etc/sysctl.d/99-docker.conf
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
sysctl --system aktiviert die Änderungen ohne Reboot.
Die Docker-Dokumentation warnt allerdings, dass dieses Forwarding je nach Anwendung zu weitreichend sein und Sicherheitsprobleme verursachen kann. Gegebenenfalls müssen Sie das Forwarding durch weitere Firewall-Regeln wieder einschränken. Die Dokumentation gibt ein Beispiel, um auf Rechnern mit firewalld unerwünschtes Forwarding zwischen eth0 und eth1 zu unterbinden. Alles in allem wirkt der Umgang mit dem Forwarding noch nicht ganz ausgegoren.
Praktische Erfahrungen
Mit diesen Einstellungen lässt sich die Docker Engine prinzipiell starten (systemctl restart docker, Kontrolle mit docker version oder systemctl status docker). Welches Firewall-Backend zum Einsatz kommt, verrät docker info:
docker info | grep 'Firewall Backend'
Firewall Backend: nftables+firewalld
Ich habe dann ein kleines Compose-Setup bestehend aus MariaDB und WordPress gestartet. Soweit problemlos:
docker compose up -d
[+] Running 2/2
Container wordpress-sample-wordpress-1 Running 0.0s
Container wordpress-sample-db-1 Running 0.0s
Attaching to db-1, wordpress-1
docker compose ps
NAME IMAGE ... PORTS
wordpress-sample-db-1 mariadb:latest 3306/tcp
wordpress-sample-wordpress-1 wordpress:latest 127.0.0.1:8082->80/tcp
Firewall-Regeln
Auch wenn ich kein nft-Experte bin, wollte ich mir zumindest einen Überblick verschaffen, wie die Regeln hinter den Kulissen funktionieren und welchen Umfang sie haben:
# ohne Docker (nur firewalld)
nft list tables
table inet firewalld
nft list ruleset | wc -l
374
# nach Start der Docker Engine (keine laufenden Container)
nft list tables
table inet firewalld
table ip docker-bridges
table ip6 docker-bridges
nft list ruleset | wc -l
736
Im Prinzip richtet Docker also zwei Regeltabellen docker-bridges ein, je eine für IPv4 und für IPv6. Die zentralen Regeln für IPv4 sehen so aus (hier etwas kompakter als üblich formatiert):
nft list table ip docker-bridges
table ip docker-bridges {
map filter-forward-in-jumps {
type ifname : verdict
elements = { "docker0" : jump filter-forward-in__docker0 }
}
map filter-forward-out-jumps {
type ifname : verdict
elements = { "docker0" : jump filter-forward-out__docker0 }
}
map nat-postrouting-in-jumps {
type ifname : verdict
elements = { "docker0" : jump nat-postrouting-in__docker0 }
}
map nat-postrouting-out-jumps {
type ifname : verdict
elements = { "docker0" : jump nat-postrouting-out__docker0 }
}
chain filter-FORWARD {
type filter hook forward priority filter; policy accept;
oifname vmap @filter-forward-in-jumps
iifname vmap @filter-forward-out-jumps
}
chain nat-OUTPUT {
type nat hook output priority dstnat; policy accept;
ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump nat-prerouting-and-output
}
chain nat-POSTROUTING {
type nat hook postrouting priority srcnat; policy accept;
iifname vmap @nat-postrouting-out-jumps
oifname vmap @nat-postrouting-in-jumps
}
chain nat-PREROUTING {
type nat hook prerouting priority dstnat; policy accept;
fib daddr type local counter packets 0 bytes 0 jump nat-prerouting-and-output
}
chain nat-prerouting-and-output {
}
chain raw-PREROUTING {
type filter hook prerouting priority raw; policy accept;
}
chain filter-forward-in__docker0 {
ct state established,related counter packets 0 bytes 0 accept
iifname "docker0" counter packets 0 bytes 0 accept comment "ICC"
counter packets 0 bytes 0 drop comment "UNPUBLISHED PORT DROP"
}
chain filter-forward-out__docker0 {
ct state established,related counter packets 0 bytes 0 accept
counter packets 0 bytes 0 accept comment "OUTGOING"
}
chain nat-postrouting-in__docker0 {
}
chain nat-postrouting-out__docker0 {
oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 0 bytes 0 masquerade comment "MASQUERADE"
}
}
Diese Tabelle richtet NAT-Hooks für Pre- und Postrouting ein, die über Verdict-Maps (Datenstrukturen zur Zuordnung von Aktionen) später dynamisch auf bridge-spezifische Chains weiterleiten können. Für das Standard-Docker-Bridge-Netzwerk (docker0, 172.17.0.0/16) sind bereits Filter-Chains vorbereitet, die etablierte Verbindungen akzeptieren, Inter-Container-Kommunikation erlauben würden und nicht veröffentlichte Ports blocken, sowie eine Masquerading-Regel für ausgehenden Traffic von Containern, damit diese über die Host-IP auf das Internet zugreifen können. Die meisten Chains sind vorerst leer oder inaktiv (nat-prerouting-and-output, raw-PREROUTING, nat-postrouting-in__docker0). Wenn Docker Container ausführt, interne Netzwerk bildet etc., kommen weitere Regeln innerhalb von ip docker-bridges hinzu.
Zusammenspiel mit libvirt/virt-manager
Vor ca. einem halben Jahr bin ich das erste Mal über das nicht mehr funktionierende Zusammenspiel von Docker mit iptables und libvirt mit nftables gestolpert (siehe hier). Zumindest bei meinen oberflächlichen Tests klappt das jetzt: libvirt muss nicht auf iptables zurückgestellt werden sondern kann bei der Defaulteinstellung nftables bleiben. Dafür muss Docker wie in diesem Beitrag beschrieben ebenfalls auf nftables umgestellt werden. Nach einem Neustart (erforderlich, damit alte iptables-Docker-Regeln garantiert entfernt werden!) kooperieren Docker und libvirt so wie sie sollen. libvirt erzeugt für seine Netzwerkfunktionen zwei weitere Regeltabellen:
nft list tables
table inet firewalld
table ip docker-bridges
table ip6 docker-bridges
table ip libvirt_network
table ip6 libvirt_network
Einschränkungen und Fazit
- Die Docker-Dokumentation weist darauf hin, dass das nftables-Backend noch keine Overlay-Regeln erstellt, die für den Betrieb von Docker Swarm notwendig sind. Docker Swarm funktioniert also aktuell nicht, wenn Sie Docker auf nftables umstellen. Für mich ist das kein Problem, weil ich Docker Swarm ohnedies nicht brauche.
-
Ich habe meine Tests nur unter Fedora durchgeführt. (Meine Zeit ist auch endlich.) Es ist anzunehmen, dass RHEL plus Klone analog funktionieren, aber das bleibt abzuwarten. Debian + Ubuntu wären auch zu testen …
-
Ich habe nur einfache compose-Setups ausprobiert. Natürlich kein produktiver Einsatz.
-
Meine nftables- und Firewall-Kenntnisse reichen nicht aus, um eventuelle Sicherheitsimplikationen zu beurteilen, die sich aus der Umstellung von iptables auf nftables ergeben.
Losgelöst von den Docker-spezifischen Problemen zeigt dieser Blog-Beitrag auch, dass das Zusammenspiel mehrerer Programme (firewalld, Docker, libvirt, fail2ban, sonstige Container- und Virtualisierungssysteme), die jeweils ihre eigenen Firewall-Regeln benötigen, alles andere als trivial ist. Es würde mich nicht überraschen, wenn es in naher Zukunft noch mehr unangenehme Überraschungen gäbe, dass also der gleichzeitige Betrieb der Programme A und B zu unerwarteten Sicherheitsproblemen führt. Warten wir es ab …
Insofern ist die Empfehlung, beim produktiven Einsatz von Docker auf dem Host möglichst keine anderen Programme auszuführen, nachvollziehbar. Im Prinzip ist das Konzept ja nicht neu — jeder Dienst (Web, Datenbank, Mail usw.) bekommt möglichst seinen eigenen Server bzw. seine eigene Cloud-Instanz. Für große Firmen mit entsprechender Server-Infrastruktur sollte dies ohnedies selbstverständlich sein. Bei kleineren Server-Installationen ist die Auftrennung aber unbequem und teuer.
Quellen/Links
- https://kofler.info/dockers-nft-inkompatibilitaet-wird-zunehmend-zum-aergernis/
- https://docs.docker.com/engine/release-notes/29/
- https://docs.docker.com/engine/network/firewall-nftables/
- https://docs.docker.com/engine/network/firewall-nftables/#migrating-from-iptables-to-nftables
- https://docs.docker.com/engine/daemon/
- https://docs.docker.com/engine/security/#docker-daemon-attack-surface
Der Linux Coffee Talk ist das entspannte Monatsformat bei fosstopia. Hier fassen wir die spannendsten Ereignisse und Entwicklungen der letzten Wochen für Euch zusammen und ordnen es ein. Also schnappt euch einen Kaffee, Tee oder Euer Lieblingsgetränk, macht es euch gemütlich und lasst uns den November Revue passieren. In dieser Ausgabe blicken wir auf die […]




Das GNOME Projekt hat die Version 49.2 veröffentlicht und liefert damit das zweite Pointrelease für die aktuelle Brescia Serie. Rund sechs Wochen nach dem letzten Release folgt nun eine Sammlung von Verbesserungen und Fehlerkorrekturen, die den Alltag vieler Nutzer spürbar erleichtern sollen. Besonders auffällig sind die Änderungen an der Eingabe und Darstellung. Sticky Keys und […]
TUXEDO Computers hat überraschend die Arbeiten am geplanten Snapdragon X Elite Notebook eingestellt. Das ambitionierte Linux Gerät wird nicht erscheinen. Die Entwickler wollen ihre bisherige Arbeit jedoch nicht komplett verwerfen. Sie haben neue Device Tree Patches veröffentlicht und hoffen auf Nutzen für andere Systeme. Die Entscheidung stößt jedoch auf Widerstand in der Kernel Gemeinschaft. Zwar […]
Die Entwickler von Bottles haben Version 60.0 veröffentlicht und liefern damit ein starkes Update für alle, die Windows Anwendungen bequem unter Linux nutzen möchten. Die Software baut auf Wine auf und bietet eine grafische Oberfläche, die den Umgang mit komplexen Konfigurationen deutlich erleichtert. Eine der wichtigsten Neuerungen ist die native Wayland Unterstützung. Nutzer moderner Linux […]
Nach acht Monaten Pause meldet sich KeePassXC mit Version 2.7.11 zurück. Der freie Passwortmanager bleibt ein zentraler Baustein für Nutzerinnen und Nutzer, die Wert auf Sicherheit und Plattformvielfalt legen. Windows, macOS und Linux werden weiterhin unterstützt und die Community treibt die Entwicklung konsequent voran. Besonders auffällig ist der neue Anhangsviewer. Bilder, HTML und Markdown lassen […]
Künstliche Intelligenz ist längst Teil vieler Entwicklungsumgebungen. In der Open Source Szene stößt sie jedoch oft auf Misstrauen. Kritiker verweisen auf rechtliche und moralische Fragen beim Training solcher KI-Systeme. Denn die Grundlage bilden meist fremde Codebestände, was viele Entwickler als problematisch empfinden. Linus Torvalds gilt seit Jahrzehnten als pragmatischer Kopf der Kernelwelt. Beim jüngsten Open […]
Wichtiger Hinweis:
KDE veröffentlicht Plasma 6.5.3 und setzt damit den Weg zu mehr Stabilität fort. Die neue Ausgabe erscheint kurz nach Version Plasma 6.5.2 und liefert viele Feinheiten, die den Alltag spürbar verbessern. Neue Funktionen gibt es nicht, doch die Pflege des Desktops bleibt im Mittelpunkt. Die Arbeit am Breeze Theme sorgt für ein abgerundetes Erscheinungsbild auf […]


Die Entwickler hinter LibreOffice haben eine neue Ausgabe der beliebten Office Suite veröffentlicht. Die Version 25.8.3 richtet sich an alle Nutzer, die mehr Stabilität und ein verlässliches Arbeitsumfeld wünschen. Die Aktualisierung folgt rund fünf Wochen nach der vorherigen Ausgabe und verbessert laut Ankündigung viele Details, die im Alltag stören konnten. Die neue Version behebt insgesamt […]
openSUSE Tumbleweed führt mit neuen Installationen eine deutliche Änderung im Startprozess ein. Das System verwendet nun standardmäßig eine aktualisierte Variante des bekannten Boot Programms Grub. Diese Lösung folgt einem frischen Konzept, das einzelne Einträge für jeden Kernel nutzt und so den Aufbau des Startmenüs einfacher und klarer macht. Der bisher genutzte zentrale Ablaufplan wird damit […]
Mozilla hat eine neue Version von Thunderbird veröffentlicht. Die beliebte Anwendung steht nun als Ausgabe 145 bereit und bringt einige wichtige Neuerungen für den täglichen Einsatz. Viele Änderungen betreffen die technische Basis, doch auch sichtbare Verbesserungen sind dabei. Eine zentrale Neuerung betrifft die Anbindung an Exchange Systeme. Thunderbird kann nun direkt mit Exchange Web Services […]
Die neue Ausgabe von Debian 13.2 ist knapp zwei Monate nach Debian 13.1 erschienen und vereint zahlreiche Korrekturen der letzten Wochen in einem stimmigen Paket. Das Projekt richtet den Fokus klar auf Sicherheit und Stabilität und liefert damit eine gestärkte Grundlage für neue und bestehende Systeme. Viele weit verbreitete Programme wurden bedacht. Dazu gehören zentrale […]
Red Hat hat die Verfügbarkeit von Red Hat Enterprise Linux (RHEL) 10.1 bekannt gegeben. Die neue Ausgabe der Unternehmensplattform setzt auf den aktuellen Kernel 6.12. Der Schwerpunkt liegt auf moderner KI und hoher Sicherheit für anspruchsvolle Umgebungen. Die Version richtet sich vor allem an Firmen und Nutzer mit stark regulierten Abläufen. Ein zentrales Thema ist […]
Canonical hat die Supportlaufzeit für Ubuntu Pro deutlich verlängert. Mit dem sogenannten Legacy Add-on erhalten Langzeitversionen von Ubuntu nun bis zu 15 Jahre Sicherheits- und Wartungsunterstützung. Diese Erweiterung richtet sich besonders an Unternehmen, die auf stabile, langjährige IT-Infrastrukturen angewiesen sind. Ursprünglich bot Ubuntu Pro bereits zehn Jahre Support: fünf Jahre reguläre Sicherheitsaktualisierungen und fünf Jahre […]
Das Budgie-Team hat Version 10.9.4 seiner beliebten Desktop-Umgebung veröffentlicht. Der Fokus dieses Updates liegt auf technischen Verbesserungen im Hintergrund, weniger auf sichtbaren Neuerungen für Anwender. Die Veröffentlichung bereitet die kommende Hauptversion 10.10 vor und sorgt für eine modernere Basis im Code. Zu den wichtigsten Änderungen gehört die Unterstützung für libpeas 2 und Girepository 2.0. Damit […]