01 agosto, 2018

Crear un túnel SSH con PuTTY para Escritorio remoto (RDP) (local port forwarding)

Un tunel SSH se utiliza principalmente para tunelizar tráfico sobre internet o sobre una red local de una manera segura. Podemos encapsular un tipo de protocolo sobre una conexión establecida SSH (Secure SHell).

Supongamos que nos queremos conectar a un servidor interno de una red local a través de Internet, pero el firewall de la compañía restringe las conexiones origen dirigidas a determinados puertos, entre ellos el 3389 (puerto por defecto usado para RDP), sin embargo si permite conexiones al puerto 22 (puerto por defecto para SSH). La compañía expone un único equipo accesible desde la WAN (Wide Area Network) de Internet. Por lo que tienen definada una regla en el firewall que hace port forwarding permitiendo las conexiones origen dirigidas al puerto 22 a través de la dirección IP pública se redirigen a una determina IP interna que pertenece a un servidor Linux, este será el servidor SSH que usaremos para hacer pivoting al servidor al que nos conectaremos por Escritorio remoto RDP por el puerto 3389. El equipo cliente definirá mediante una herramienta de terceros la configuración de tunel SSH y se conectará a la IP pública de la compañía por el puerto 22, una vez establecida la conexión al servidor SSH el cliente se conectará por Escritorio remoto a sí mismo (127.0.0.1 o localhost) por el puerto configurado en el tunel SSH, ese puerto redirigirá la conexión al servidor SSH que a su vez redirigirá a la IP interna del servidor que aceptará la conexión de Escritorio remoto.

En el siguiente squema se muestra un funcionamiento de ejemplo para establecer conexiones de Escritorio remoto sobre un tunneling SSH. Se encapsulará el protocolo RDP sobre un el protocolo SSH.

Figura 1: Esquema de conexión tunneling SSH para conectarse por Escritorio remoto (RDP).

Para establecer la configuración usaremos el cliente SSH PuTTY (podría ser otro que tenga la opción de poder configurar túneles SSH). Abrimos Putty y nos desplazamos a la sección: "Conecction > SSH > Tunnels".

Indicamos el puerto origen para nuestro equipo y el destino IP:PUERTO al que se redirigirá la conexión. En este caso el puerto 3333 sería el puerto origen local de la máquina cliente y redirigirá las peticiones a ese puerto al destino 10.0.0.12:3389 sería el servidor remoto al que nos conectaremos por Escritorio remoto.

Figura 2: Putty - Configurar conexión port forwarded tunelizada para usar con SSH.

En la sección "Session" especificamos el nombre o IP del que sería el servidor SSH remoto al que nos conectaremos inicialmente. (Para este ejemplo me he conectado a una IP local sería la miasma configuración para una IP Pública en Internet de un sitio remoto).

Figura 3: Putty - Conectarse al equipo servidor SSH.

Una vez nos conectamos a al servidor SSH remoto, en el equpo cliente abrimos una ventana de conexión de Escritorio remoto (Windows +R > mstsc) y nos conectamos como localhost:3333. Ese puerto reenviará la pentición al servidor SSH al que estamos conectados pivotando a través de este se establecerá la comunicación tunelizará de forma segura (previamente así lo habíamos definido -ver figura 2-) autenticándonos hacia el servidor destino que aceptará la conexión de Escritorio remoto.

Figura 4: Autenticación para Escritorio remoto usando un reenvío de puertos configurado para un tunel SSH.

Finalmente la conexión se estableció correctamente. En la siguiente captura de pantalla se puede ver como la conexión por Escritorio remoto se hizo a través de localhost:3333, en el servidor SSH se ve la redirección de puertos y en el eventlog de Putty el tunel SSH definido inicialmente. 

Las peticiones que vengan del puerto local 3333 las renviará al destino 10.0.0.12:3389 (IP del servidor al que nos conectaremos y puerto por defecto RDP).

Figura 5: Conexión de Escritorio remoto establecida usando un tunel SSH.

Saludos!

Autor: Adrián Lois

4 comentarios:

  1. Estimado Adrian, tengo abiero los puertos en el router 4389 para conectarmer por remoto al equipo servidor y el 4390 al 105 para el resto de equipos. No entiendo muy bien que es lo que tengo que hacer en el router que puerto tengo que dejar abierto. Y si en vez del 22 se puede poner otro para que no ataquen al 22.... Que me recomiendas, para seguir usando RDP. También he leido que se puede hacer VPN + RDP... pero me pierdo

    ResponderEliminar
    Respuestas
    1. Hola @María,

      En tu router deberías indicar el puerto externo desde tu IP publica a que puerto interno a una IP interna de un equipo de tu red debería acceder. Puedes abrir el 55989 externo (por decir alguno) y que este haga port forwarding al puerto 3389 de la IP 192.168.0.50 que correspondería a un equipo que tengas interno en la red, lo mismo para otro caso, abrir el puerto externo 55778 y que este haga forwarding al puerto interno 22 a la IP de un equipo de la red interna.

      Respecto al tema de no exponer directamente hacia puertos bien conocidos, no es ninguna medida de seguridad, te puede dar cierta ofuscación en un escaneo de puertos externos hacia tu IP pública siempre y cuando el escaneo sea para puertos bien conocidos, pero si hacen un escaneo completo verán igualmente esos puertos abiertos.

      VPN+RDP es una opción, pero o implementas una OpenVPN por tu parte o entonces deberías pagar una. Teniendo opción de encapsular el tráfico vía SSH lo veo seguro, fácil de implementar (ya que solo tienes que tener instalado un server SSH) y cómodo de utilizar.

      En el ejemplo de este artículo se comenta como conectar a una máquina que expone un servidor SSH al cual nos conectamos estableciendo previamente un local port forwarding en el cliente Putty. Una vez tenemos conexión con esa máquina podemos pivotar a otra que previamente habíamos configurado, accediendo a ella como si fuera de forma local desde el equipo que establecemos la conexión.

      El siguiente artículo te puede resultar de ayuda para entender los distintos tipos de port forwarding con túneles SSH:
      https://www.zonasystem.com/2019/01/tunel-ssh-port-forwarding-local-remote-dynamic.html

      Un saludo,
      Adrián.

      Eliminar
    2. Gracias, eres un grande, me has servido de mucha ayuda. Empiezo con el laboratorio de pruebas, y no pararé hasta dar con ello. Gracias por todo, como siempre.

      Eliminar
    3. Espero que te haya servido de ayuda. Ánimo.

      Un saludo.

      Eliminar