Tuesday, August 4, 2015

Túneles de ssh

Este post no pretende ser la guía definitiva para hacer túneles de ssh, lo que si pretende es mostrar algunas situaciones que tengo que vivir a diario y que, con túneles de ssh, pueden hacerse más llevaderas.

Para empezar, la mayoría de los administradores de sistemas tenemos que acceder a servidores remotos para realizar nuestro trabajo diario. Estos servidores, la mayoría de las veces, no son alcanzables directamente desde nuestra estación de trabajo, por lo tanto, necesitamos acceder a ellos mediante otro servidor al que llamamos de diferentes maneras, jump server, servidor de salto, máquina de administración, etc, etc.

Los administradores de unix nos sentimos muy afortunados cuando este jump server es unix (generalmente Linux) ya que se nos hace la vida muchísimo más fácil.

Voy a poner varias situaciones que se me presentan diariamente y que gracias a los túneles de ssh puedo afrontar de una manera cómoda.

1.- Ejecutar una aplicación gráfica en un servidor remoto

Cuando hay que pasar por un jump server, la cosa ya no es tan fácil como poner "-X" al ssh. Es aquí donde el túnel de ssh hace su magia.

La cuestión es la siguiente: hacer un túnel desde la estación de trabajo, que pase por el jump server y finalice en el servidor remoto de manera que pueda iniciar una sesión de ssh que haga X forwarding (-X) y pueda ejecutar la aplicación gráfica en el servidor de destino y que se muestre en mi estación de trabajo.

El dibujo de abajo lo explica mejor:







Para realizar esto debemos asumir lo siguiente:

A.- El jump server tiene un servidor ssh.
B.- En nuestra estación de trabajo tenemos un servidor X.
C.- El servidor de destino tiene ssh.

Los comandos serían como lo siguiente:

Establecer el túnel:
[ estacion ] ssh -L 2222:servidor:22 usuario-jumpserver@jump_server

Conectarse y ejecutar la aplicación gráfica:
[ estacion ] ssh -X -p 2222 usuario-servidor@localhost
[ servidor ] appX


Explicación:
ssh -L 2222:servidor:22 Estamos abriendo un túnel que va desde nuestra estación de trabajo en el puerto 2222 y termina en "servidor" en el puerto 22

usuario-jumpserver@jump_server Aquí estamos entrando en "jump_server" con el usuario "usuario-jumpserver", de esta manera el túnel se realiza desde nuestra estación de trabajo, a través del jump server y finaliza en "servidor"

ssh -X -p 2222 usuario-servidor@localhost Aquí estamos iniciando una sessión de ssh con "XForwarding" (-X) en el puerto 2222 (-p 2222) de nuestra estación de trabajo (el inicio del túnel) con el usuario "usuario-servidor" que debe ser un usuario válido en "servidor"

appX Ejecutar la aplicación en el servidor "servidor"


2.- Conectarse por remote desktop a un servidor windows a través del jump server

Alguna vez hemos tenido que conectarnos por rdesktop a una máquina con windows. Utilizando un tunel de ssh podemos conectarnos a ese servidor windows con la herramienta rdesktop de una manera sencilla:

[ estacion ] ssh -L 3389:servidor:3389 usuario@jumpserver

Explicación:
ssh -L 3389:servidor:3389 Creamos un túnel de ssh en nuestra estación de trabajo que escuchará en el puerto 3389 cuyo extremo será el servidor "servidor" en el puerto 3389

usuario@jumpserver El túnel pasará a través de "jumpserver" autenticándonos como "usuario"

Ahora solo hay que hacer lo siguiente en nuestra estación de trabajo

[ estacion ] rdesktop localhost


3.- Túnel reverso de ssh

ADVERTENCIA: Esto puede meterte en problemas con tu administrador de redes/sistemas. No me hago responsable del uso que se haga de esto. Esto es solo una demostración de concepto.

Analicemos el siguiente escenario. Se tiene una estación de trabajo detrás de una red corporativa. Desde esta estación de trabajo se puede hacer ssh a una máquina en Internet. La estación de trabajo no es accesible desde internet.

Pues bien, con ssh es posible establecer un túnel desde la estación de trabajo hasta esta "máquina en Internet" y luego poder conectarse desde esa "máquina en Internet" a la estación de trabajo y así poder operar desde "Internet" como si se estuviese en el lugar de trabajo.

Esto es "ideal" para trabajar desde la casa sin molestos clientes de VPN que solo sirven en windows o en ciertas "versiones de Linux".

Nota: Se asume que el router de la casa está configurado para hacer posible la conexión a "desktop.home" por ssh desde fuera. No es objetivo de este post mostrar como realizar esto.

Este sería el procedimiento:

[ estacion ] ssh -R 2022:localhost:22  usuario-home@desktop.home

Luego en desktop.home hacer lo siguiente:

[ desktop.home ] ssh -p 2022 usuario-estacion@localhost

Explicación:
ssh -R 2022:localhost:22  Establezco un túnel que va desde desktop.home en el puerto 2022 a estacion en el puerto 22

usuario-home@desktop.home usuario y nombre de la "máquina de Internet".


4.- Túnel de ssh multi saltos (multihop)

Aquí rizamos el rizo :) En este caso, necesitamos acceder a un servidor mediante varios jump servers. Aplicamos lo que he explicado anteriormente pero con recursividad :)

Este dibujo trata de explicar el escenario que propongo.




Como se ve, "Servidor" solo es alcanzable desde "Jump Server 2" y aunque bastaría con llegar a "Jump Server 2" para tener una sesión de ssh, abrir una aplicación gráfica en "Servidor", que se mostrara en nuestra estación de trabajo, sería imposible.

Para hacerlo posible, creamos dos túneles de ssh, el segundo "dentro" o utilizando el primero.

Primer túnel, desde la estación de trabajo hasta "Jump Server 2" utilizando a "Jump Server 1"

[ estacion ] ssh -L 2222:Jump_Server_2:22 usuario-jump_server_1@jump_server_1

Segundo túnel, utilizando el primero (que "comienza" en el puerto 2222),  desde nuestra estación de trabajo hasta "Servidor"

[ estacion ] ssh -p 2222 -L 2223:Servidor:22  usuario-jumpserver2@localhost

Para conectarnos al servidor de destino realizamos lo siguiente:

[ estacion ] ssh -p 2223 usuario-servidor@localhost



Espero que esto sea de utilidad.