Como realizar un tunel inverso con SSH
|En algunas ocasiones necesitamos conectarnos a un servidor el cual esta detras de un Firewall o de otro equipo, al cual no tenemos acceso para hacer la respectiva redireccion de puertos y lograr conectarnos por la ip publica con la que dicho equipo sale a internet. En otras palabras, necesitamos acceder a un servidor el cual esta detras de algun tipo de NAT que nos impide realizar la conexion directa al servidor.
Para solucionar esta problema, se pueden emplear diversas tecnicas, sin embargo en el dia de hoy quiero mostrar una forma muy sencilla de poder conectarnos via SSH a un equipo que esta detras de un FW o NAT, implementando los muy conocidos tuneles inversos.
¿Como funciona un tunel SSH inverso?
Generalmente, una conexion SSH se realiza haciendo que el cliente se conecte hacia el servidor, sin embargo si no tenemos forma de hacer la conexion SSH de esta forma(por lo que ya hemos hablado del NAT y FW), es posible hacer que esta maquina a la cual queremos acceder, se conecte por SSH a una tercera maquina a la cual si tiene acceso (ya que el fw no restringe la conexion de LAN y WAN) de esta forma, conectariamos la maquina destino (la cual esta detras del FW o NAT) a una tercera maquina, y nosotros desde nuetro PC nos conectariamos a esta tercera maquina y de alli entrariamos al tunel el cual se establecio previamente entre la maquina destino(si, la que esta detras del fw y nat ) y la tercera maquina. Un esquema para aclarar un poco mas la idea
La idea es basicamente esta:
- De A nos conectamos a B
- De C nos conectamos a B
- Por ultimo, de C nos conectamos a A, usando el tunel establecido con el B
A continuacion se indicaran los pasos a seguir ya en la practica para realizar la conexion:
- Iniciamos el tunel desde A hasta B de la siguiente forma:
ssh -R puerto_a_escuchar:localhost:puertoSSH usuario_local@DireccionIP_maquina_b
Un ejemplo mas claro:
ssh -R 9999:localhost:22 test@200.207.23.45
Donde
9999: sera el puerto que quedara a la escucha
22: Es el puerto donde escucha el SSH localmente
test: Usuario de SSH local
200.207.23.45: Direccion IP de la maquina que servira para hacer el tunel
- Una vez hecho esto, pasamos a conectarnos por SSH normalmente a la maquina B
ssh user@200.207.23.45
- Ahora por ultimo, estando alli en la maquina B nos conectamos al puerto donde se establecio el tunel, para efectos de nuestro ejemplo fue el puerto 9999
ssh test@localhost -p 9999
De esta forma estaremos dentro de aquella maquina la cual esta detras de un FW o de un NAT, gracias al uso del tunel inverso SSH, una medida muy sencilla para evitar este tipo de problemas.
Como ven es una de las tantas funcionalidades que nos ofrece SSH para lograr gestionar equipos los cuales no esten directamente conectados a internet o esten en otra subred detras de un equipo de seguridad, sin necesidad de modificar las reglas de firewall para crear port forward o habilitar puertos, es decir, una tecnica muy util cuando no tengamos acceso al equipo de borde
Hace tiempo que estoy intentando esto pero no puedo, algo estoy haciendo mal. En mi caso, tengo dos servidores, digamos servidor A y B. El servidor A no tiene forwarding hacia el puerto 22, pero el servidor B si. ¿Puedo hacer ssh inverso hacia el servidor A o necesito un tercer servidor que haga el redireccionamiento? Abrazo!