Sie scheinen diesen Teil des Problems zumindest in der neuesten Version 1.4.1 gelöst zu haben. Meine FORWARD-Richtlinie lautet, Pakete zu verwerfen, und die Kommunikation zwischen Containern funktioniert problemlos.
Dies sind die Standardregeln in der von Docker erstellten FORWARD-Kette:
$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
6902 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6151 482K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Von unten nach oben:
- Die dritte Regel ist Docker-> Docker-Kommunikation, die ohne Einschränkungen akzeptiert wird.
- Die zweite Regel ist Docker-> überall (aber nicht Docker), was ebenfalls ohne Einschränkungen akzeptiert wird.
- Die erste Regel ist überall-> Docker, nur "Antwort" -Pakete werden akzeptiert.
Keine Probleme hier. (Es sei denn, Sie möchten ausgehende Filter)
Sie können die FORWARD + INPUT-Richtlinie problemlos auf DROP / REJECT setzen.
Jetzt möchten Sie möglicherweise einen Dienst im Internet bereitstellen. ZB ein einfacher Webserver:
$ docker run -d -p 80:80 dockerfile/nginx
OK, gehen Sie jetzt zu yourserver.com. Sie sehen die Standard-Nginx-Seite. Warum? Docker hat einige spezielle Regeln in iptables für Sie hinzugefügt.
$ iptables -vn -t nat -L # NAT table, truncated for clarity
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
189 11900 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.15:80
$ iptables -vnL FORWARD
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.15 tcp dpt:80
6903 96M ACCEPT all -- * docker0 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6159 483K ACCEPT all -- docker0 !docker0 0.0.0.0/0 0.0.0.0/0
3 180 ACCEPT all -- docker0 docker0 0.0.0.0/0 0.0.0.0/0
Diese Regeln umgehen alle ufw-Regeln, wenn ein Container lauscht. ufw macht nichts in der nat-Tabelle und Docker legt seine Regeln an erster Stelle in der FORWARD-Kette fest. Es ist Ihnen also nicht möglich, eine IP-Adresse zu blockieren oder Ratenbegrenzungen jeglicher Art vorzunehmen.
Mögliche Lösungen:
- Starten Sie Docker mit
--iptables=false
und erledigen Sie alles manuell. Sorgfältige Lösung, da bei jedem Neustart eines Containers eine neue IP-Adresse abgerufen wird (dies ist derzeit geplant).
- Binden Sie alle Ports auf localhost mit
-p 127.0.0.1:30080:80
und erstellen Sie Ihre eigenen iptables-Regeln, um dorthin zu gelangen.
- Ufw irgendwie ändern?
- Verwenden Sie kein Firewall-Framework. Ich mache das jetzt. Alle meine Regeln werden in einem separaten Skript als iptables-Befehle gespeichert. Dieses Skript wird nach jedem Neustart ausgeführt
service docker start
. Obwohl ein bisschen hacky es funktioniert ...