Für die docker-compose
Verwendung von Bridge-Netzwerken zum Erstellen eines privaten Netzwerks zwischen Containern docker0
funktioniert die akzeptierte Lösung nicht, da die Ausgangsschnittstelle aus den Containern nicht, docker0
sondern eine zufällig generierte Schnittstellen-ID ist, z.
$ ifconfig
br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.1 netmask 255.255.240.0 broadcast 192.168.47.255
Leider ist diese zufällige ID nicht vorhersehbar und ändert sich jedes Mal, wenn compose das Netzwerk neu erstellen muss (z. B. bei einem Neustart des Hosts). Meine Lösung hierfür besteht darin, das private Netzwerk in einem bekannten Subnetz zu erstellen und so zu konfigurieren iptables
, dass dieser Bereich akzeptiert wird:
Datei-Snippet verfassen:
version: "3.7"
services:
mongodb:
image: mongo:4.2.2
networks:
- mynet
# rest of service config and other services removed for clarity
networks:
mynet:
name: mynet
ipam:
driver: default
config:
- subnet: "192.168.32.0/20"
Sie können das Subnetz ändern, wenn Ihre Umgebung dies erfordert. Ich habe willkürlich ausgewählt, 192.168.32.0/20
indem ich verwendet habe, um docker network inspect
zu sehen, was standardmäßig erstellt wurde.
iptables
Auf dem Host so konfigurieren , dass das private Subnetz als Quelle zugelassen wird:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
Dies ist die einfachste mögliche iptables
Regel. Möglicherweise möchten Sie weitere Einschränkungen hinzufügen, z. B. nach Zielport. Vergessen Sie nicht, Ihre iptables-Regeln beizubehalten, wenn Sie froh sind, dass sie funktionieren.
Dieser Ansatz hat den Vorteil, dass er wiederholbar und daher automatisierbar ist. Ich benutze ansible das template
Modul meine compose Datei mit Variablensubstitution zu implementieren und dann die Verwendung iptables
und shell
Module zu konfigurieren und die Firewall - Regeln bestehen, respectively.