User Tools

Site Tools


ssh_reverso_para_evitar_nat_firewall

Como realizar un SSH reverso donde el cliente pueda estar accesible desde el exterior

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

Crear un proxy mediante túneles reversos SSH

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.

SSH Multisalto

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.

  • AllowTCPForwarding: No presente o comentada en la configuración o configurada como “yes”
  • PermitOpen No presente o comentada en la configuración o configurada como “any”

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/

ssh_reverso_para_evitar_nat_firewall.txt · Last modified: 2021/02/08 20:14 by busindre