it-swarm.com.de

Greifen Sie vom Docker-Container aus auf den SSH-Tunnel des Hosts zu

Mit ubuntu tusty läuft auf einem entfernten Rechner ein Dienst, auf den ich über eine Portweiterleitung über einen SSH-Tunnel von localhost:9999 Aus zugreifen kann.

Ich habe einen Docker-Container in Betrieb. Ich muss vom Container aus über den Host-Tunnel auf diesen Remote-Dienst zugreifen.

Ich habe versucht, mit -L 9000:Host-ip:9999 Vom Container zum Host zu tunneln. Der Zugriff auf den Dienst über 127.0.0.1:9000 Innerhalb des Containers schlägt fehl. Um zu überprüfen, ob die Portzuordnung aktiviert ist, habe ich versucht, nc -luv -p 9999 # at Host nc -luv -p 9000 # at container

im Anschluss an dies, Absatz 2 wurde jedoch keine Kommunikation wahrgenommen, selbst wenn nc -luv Host-ip -p 9000 am Container ausgeführt wurde

Ich habe auch versucht, die Ports über docker run -p 9999:9000 Zuzuordnen, aber dies meldet, dass die Bindung fehlgeschlagen ist, da der Host-Port bereits verwendet wird (vermutlich vom Host-Tunnel zum Remote-Computer).

Also meine Fragen sind

1 - Wie erreiche ich die Verbindung? Muss ich einen SSH-Tunnel zum Host einrichten oder kann dies nur mit der Docker-Portzuordnung erreicht werden?

2 - Wie können Sie schnell testen, ob die Verbindung besteht? Am liebsten via Bash.

Vielen Dank.

32
npit

Ich denke, Sie können dies tun, indem Sie Ihrem Docker-Lauf --net=Host Hinzufügen. Siehe aber auch diese Frage: Host-Port an Docker-Container weiterleiten

15
Matthew

Die Verwendung Ihres Host-Netzwerks als Netzwerk für Ihre Container über --net=Host Oder in Docker-Compose über network_mode: Host Ist eine Option, hat jedoch den unerwünschten Nebeneffekt, dass (a) Sie jetzt die Container-Ports in Ihrem Netzwerk freigeben Host-System und (b) dass Sie keine Verbindung mehr zu den Containern herstellen können, die nicht Ihrem Host-Netzwerk zugeordnet sind.

In Ihrem Fall besteht eine schnelle und saubere Lösung darin, Ihren ssh-Tunnel für Ihre Docker-Container "verfügbar" zu machen (z. B. durch Binden von ssh an die docker0 - Bridge), anstatt Ihre Docker-Container in Ihrer Host-Umgebung (als in der akzeptierten Antwort vorgeschlagen).

Tunnel aufbauen:

Rufen Sie dazu die IP-Adresse ab, die Ihre docker0 - Bridge verwendet:

ifconfig

sie werden so etwas sehen:

docker0   Link encap:Ethernet  HWaddr 03:41:4a:26:b7:31  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0

Jetzt müssen Sie ssh anweisen, an diese IP zu binden auf Datenverkehr zu warten, der über an Port 9000 geleitet wird

ssh -L 172.17.0.1:9000:Host-ip:9999

Ohne die Einstellung von bind_address wäre :9000nur für die Loopback-Schnittstelle Ihres Hosts und nicht per se für Ihre Docker-Container verfügbar.

Randnotiz: Sie können Ihren Tunnel auch an 0.0.0.0 Binden, wodurch ssh alle Schnittstellen abhören kann.

Einrichten Ihrer Anwendung:

Verwenden Sie in Ihrer containerisierten Anwendung dieselbe docker0 - IP, um eine Verbindung zum Server herzustellen: 172.17.0.1:9000. Jetzt erreicht der Verkehr, der über Ihre docker0 - Brücke geleitet wird, auch Ihren SSH-Tunnel :)

Wenn Sie beispielsweise eine "DOT.NET Core" -Anwendung haben, die eine Verbindung zu einer entfernten Datenbank unter :9000 Herstellen muss, enthält Ihr "ConnectionString" "server=172.17.0.1,9000;.

17
B12Toaster