Docker & Shorewall

16

Ich verwende Shorewall auf meinem Server als einfache Standalone-Firewall und möchte auch Docker verwenden .

Durch die Verwendung eines Docker - Container und seine Anschlussumleitung Docker setzt auf seine eigenen Regeln für iptables / Ketten , die getötet werden, wenn shorewall neu gestartet wird. So wird der Container nicht mehr erreichbar .

Hat es jemand geschafft, die Docker-Regeln nach einem Shorewall-Neustart zu speichern / wiederherzustellen, oder hat jemand eine andere Problemumgehung?

Siehe auch:

jaltek
quelle

Antworten:

19

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 eth0zu 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 dockZone gehört:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / areas

Erstellen Sie eine neue Zone. Hinweis: dockerIst 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 ACCEPTRichtlinie für den Datenverkehr von fwbis dock, wenn Sie sie nicht bereits mit fwbis 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.

fazy
quelle
1
IP_FORWARDING=Yesund auch IP_FORWARDING=Truearbeiten. Ich habe es auf mehreren Produktionsroutern, aber Ihre Antwort ist viel klarer als meine. Gute Arbeit.
Aaron C. de Bruyn
Verzeihen Sie meine Unwissenheit - wenn ich shorewall nach dem Hinzufügen der angegebenen Regeln neu starte, erhalte ich eine Warnung, dass das Dock eine "LEERE SCHNITTSTELLE" ist ... und tatsächlich ist mir beim Lesen der obigen Informationen nicht klar, wie shorewall die Verbindung zwischen dem herleiten kann 172.17 Adressen und die Zone 'Dock'. Vermisse ich etwas Offensichtliches darüber, wie Shorewall funktioniert?
John Clements
Tut mir leid, ich habe eine Änderung in der Interface-Datei verpasst. Ich habe die Antwort bearbeitet, siehe neuen Abschnitt /etc/shorewall/interfaces.
Fazy
Vielen Dank. Es funktioniert auch gut mit Shorewall 5 (das Docker-fähig ist), wenn der Host seinen Containern beitritt.
Drasill
Die Maskeneinstellungen sind sehr wichtig, sonst kann ein Docker-Container nicht über eine externe IP auf einen anderen Container zugreifen - er wird blockiert
Eugen Mayer
6

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:

  • Ermöglicht das Starten / Stoppen / Neustarten von Shorewall und Docker in beliebiger Reihenfolge
  • Vermeidet die Notwendigkeit, ein Erweiterungsskript zu verwalten
linuxhackerman
quelle
2

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/masqund 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 ifconfigSie 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 Sie ifconfigerneut nach der Schnittstelle suchen docker0.

Aaron C. de Bruyn
quelle
2

Sie können sicherstellen, dass der Docker-Regelsatz einen Shorewall-Neustart übersteht, indem Sie Erweiterungsskripts erstellen, die die DOCKERKette 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.

womble
quelle
0

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.

Atom
quelle
0

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:

sudo shorewall refresh

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.

Lenybernard
quelle
0

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.

DukeLion
quelle