Die folgenden Konfigurationsänderungen sollten den Datenverkehr zwischen Docker und dem Shorewall-Host sicherstellen. Getestet auf Shorewall 4.5.21.9, sollte aber für die neuesten Versionen gelten:
/etc/shorewall/shorewall.conf
Stellen Sie sicher, dass die IP-Weiterleitung aktiviert ist (die meisten Konfigurationselemente sind Ja / Nein, aber dieses ist "Ein"):
IP_FORWARDING=On
/ etc / shorewall / masq
Aktivieren Sie Masquerading (NAT) für Ihr privates Docker-Netzwerk (wenn Sie ein anderes Netzwerk verwenden, dh Docker mit starten --bip=#.#.#.#/#
, ändern Sie dies entsprechend). Wechseln Sie eth0
zu einer beliebigen Schnittstelle auf dem Hostcomputer mit externer Konnektivität:
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
/ etc / shorewall / interfaces
Fügen Sie einen Schnittstelleneintrag hinzu, damit Shorewall weiß, zu welcher Schnittstelle die dock
Zone gehört:
#ZONE INTERFACE OPTIONS
dock docker0
/ etc / shorewall / areas
Erstellen Sie eine neue Zone. Hinweis: docker
Ist zu lang und verursacht den Fehler "Ungültiger Zonenname".
#ZONE INTERFACE
dock ipv4
/ etc / shorewall / policy
Möglicherweise möchten Sie Docker-Containern ermöglichen, mit dem Hostcomputer und dem Internet zu kommunizieren. Dies ist also ein guter Ausgangspunkt:
#SOURCE DEST POLICY
# ...(other policies)...
dock all ACCEPT
# ...(other policies, catch-all)...
Möglicherweise benötigen Sie auch eine ähnliche ACCEPT
Richtlinie für den Datenverkehr von fw
bis dock
, wenn Sie sie nicht bereits mit fw
bis geöffnet haben all
.
Sie können dies auch in den straffen Politik oder Regeln Dateien nach Bedarf. Zum Beispiel lässt das oben Gesagte nicht ausdrücklich zu, dass der Außenverkehr Ihre Docker-Container erreicht. Überprüfen Sie Ihre anderen Zonen / Richtlinien / Regeln dafür.
IP_FORWARDING=Yes
und auchIP_FORWARDING=True
arbeiten. Ich habe es auf mehreren Produktionsroutern, aber Ihre Antwort ist viel klarer als meine. Gute Arbeit./etc/shorewall/interfaces
.Seit Docker die Funktion zur Netzwerkisolierung eingeführt hat, reichen die anderen hier genannten Lösungen nicht mehr aus, wenn Sie benutzerdefinierte Netzwerke verwenden möchten. Shorewall 5.0.6 bietet Unterstützung für Docker einschließlich Docker-Netzwerken. Dies:
quelle
Hab es einfach auf meiner Box rausgefunden. Stellen Sie sicher, dass /etc/shorewall.conf Folgendes enthält:
IP_FORWARDING=Yes
Docker ist auf die Weiterleitung angewiesen, und ich habe darauf geachtet, dass diese Marionette auf allen Servern "Nein" setzt.
Update: Vermutlich müssen Sie auch den vom Docker kommenden Datenverkehr über Ihre WAN-Schnittstelle maskieren.
Bearbeiten
/etc/shorewall/masq
und Sie benötigen eine Zeile ähnlich der folgenden:br0 172.17.0.0/12
In diesem Fall ist meine WAN-Schnittstelle tatsächlich br0 (eine Bridge), aber Ihre wird wahrscheinlich so etwas wie eth0 sein. (Verwenden
ifconfig
Sie diese Option , um Ihre Schnittstellen und deren IP-Adressen anzuzeigen.) Auf meinem Computer verwendet Docker 172.17.0.0/24, einen privaten RFC1918-Adressbereich. Dies kann auf anderen Systemen unterschiedlich sein, aber Sie können den Bereich anzeigen, indem Sieifconfig
erneut nach der Schnittstelle suchendocker0
.quelle
Sie können sicherstellen, dass der Docker-Regelsatz einen Shorewall-Neustart übersteht, indem Sie Erweiterungsskripts erstellen, die die
DOCKER
Kette vor dem Neustart speichern und sie anschließend erneut wiederherstellen. Ich habe gerade einen Beitrag mit einem Beispiel dafür verfasst , obwohl ich mir sicher bin, dass dies bei weitem nicht die einzig mögliche Methode ist.quelle
Der Docker-Dienst kann neu gestartet werden, ohne die ausgeführten Container zu beeinträchtigen. Er kann nach einem Shorewall-Neustart ausgeführt werden, um die Docker-spezifischen Regeln neu zu laden. Es wird offensichtlich eine kurze Zeit geben, in der die Netzwerkverbindung zu den Containern unterbrochen wird.
Dies gilt zumindest für meine wenigen Archlinux-Installationen.
quelle
Durch die Aktualisierungsaktion wird die Iptable nicht gelöscht. Wenn Sie also nur Regeln oder Richtlinien aktualisieren möchten, können Sie nur eine Aktualisierung ausführen, anstatt einen Neustart durchzuführen:
Offensichtlich bleibt das Problem weiterhin bestehen, wenn Sie Shorewall wirklich neu starten müssen. Anschließend müssen Sie docker neu starten und Ihre Container neu starten.
quelle
Eine mögliche Option besteht darin, Docker mit der Option --net = host auszuführen, um ein Host-Netzwerk mit containerisiertem Anwendungszugriff ohne IP-Weiterleitung und NAT zuzulassen.
quelle