Auf meinen Servern nutze ich gerne Debian als Betriebssystem und ufw (Uncomplicated Firewall) als Firewalllösung, weil sie deutlich einfacher zu bedienen ist. ufw ist zwar nur ein Kommandozeilen-Frontend und nutzt im Hintergrund iptables, die Regeln lassen sich aber deutlich einfacher formulieren.
Docker und Firewalls
Der Docker Daemon kommuniziert direkt mit der Systemfirewall iptables. Startet man also einen Container und öffnet darin einen Port, sorgt Docker bereits von selbst dafür, dass dieser von außen erreichbar ist. In der Auflistung von ufw ist davon nichts zu sehen, da Docker die Regeln direkt einträgt und nicht über ufw geht.
Port geöffnet (oder doch nicht?)
Obwohl Docker den Port direkt öffnet und Traefik sowie alle Dienste, die ich dort eingetragen habe, von außen erreichbar sind, ist es teilweise zu Problemen gekommen.
- Traefik hat teilweise Probleme bei der Zertifikatserstellung /-erneuerung über die HTTP- oder TLS-Challenge.
- Docker Container können andere Container über die öffentliche Adresse nicht erreichen, die in der gleichen Docker Umgebung laufen.
Zusätzliche Regel als Lösung
Gelöst werden diese Probleme, wenn man in ufw die Ports von Traefik freigibt. Da dieser als Reverse Proxy die Ports 80 (http) und 443 (https) nutzt, kann man die in ufw vordefinierte Kurzangabe “WWW Full” nutzen:
sudo ufw allow "WWW Full"
Danach sind alle Probleme verschwunden und alles wie gewünscht erreichbar.
Fazit
Eigentlich erledigt Docker die Freigabe der Ports, aber irgendwie dann doch nicht wenn so etwas wie ufw läuft. Leider weiß ich nicht genau was das Problem ist, vermutlich berücksichtigt der Docker Daemon nur einen Teil in den Firewallregeln und sobald ein weiterer Akteur an den Regeln arbeitet kommt es zu Nebeneffekten.
Bleibt also nur, zukünftig jede Portfreigabe in Docker ebenfalls in ufw einzutragen (und wieder zu entfernen, wenn man den Container entfernt) oder aber diesen Umstand einfach nur im Hinterkopf zu behalten und nur dann eine zusätzliche Regel zu setzen, wenn es bei der reinen Freigabe durch Docker zu Problemen kommt.