Für die docker-composeVerwendung von Bridge-Netzwerken zum Erstellen eines privaten Netzwerks zwischen Containern docker0funktioniert die akzeptierte Lösung nicht, da die Ausgangsschnittstelle aus den Containern nicht, docker0sondern 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/20indem ich verwendet habe, um docker network inspectzu sehen, was standardmäßig erstellt wurde.
iptablesAuf 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 iptablesRegel. 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 templateModul meine compose Datei mit Variablensubstitution zu implementieren und dann die Verwendung iptablesund shellModule zu konfigurieren und die Firewall - Regeln bestehen, respectively.