VNC Repeater

VNC Repeater: Raspberry Pi, Escritorio Remoto en LAN con Proxy y Firewall

Introducción y Objetivo

Se trata de acceder mediante escritorio remoto (VNC) desde internet a un PC en una LAN corporativa, tras un Proxy HTTP y Cortafuegos (conexión a internet desde la LAN permitida únicamente a través del Proxy). En definitiva es similar a un Teamviewer o Logmein ( o similar ) casero (evidentemente con un rendimiento limitado, pero aceptable)

Surgen dos dificultades:

  1. Acceder al equipo de la LAN desde internet
  2. Pasar a través del Proxy HTTP para no ser filtrados por el Cortafuegos (Firewall)

La única forma para poder acceder al PC en la LAN es usar un tercer equipo como intermediario (VNC Repeater), accediendo a él a través del Proxy. Desde nuestro equipo nos conectamos a ese intermediario y podemos abrir el escritorio remoto al PC coorporativo.

Para poder pasar a través del Proxy HTTP si la herramienta no dispone de opciones para usar un proxy, podemos usar  proxyfier o bien crear un túnel SSH al VNC Repeater con Putty (que tiene opción para usar proxy)

VNC Repeater

 

 

 

 

Tanto el equipo de casa (cliente VNC) como el corporativo al que queremos acceder (servidor VNC)  son sistemas Windows, para ellos usaremos la herramienta UltraVNC http://www.uvnc.com/. Para el Repetidor VNC usaremos una Raspberry Pi 3, conectada a nuestro router en casa y con los puertos 5500 y 5901 abiertos y redireccionados al la RPi, también con un cliente DDNS (no-ip) para poder hacerlo visible en internet.

En resumen, los equipos que tenemos son:

  1. Equipo coorporativo al que nos queremos conectar, ejecuta UltraVNC Server y adicionalmente una herramienta para poder dirigir ese servidor VNC a internet a través del Proxy
  2. Repetidor VNC: Raspberry Pi 3 que ejecuta un VNC repeater, simplemente escucha en el puerto 5500 el servidor VNC y en el puerto 5901 el cliente y los pone en contacto
  3. Equipo local, es donde ejecutamos el Cliente VNC para conectarnos al equipo coorporativo, mediante el VNC Repeater.

VNC Repeater

Para implementar el repetidor VNC existen varias opciones, una buena referencia y recopilatorio está en los foros de UltraVNC: http://forum.ultravnc.info/viewtopic.php?f=50&t=27489&sid=72724f764e1e56001cf41360c8fda8b2

Las posible opciones para usar en la Raspberry Pi son dos:

He hecho las pruebas con ambas y las dos opciones funcionan perfectamente.

HTTP Proxy y Cortafuegos

La configuración habitual de las redes corporativas impide la conexión desde el exterior (Firewall) y por tanto no permitirá que el VNC Server se conecte al equipo Repetidor. Se necesita una herramienta para poder encapsular todo el tráfico en http con el método CONNECT y pasarla a través del Proxy (único medio de conexión a internet)

Tenemos dos opciones

  • proxyfier https://www.proxifier.com/download.htm, yo he usado la versión portable. Permite definir reglas para indicar que una aplicación en concreto pase su tráfico a través del Proxy
  • túnel ssh con putty http://www.putty.org/ . Putty permite su uso con un Proxy, pero hay que efectuar un túnel para pasar el tráfico del Servidor VNC (puerto 5500) a la Raspberry Pi.

Veremos las pruebas en ambos casos

Escritorio Remoto con VNC Repeater Perl script

Los pasos en cada equipo son:

A) VNC Repeater (Raspberry Pi)

Antes de nada nos bajamos el script en Perl y lo ejecutamos en la Raspberry Pi (VNC Repeater), teniendo en cuenta que usamos el puerto 5901 para que se conecten los clientes (así dejamos el puerto 5900 para conectarnos en remoto a la Raspberry Pi mediante otra instancia de VNC)

B) Equipo Corporativo

Ejecutamos el servidor VNC. Para usarlo con el repetidor, en el icono de la barra de tareas, con el botón derecho, hay que añadir un nuevo cliente, indicar la dirección de internet de la RPi (Dynamic DNS) e indicar un identificador de la conexión.

Pero realizado así directamente la conexión directa es rechazada por el Cortafuegos, no podemos conectarnos al puerto 5500 de la RPi (VNC Repeater), aparece un error de conexión. La captura de la utilidad CurrPorts de Nirsoft (http://www.nirsoft.net/utils/cports.html) nos permite ver los puertos abiertos y las conexiones. Como se ve, el servidor intenta conectar con la RPi, pero no se llega a establecer conexión.

Por tanto tenemos que “pasar” el Servidor VNC a través del Proxy HTTP. Para ello, vemos las dos opciones: con la aplicación proxyfier y con el túnel SSH con putty:

1) Proxyfier

Una vez descargado, hay que ejecutarlo y configurarlo, indicando el proxy y los datos para la autenticación del mismo (en este caso con el propio usuario de windows)

Ahora añadimos una regla para que sólo pase por el Proxy a la aplicación del VNC server, y editamos la regla por defecto para que haga la conexión directa, pues si no, aplicaciones que ya tienen el proxy configurado fallarán.

Es muy intuitivo y sencillo:

Regla para pasar VNC server y modificación de la regla por defecto

      

Modificamos la regla por defecto, y el resultado final es:

Ahora repetimos la prueba con el VNC Server (Añadir nuevo cliente, indicar dirección del Repetidor VNC y asignar un identificador) , y comprobamos que todo funciona como debe:

El VNC Repeater (RPi) recibe la conexión del servidor VNC:

En el PC corporativo, el estado de las conexiones ahora no es directamente al Repetidor, sino a través del Proxy, y funciona:

Analizando con WireShark, comprobamos que lo que hace Proxyfier es usar el método connect:

2) Putty

Antes de arrancar el Servidor VNC en el equipo coorporativo, debemos establecer el túnel SSH con Putty, así se puede redirigir el tráfico en un determinado puerto a un servidor (usaremos nuestro Repetidor VNC para este propósito también, la RPi). Putty tiene incorporado en sus opciones usar un Proxy como salida (así evitamos tener que usar herramientas como la anterior).

Configuración de la conexión y el Proxy:

           

Y por último el túnel SSH. Lo haremos desde el puerto local 5500, que es el que usa el Servidor VNC para conectarse al repetidor hacia el puerto 5500 de nuestro Repetidor VNC (es importante entender lo que estamos haciendo, en internet pueden encontrarse multitud de tutoriales en relación a túneles SSH)

Una vez configurado, damos al botón Open para establecer la conexión SSH (se nos abrirá una terminal remota en la RPi)

Dejando esa sesión de putty abierta,  arrancamos el Servidor VNC  (Añadir nuevo cliente, indicar dirección del Repetidor VNC y asignar un identificador) , pero con la diferencia de que la dirección del servidor a usar ya no es la dirección de la RPi (Repetidor VNC), sino la local o localhost, pues gracias al túnel SSH, el tráfico local lo estamos redirigiendo al Repetidor VNC:

Una muestra de lo que está pasando con las conexiones, el VNC Server se conecta al puerto 5500 en localhost, y el putty tiene varias conexiones con el proxy:

 

 

C) Equipo Cliente (ordenador de casa)

Una vez que tenemos el Servidor VNC funcionando, de cualquiera de las dos maneras anteriores (u otra)

Ahora queda conectarse desde el equipo en casa (o cualquier otro sitio…) al repetidor VNC con el cliente UltraVNC Viewer, pero con una configuración particular:

  • El servidor al que nos conectamos lo indicamos con el identificador de sesión que pusimos en VNC Server
  • Seleccionamos la casilla de Proxy/Repeater, indicamos la dirección de nuestra RPi con el puerto 5901, que es con el que iniciamos el script en Perl

Al conectar, aparece nuestro escritorio remoto:

Y en el Repetidor VNC (RPi) vemos el log con las conexiones:

Escritorio Remoto con UltraVNC Repeater Port para Linux

No voy a repetir todo, sólo indico la parte correspondiente al Repetidor VNC, basta con descargarse el código, compilarlo y ejecutarlo:

Nos aparece el nuevo archivo ejecutable:

Modificamos el archivo de configuración, para seleccionar el puerto 5901 y no el 5900 (uvncrepeater.ini)

Lo ejecutamos indicando que use como archivo de configuración el del mismo directorio (va a buscar uno en /etc)

  ./repeater uvncrepeater.ini

Todo funciona sin problemas:

Y finalmente, al conectar el VNC Server y el VNC Viewer (por ejemplo usando el túnel SSH), el escritorio remoto funciona:

Habría que hacer pruebas para ver cuál es mejor, si el script en Perl o el ejecutable.

 

 

 

Leave a Reply

Tu dirección de correo electrónico no será publicada.