Ich habe folgendes Setup:
- Ein CentOS-Host, auf dem der Docker-Dienst ausgeführt wird
- Ein benutzerdefiniertes Docker-Bridge-Netzwerk
- 2 Docker-Container, die mit diesem benutzerdefinierten Bridge-Netzwerk verbunden sind
- Eine OpenVPN-Installation (wird derzeit auf dem Host ausgeführt. Kann auch in einem Docker-Container ausgeführt werden.)
- Einige mit OpenVPN verbundene Clients
Wie kann ich zulassen, dass Docker-Container im Docker-Bridge-Netzwerk mit den openvpn-Clients im tun0-Netzwerk kommunizieren?
Ich möchte eine TCP-basierte Kommunikation zwischen Docker1 (10.10.0.3) und Clients, die auf transparente Weise mit dem VPN (Bereich 172.19.0.x) verbunden sind, ermöglichen.
Was muss ich auf der Docker-Seite (Netzwerk / iptables / ...) und auf dem Host (iptables?) Einrichten?
tap
, Nusstun
, ich habe mehr als 12 Stunden daran gearbeitet, ohne Erfolg bis jetzt.Antworten:
Kontext
Ich habe den sehr guten Docker-Container von Kyle Manna ( https://github.com/kylemanna/docker-openvpn ) verwendet. Ich verwende die sogenannte "paranoide" Dokumentation, um meinen OpenVPN-Server einzurichten, aber meiner Ansicht nach sollte dies der Standardweg und nicht der paranoide Weg sein.
Aufbau
Um eine bidirektionale Verbindung zwischen ausgewählten Docker-Containern und den VPN-Clients zu ermöglichen, müssen Sie ein Docker-Netzwerk erstellen, an das Sie einen Container anhängen, auf den die VPN-Clients zugreifen dürfen. Der VPN-Server wird einer dieser Container sein.
Der VPN - Server sollte die
client-to-client
,topology subnet
,dev tun0
(oder andere tun Device) undpush "route <docker net IP> <docker net mask>"
konfiguriert.Der Host des VPN-Servers sollte so konfiguriert sein, dass er die Weiterleitung von IP-Paketen von einem Subnetz in ein anderes unterstützt. Dies bedeutet, dass sysctl ip_forward auf 1 gesetzt wird (dies sollte der Fall sein, wenn Docker installiert ist), damit Pakete vom Tun-Gerät die iptables FORWARD-Kette durchlaufen und das richtige Routing festlegen können. Dies kann mit den folgenden Befehlen zusammengefasst werden:
Hier sind die Optionen, mit denen ich den Server eingerichtet habe:
Dies sollte eine Serverkonfigurationsdatei generieren, die der folgenden ähnelt:
Konkretes Beispiel
Ich werde jetzt ein konkretes Beispiel nehmen. In diesem Beispiel werde ich den oben erwähnten OpenVPN-Server in Docker auf dem Host vpn.example.com ausführen. Dieser Container ist an das Docker-Netzwerk docker-net-vpn angehängt. Hier sind die Befehle (in diesem Beispiel generiere ich die Serverkonfiguration direkt auf dem Server und überspringe die CA-Generierung. Befolgen Sie stattdessen die paranoide Dokumentation des oben genannten Projekts):
Der erste Befehl erstellt ein dediziertes neues Docker-Netzwerk, das ein neues Subnetz definiert. Wir werden den OpenVPN-Server an dieses Netzwerk anschließen.
Der zweite erstellt die OpenVPN-Konfiguration mit demselben Subnetz wie im ersten Befehl definiert.
Der dritte erstellt den OpenVPN-Server. Es ist an das neu erstellte Docker-Netzwerk angeschlossen und verwendet eine feste IP.
Der vierte und fünfte Befehl konfigurieren die IP-Weiterleitung.
Der letzte Befehl fügt eine neue Route zur VPN-Client-Konfiguration über die feste IP des OpenVPN-Containers hinzu.
Hinweis
Ich habe es nicht ausprobiert, aber es sollte möglich sein, die FORWARD-Regel für iptables einzuschränken. Bei der Erstellung des Docker-Netzwerks wurde ein neues Bridge-Gerät erstellt. Diese Brücke wird benannt,
br-<ID>
wobei die ID die ersten 12 Zeichen der Docker-Netzwerk-ID sind. Diese ID erhalten Sie mitdocker network inspect -f '{{.Id}}' docker-net-vpn | cut -b-12
. Daher ist der folgende Befehl möglicherweise restriktiver (also in Bezug auf die Sicherheit besser), sollte jedoch weiterhin die Weiterleitung unseres Datenverkehrs ermöglichen:quelle
1 gnet (172.20.20.1) 1966.269 ms !H 1966.248 ms !H 1966.239 ms !H
, aber ich kann nicht pingen oder offene Ports erreichen.docker network…
.