run hub container attach bash ssh docker netcat ssh-tunnel

bash - hub - acceder al túnel ssh del host desde el contenedor docker



docker run (2)

Creo que puedes hacerlo agregando --net=host a la ejecución de tu docker. Pero vea también esta pregunta: Reenviar el puerto del host al contenedor de la ventana acoplable

Usando ubuntu tusty, hay un servicio que se ejecuta en una máquina remota, a la que puedo acceder a través del reenvío de puertos a través de un túnel ssh desde localhost:9999 .

Tengo un contenedor docker funcionando. Necesito acceder a ese servicio remoto a través del túnel del host, desde dentro del contenedor.

Intenté hacer un túnel desde el contenedor al host con -L 9000:host-ip:9999 , y luego acceder al servicio a través de 127.0.0.1:9000 desde el interior del contenedor no se pudo conectar. Para verificar si la asignación de puertos estaba nc -luv -p 9999 # at host nc -luv -p 9000 # at container , probé nc -luv -p 9999 # at host nc -luv -p 9000 # at container

siguiendo esto, parag. 2 pero no se percibió comunicación, incluso al hacer nc -luv host-ip -p 9000 en el contenedor

También intenté mapear los puertos a través de la docker run -p 9999:9000 , pero esto informa que el enlace falló porque el puerto del host ya está en uso (desde el túnel del host a la máquina remota, probablemente).

Así que mis preguntas son

1 - ¿Cómo lograré la conexión? ¿Necesito configurar un túnel ssh para el host o esto se puede lograr solo con la asignación de puertos de la ventana acoplable?

2 - ¿Cuál es una forma rápida de probar que la conexión está funcionando? Via bash, preferiblemente.

Gracias.


Usar su red de hosts como red para sus contenedores a través de --net=host o en docker-compose a través de network_mode: host es una opción pero esto tiene el efecto secundario no deseado de que (a) ahora expone los puertos de contenedores en su sistema host y ( b) que ya no puede conectarse a esos contenedores que no están asignados a su red host.

En su caso, una solución más rápida y limpia sería hacer que su túnel ssh esté disponible para su sistema host (es decir, su puente docker0 ) en lugar de exponer sus contenedores docker en su entorno host (como se sugiere en la respuesta aceptada).

Configuración del túnel:

Para que esto funcione, recupere la ip que docker0 puente docker0 mediante:

ifconfig

Verás algo como esto:

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

Ahora necesita decirle a ssh que se enlace a esta ip para escuchar el tráfico dirigido hacia el puerto 9000 a través de

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

Sin establecer la dirección de vinculación,: :9000 only estaría disponible para la interfaz de bucle de retorno de su host y no per se para sus contenedores docker.

Nota al margen: también puede vincular su túnel a 0.0.0.0 , lo que hará que ssh escuche todas las interfaces.

Configurando tu aplicación:

En su aplicación en contenedor, use el mismo docker0 ip para conectarse al servidor: 172.17.0.1:9000 . Ahora el tráfico que se enruta a través de su puente docker0 también llegará a su túnel ssh :)

Por ejemplo, si tiene una aplicación "DOT.NET Core" que necesita conectarse a una base de datos remota ubicada en :9000 , su "ConnectionString" contendría "server=172.17.0.1,9000;