Realizar un túnel ssh es útil cuando se requiere acceso por medio de SSH a una computadora que no puede tener puertos abiertos al exterior o bien tiene otra serie de limitaciones como puede ser NAT / Firewall / etc. Puede ser utilizado como alternativa a las VPN tradicionales, permitiendo acceder a la Intranet de la empresa desde fuera, pero a diferencia de las VPN no es necesario configurar ningún tipo de acceso especial.
EMPRESA: Computadora con usuario “usuario_EMPRESA” que quiere ser accedida desde el exterior sin abrir ningún puerto ni cortafuegos.
CASA: Computadora que accederá a EMPRESA vía SSH reverso, tiene un usuario que es “usuario_CASA”.
Conectar a CASA vía SSH desde EMPRESA creando un túnel en el puerto 19999 de CASA conectado directamente con EMPRESA.
EMPRESA $ ssh -R 19999:localhost:22 usuario_CASA@CASA
NOTA: Si queremos dejar la conexión en segundo plano se puede utilizar las opciones “-N -f”.
EMPRESA $ ssh -N -f -R 19999:localhost:22 usuario_CASA@CASA
Opción 1: Desde CASA se conecta a EMPRESA vía SSH utilizando el túnel anteriormente creado.
CASA $ ssh usuario_EMPRESA@localhost -p 19999
Lógicamente cualquier usuario que entre a CASA podrá también acceder a EMPRESA, conociendo claro está el usuario y contraseña de la cuenta a acceder.
En la opción número 1, el puerto 19999 está solo abierto a localhost, por eso requiere que quien quiera entrar a EMPRESA lo haga conectando previamente con CASA, por lo que debe saber las credenciales para acceder a CASA y posteriormente las de EMPRESA.
Si se quiere que el puerto 19999 esté abierto al exterior y no solo a localhost, se debe editar la configuración del servidor sshd de CASA habilitando la opción “GatewayPorts”. De esta forma CASA hace de gateway.
Editar el fichero /etc/ssh/sshd_config.
GatewayPorts yes
Opción 2: Cualquier host (CCC) que haga un ssh al puerto 19999 de CASA estará intentando autenticarse contra EMPRESA. (Requiere “GatewayPorts yes” en CASA).
CCC $ ssh usuario_EMPRESA@CASA -p 19999
Realizar un túnel ssh es útil cuando se requiere acceso por medio de SSH a una computadora que no puede tener puertos abiertos al exterior o bien tiene otra serie de limitaciones como puede ser NAT / Firewall / etc. También es posible que esa misma máquina a la que accedemos mediante túneles reversos SSH nos pueda ofrecer servicios de Proxy, para ello se deben tener claros los conceptos previamente comentados.
En el supuesto actual se plantea que el servidor EMPRESA haga de proxy, para, por ejemplo, navegar a través de él, algo muy utilizado para navegar como si se estuviera dentro de la Intranet de la empresa.
Conectamos a CASA vía SSH desde EMPRESA creando un túnel en el puerto 19999 de CASA conectado directamente con EMPRESA.
EMPRESA $ ssh -R 19999:localhost:22 usuario_CASA@CASA
Supuesto 1: Si el puerto 19999 está abierto al exterior (“GatewayPorts yes”), simplemente se necesita crear otro tunel desde un sistema cualquier de Internet (CCC) de la siguiente manera.
CCC $ ssh -D 8066 -f -C -q -N -p 19999 usuario_EMPRESA@CASA
Una vez establecido el túnel SSH solo es necesario configurar el navegador para que utilice el puerto local 8066 para salir a través de EMPRESA (El puerto 19999 de CASA redirige al host EMPRESA).
Supuesto 2: Supongamos que en el momento en el que EMPRESA conectó mediante un túnel reverso, no se configuró el servicio SSH con la opción “GatewayPorts yes”. Una solución sería por ejemplo utilizar socat para redirigir un puerto a localhost.
socat TCP-LISTEN:8090,fork TCP:127.0.0.1:19999
También es factible editar el fichero sshd_config, poner la opción “GatewayPorts yes” y hacer un “reload” del servidor ssh. De esta forma no se pierde conectividad con EMPRESA. Una vez se tiene el servidor funcionando con la opción “GatewayPorts yes”, ejecutamos el siguiente comando.
CASA $ ssh -R 8090:localhost:19999 -C -q -N usuario_CASA@localhost
Ahora el puerto 8090 estaría abierto al exterior en el sistema CASA. EL puerto 19999 sigue escuchando únicamente en localhost.
Desde un sistema cualquier de Internet (CCC) creamos un túnel con CASA.
CCC $ ssh -D 8066 -f -C -q -N -p 8090 usuario_EMPRESA@CASA
Configurar el navegador para utilizar el túnel SSH
Ahora en la computadora CCC, se ejecuta por ejemplo el navegador Firefox:
Preferencias > Conexión > Configuración > Configuración manual de proxy > Servidor SOCKS v5 > 127.0.0.1 Puerto: 8066 > DNS remoto.
La navegación a partir de ese momento se realiza mediante el sistema EMPRESA, el cual puede estar dentro de la oficina o cualquier otro sitio.
Supuesto 2A: Dado el anterior supuesto, también es posible establecer un proxy SOCKS de la siguiente manera.
CASA $ ssh -f -N -D 0.0.0.0:8090 localhost -p 19999
El puerto 8090 si está abierto al exterior en CASA (No requiere de la directiva “GatewayPorts yes”) y comunica directamente con EMPRESA, por el cual saldrán las comunicación que se encaminen hacia el puerto 8090 de CASA.
De esta forma no sería necesario recargar la configuración del servicio sshd, el único problema sería que el puerto está abierto para todo el mundo, si no se establecen otras medidas de seguridad cualquier persona podría acceder a la red de EMPRESA si configura su navegador para utilizar el puerto 8090 de CASA.
Configurar el navegador para utilizar el servidor Proxy que concatena con el túnel SSH Preferencias > Conexión > Configuración > Configuración manual de proxy > Servidor SOCKS v5 > CASA Puerto: 8090 > DNS remoto.
Más información: ssh_multisalto_encadenado_de_sesiones
En SSH es posible crear una sesión remota a un destino de manera no directa, es decir, saltando a través de otros servidores ssh.
El cliente SSH conecta al Server3 a través de Server2 , el cual a su vez fue accedido a traves de Server1.
Cliente SSH ---> Server1 ---> Server2 ---> Server3
Ejemplo.
ssh -J usuario1@server1:2222,usuario2@server2:1122 root@server3 -p 22
Opciones necesarias para que los saltos en SSH sean posibles.
Visualizar la configuración de SSH actualmente activa.
sshd -T | grep -i "allowtcpforwarding\|permitopen" allowtcpforwarding yes permitopen any
Enlaces de interés: https://robotmoon.com/ssh-tunnels/