Stellen Sie über einen Docker-Dienst auf Swarm eine Verbindung zu einem VPN (OpenVPN) her

11

Ich habe einen OpenVPN-Server, auf dem einige private IP-Adressen verfügbar gemacht werden. Ich möchte, dass meine Docker-Schwarmdienste auf diese Adressen zugreifen.

Im Idealfall befindet sich kein OpenVPN-Client "in" den Containern, da erwartet wird, dass die Images in einer Umgebung bereitgestellt werden, in der kein VPN erforderlich ist.

Was ich bisher versucht habe

Ich habe erfolgreich einen Container mit meinem VPN mit dem Image dperson / openvpn-client verbunden .

Ich habe erfolgreich einen anderen Container mit diesem Container als Netzwerk unter Verwendung des --net=container:my-vpn-clientFlags gestartet .

Jetzt versuche ich, einen Docker-Dienst einzurichten , der auf meine privaten IP-Adressen zugreift. Ich habe Folgendes gefunden:

  • Ich kann den openVPN-Client nicht in einem Dienst ausführen, da er nicht angegeben werden kann cap-add: NET_ADMIN. Es gibt offene Fragen mit Docker, die diese Angelegenheit diskutieren, aber sie sind noch offen.
  • Ich dachte, ich könnte den openVPN-Client-Container "neben" dem Schwarmcluster ausführen lassen, aber ich kann ihn nicht verwenden, network_mode: "container:my-vpn-client"da er nicht unterstützt wird und Sinn macht, da ich unmöglich einen beliebigen Container zwingen könnte, auf jedem Knoten des Clusters vorhanden zu sein Schwarm, ohne dass es selbst ein Dienst ist.
  • Ich habe versucht, ein ansteckbares Netzwerk (Bridge / Overlay) zu erstellen und einfach meinen OpenVPN-Client-Container darin zu stecken und zu erwarten, dass andere Mitglieder dieses Netzwerks auf magische Weise diese Pipe durchlaufen ... und ich war enttäuscht.

Also hier bin ich, irgendeine Idee?

PS Wenn dies hilfreich sein kann, werden hauptsächlich einige automatisierte Tests eingerichtet, mit denen die Dienste auf einem einzelnen Docker-Computer im Schwarmmodus ausgeführt werden, z. B. unter Schwarminitialisierung> Stapelbereitstellung> Tests ausführen> Schwarmurlaub. Also, wenn es dafür einen "Hack" gibt ... könnte mich das interessieren;)


quelle

Antworten:

1

Ich mache genau das Gleiche. Auf Ihrem openvpn-Docker-Client müssen Sie NAT konfigurieren

iptables -t nat -A POSTROUTING -s 172.18.0.0/24 -o tun0 -j SNAT --to-source 10.8.0.10
iptables -t nat -A POSTROUTING -d 172.18.0.50/32 -o eth1 -j SNAT --to-source 172.18.0.100

Für mich habe ich dies so eingerichtet, dass es beim Booten über eine iptables-Wiederherstellung ausgeführt wird

Fügen Sie auf Ihrem Docker-Host Folgendes zu / etc / network / interfaces hinzu

post-up ip rule add from 172.18.0.0/16 table 200
post-up ip route add 192.168.11.222 via 172.18.0.100 table 200

NB Dies ist, was Sie wo verwenden

  • 172.18.0.0 ist Ihr Docker-Netzwerk
  • 172.18.0.50 ist einer Ihrer Docker-Container
  • 172.18.0.100 ist Ihr Docker-OpenVPN-Client
  • 192.168.11.222 ist die private IP, auf die Ihre Docker-Clients zugreifen sollen
  • tun0 ist die OpenVPN-Schnittstelle Ihres Docker-Clients
  • eth1 ist die 172.18.0.0-Netzwerkschnittstelle Ihres openvpn-Docker-Clients
Funken
quelle
Eine ausgezeichnete Antwort ... positiv bewertet. Beachten Sie, wie zwei Probleme zu lösen sind : (1) Sicherstellen, dass der Datenverkehr an den richtigen Ort geleitet wird, und (2) Sicherstellen, dass die in der Docker-Umgebung ausgeführte Software weiß, dass die Route vorhanden ist. Möglicherweise müssen Sie OpenVPN auch mitteilen, wie der Datenverkehr mithilfe einer ccrDatei weitergeleitet werden soll, als ob Sie es mit einem lokalen Netzwerk zu tun hätten. Wie bei jedem TCP / IP-Routing ist " tracerouteIhr bester Freund, genau wie tcpdumpwir oder WireShark".
Mike Robinson