Reenvío de puertos remotos dentro de contenedores Docker

Estoy tratando de configurar un contenedor docker que uso para evitar firewalls/NAT para permitir el acceso SSH a las computadoras detrás de estas barreras de enrutamiento. En esencia, tengo un servicio SSH escuchando dentro de un contenedor docker, al que se conectan mis otras computadoras, abriendo un reenvío de puerto SSH inverso, y luego, si quiero conectarme a una computadora detrás de un firewall, me conecto a mi servidor proxy acoplado en el puerto inverso. Ejemplo:

La computadora con cortafuegos "Bob" se conecta al servidor proxy:

ssh -R 2024:localhost:22 -N remote.server

A continuación, me conecto al servidor remoto en el puerto 2024 para seguir el túnel hacia abajo y conectarse a localhost:22 en bob:

ssh -p 2024 remote.server

Todo esto funciona muy bien cuando no está acoplado, sin embargo, cuando intenté mover esto a un servicio acoplado, descubrí que mi sshd el servidor dentro del contenedor docker se niega obstinadamente a abrir reenvíos de puertos remotos. Conectando con ssh -vvv en el primer paso anterior da:

...debug1: Entering interactive session.debug1: pledge: networkdebug3: receive packet: type 4debug1: Remote: Server has disabled port forwarding.debug3: receive packet: type 82debug1: remote forward failure for: listen 2024, connect localhost:22Warning: remote port forwarding failed for listen port 2024debug1: All remote forwarding requests processed

Que se parece mucho a mi sshd no está configurado para permitir el reenvío de puertos remotos. Sin embargo, mi sshd_config parece pensar que es:

# tail /etc/ssh/sshd_config -n 5GatewayPorts yesAllowTcpForwarding yesAllowStreamLocalForwarding yesPermitTunnel yesUsePrivilegeSeparation no

De hecho, correr con ssh -ddd dentro del contenedor de la ventana acoplable, luego se conecta con la línea de arriba que se muestra primero:

debug3: /etc/ssh/sshd_config:91 setting GatewayPorts yesdebug3: /etc/ssh/sshd_config:92 setting AllowTcpForwarding yesdebug3: /etc/ssh/sshd_config:93 setting AllowStreamLocalForwarding yesdebug3: /etc/ssh/sshd_config:94 setting PermitTunnel yesdebug3: /etc/ssh/sshd_config:95 setting UsePrivilegeSeparation no

Seguido de:

debug1: server_input_global_request: rtype tcpip-forward want_reply 1debug1: server_input_global_request: tcpip-forward listen localhost port 2024debug1: server_input_global_request: rtype no-more-sessions@openssh.com want_reply 0

Claramente, mi configuración se está configurando correctamente, pero parece que el cliente todavía piensa que el servidor no puede hacer el reenvío de puertos. ¿Cómo puedo convencer al servidor Openssh para que realice el reenvío remoto? ¿Qué podría causar este fallo?

El cliente se está ejecutando OpenSSH_7.2p2 Ubuntu-4ubuntu2.4 el servidor se está ejecutando OpenSSH_6.7p1 Debian-5+deb8u4, la versión de docker es 17.09.1-ce en Amazon Linux 2017.09.

¡Gracias!

Aha! Lo descubrí. Esto se debió a que docker estaba creando un ipv6 red interna para mis contenedores, y mi kernel no tenía ipv6 reenvío habilitado. Así que cuando corres sshd fuera del contenedor, funcionaría ipv4, pero al correr sshd dentro del contenedor en la red docker Bridge, escucharía en ipv6 y ser incapaz de abrir el puerto hacia adelante.

Una vez que habilité ipv6 reenvío, (añadiendo net.ipv6.conf.all.forwarding = 1 en /etc/sysctl.conf y reiniciando) todo comienza a funcionar bien.

También puede intentar forzar a sshd a usar ipv4. En su ejemplo, agregue el modificador " -4 " de la siguiente manera:

ssh -4 -R 2024:localhost:22 -N remote.server

seguir estos pasos me ayudó

  • instalar ssh en el contenedor
  • habilite el servicio con /etc/init.d/ssh start
  • ejecutar echo 'root:a-strong-password' | chpasswd para establecer la contraseña para root
  • editar /etc/ssh/sshd_config y establecer PermitRootLogin yes
  • entonces /etc/init.d/ssh restart
  • entonces ssh -fNTCR localhost:<YOUR-PORT>:localhost:22 remote-host esto va a fondo y se puede ver a través de ps aux | grep ssh
  • luego en host remoto podemos iniciar sesión en él ssh -p <YOUR-PORT> localhost
  • que pide la contraseña y tú ya creaste

anfitrión de pantalla

enter image description here


Más info

  1. cómo-ssh-en-un-contenedor-docker-remotamente-como-root-o-un-usuario-no-root