domingo, 18 de noviembre de 2012

Tuneles ssh

Muchas veces nos encontramos con el problema de tener que acceder por ssh a una máquina que se encuentra en una red privada, detrás otra máquina con una dirección pública. Es requisito para poder realizar esta acción, poseer un usuario y una contraseña o una llave rsa para la máquina con ip pública como para las máquina en la red interna.
Podemos por ejemplo conectarnos directamente al ssh de la maquina con ip pública ejecutando:

$ ssh -L 22000:maquina-interna:22 usuario@maquina-publica

Dicho comando tiene como resultado que en el puerto número 22000 de nuestra máquina local sera el extremo de entrada de un túnel que tendrá como extremo de salida la maquina que pusimos como máquina-interna en el puerto 22.

Una ves realizado esto tendremos una terminal conectada a la maquina con ip pública y podemos ejecutar

$ ssh usuario2@localhost -p 22000

En este momento usuario2 es el nombre de usuario con el que nos tenemos que conectar a la maquina interna. De esta manera toda la comunicación se realiza mediante el túnel brindándonos acceso al maquina interna.
Un efecto que nos puede interesar evitar, es que al iniciar el túnel nos quede una sesión abierta en una consola (que de ser cerrada, cerrara el túnel). A tal fin  podemos ejecutar el comando ssh en modo foreground de la siguiente manera

$ ssh -fqN -L 22000:maquina-interna:22 usuario@maquina-publica

Una vez que se comprueba que el túnel funciona podemos guardar todas estas configuraciones de modo no tengamos que recordarlas cada ves que necesitamos realizar el tunnel. Para esto editamos el archivo ~/.ssh/config y agregamos las siguientes lineas:

Host <nombre o alias para la maquina>
Hostname <ip o nombre de la maquina pública>
User <usuario de la maquina interna>
Localforward <puerto local> <ip o nombre de la maquina interna>:<puerto destino en la maquina interna>