Infraestructura de soporte remoto Open Source a prueba de NATs

Recientemente, he necesitado dar soporte a distintos clientes de manera remota en sus equipos. Para ello, en algunos conecté los equipos a una VPN y utilicé el servidor de UltraVNC para windows, en otros casos utilicé la herramienta comercial TeamViewer. Sin embargo, necesitaba reemplazar a teamviewer, no porque sea malo, todo lo contrario es buenísimo, pero no tengo licencia y no quería tener que pagarla tampoco (ni utilizarla ilegalmente).

Es por ello que busqué las alternativas libres que existen, ya alguna vez había usado UltraVNC SC que resuelve la mitad del problema (siendo el cliente el que solicita la conexión, se puede saltar su firewall, pero aún queda el de nuestro lado), pero en cuestión de seguridad deja bastante que desear (hay algunos "hacks" para utilizar el creador del ejecutable UltraVNC SC para incluir SecureVNC en lugar de MSRC4, pero funciona con versiones anteriores o solicitando el código fuente al desarrollador...). Para resolver el asunto de la conexión de nuestro lado, se puede resolver de distintas maneras:

  1. Redireccionar los puertos en nuestro router principal. Esta es la opción más sencilla y directa, pero tiene el inconveniente que si nos movemos a una red distinta con un router que no esté redireccionando los puertos, no funcionará.
  2. Utilizar un "repetidor". Esta es la opción que recomiendo, se puede implementar de distintas maneras, yo lo hice utilizando OpenVPN y un servidor con Linux (con un par de reglas de iptables para la redirección de puertos), pero es posible hacerlo también utilizando esta herramienta.

Por lo anterior, decidí realizar una herramienta de soporte propia que sustituya a UltraVNC SC, con los elementos que había a la mano: UltraVNC, SecureVNC e IExpress.

Crear la herramienta de soporte

Para crear la herramienta de soporte (que sustituye a UltraVNC SC) utilizaremos. Descarga lo siguiente:

La versión descargada de UltraVNC instálala en una máquina con windows, CONFIGURA (asigna una contraseña y otros aspectos) el servidor desde el administrador y copia los siguientes archivos de la carpeta de instalación a una nueva carpeta:

  1. winvnc.exe
  2. vnchooks.dll
  3. schook.dll
  4. ultravnc.ini

Puedes utilizar el comando iexpress y crear el archivo utilizando el wizard, incluir los 5 archivos descritos anteriormente en el paquete a crear y asegurarse que se ejecute el siguiente comando cuando se desempaqueten los archivos al dar doble click sobre el ejecutable creado:

winvnc.exe -connect host-ultravnc-viewer:5500 -sc_exit -sc_prompt -run

Cambia "host-ultravnc-viewer" por el nombre del host donde estará el Viewer de UltraVNC escuchando conexiones (la máquina desde la que se dará soporte), la opción "sc_exit" indica que debe cerrar el servidor VNC al terminar la conexión, mientras que la opción "sc_prompt" enviará una alerta a la máquina desde la que se dará soporte para aceptar la conexión.

Todo lo anterior se puede simplificar, si utilizan este script SED y ejecutan el siguiente comando en una terminal windows (verifica las rutas de los archivos en el script SED antes de ejecutarlo):

iexpress /N soporte.SED

Con esto obtendremos un archivo que al ser ejecutado iniciará un servidor VNC en el puerto 5500 y enviará una petición de conexión al host que determinemos (host-ultravnc-viewer). Es muy similar a la función que realiza UltraVNC SC, sin embargo utiliza SecureVNC en lugar de MSRC4. En este artículo no explico cómo incluir PKI, pero es posible realizarlo generando las llaves necesarias (directamente desde winvnc).

Mejoras futuras a la herramienta

El inconveniente de esta herramienta en comparación con UltraVNC SC es que inicia automáticamente la conexión al ser ejecutado y no permite incluir múltiples hosts de soporte, además no es compatible con algunas versiones anteriores de windows (e.g. Windows XP), sería bueno contar con una interfaz gráfica que permita configurar distintos hosts (como lo hace UltraVNC SC), actualmente no conozco ninguna herramienta para windows que permita crear una lista de comandos a ejecutar (gráfica), por lo que es necesario adentrarse en los oscuros rincones de C++ y las MFC (el problema de trabajar con máquina virtuales cuando necesitas una "aplicación ligera y nativa").

Por otro lado, en algunos sistemas actuales que utilizan SmartScreen (e.g. Windows 8), esta aplicación es reconocida como una amenaza, por lo que sería necesario firmar digitalmente el ejecutable para evitar este problema.

Repetidor

El servidor donde corre nuestra VPN (OpenVPN) tiene una IP pública fija, por lo que es utilizado como "repetidor", para permitirme dar soporte desde cualquier ubicación (siempre y cuando esté conectado a la VPN). La manera en la que lo realicé fue la siguiente:

  1. Asigna una IP estática dentro de tu VPN (e.g. a través de client-config-dir) al host que utilizarás para dar soporte (e.g. tu computadora): 172.16.10.101.
  2. Redirige el tráfico al host: iptables -t nat -A PREROUTING -p tcp --dport 5500 -j DNAT --to-destination 172.16.10.101:5500.
  3. Permite NATeo (a.k.a. masquerading) en la interfaz de openvpn: iptables -t nat -A POSTROUTING -p tcp -o tun0 -j MASQUERADE.

Con la configuración anterior, es posible dar soporte desde cualquier ubicación a través de mi laptop, siempre que me encuentre conectado a nuestra VPN.

Host de soporte

Mi laptop corre la distro Archlinux, por lo que corro una máquina virtual de Windows con VirtualBox. En Windows, utilizo el VNCViewer de UltraVNC en modo pasivo (escuchando en el puerto TCP 5500). En un acceso directo en el escritorio, tengo el siguiente comando:

vncviewer.exe -listen -dsmplugin SecureVNCPlugin.dsm

Es necesario para esto que el archivo SecureVNCPlugin.dsm se encuentre en la misma carpeta que el ejecutable vncviewer.exe.

Conclusiones

Con un poco de tiempo y paciencia, es posible crear la infraestructura necesaria para ofrecer soporte remoto sin necesidad de configuraciones complicadas del lado del cliente utilizando software libre.

Posted by:

Share:

Leave a Reply



(Your email will not be publicly displayed.)