Integración de noVNC para Acceso VNC en Plataformas de Virtualización Web

En el desarrollo de plataformas de gestión de máquinas virtuales, especialmente aquellas que utilizan tecnologías de virtualización como KVM, surge la necesidad crítica de proporcionar a los usuarios un acceso remoto a las consolas de sus máquinas virtuales directamente desde un navegador web. Tradicionalmente, esto se lograba mediante applets de Java o soluciones de escritorio remoto nativas, pero las limitaciones de seguridad y la disminución del soporte de navegadores para los applets han impulsado la búsqueda de alternativas modernas y más seguras.

Una de las soluciones más eficientes y ligeras para este propósito es noVNC. Esta herramienta, ampliamente adoptada incluso por grandes proyectos como OpenStack, permite acceder a servicios VNC remotos a través de una interfaz web basada en HTML5 Canvas. A diferencia de un cliente VNC tradicional que se conecta directamente al servidor VNC, noVNC opera a través de un proxy intermedio que convierte el tráfico TCP/IP del VNC en un flujo de datos WebSocket, compatible con los navegadores web modernos.

Principio de Funcionamiento de noVNC

El corazón de la integración de noVNC es el componente websockify. Este script actúa como un puente o proxy que toma una conexión VNC estándar (TCP) y la encapsula dentro de un protocolo WebSocket. El navegador web del usuario se conecta al servidor websockify a través de WebSocket, y websockify, a su vez, establece la conexión TCP con el servidor VNC de la máquina virtual. Para gestionar múltiples conexiones a diferentes máquinas virtuales de forma segura, websockify puede configurarse para usar un sistema de "tokens" o identificadores que mapean una ruta específica a una dirección IP y puerto VNC de destino.

Consideremos un escenario típico donde tenemos nodos de cómputo con máquinas virtuales (por ejemplo, en las direccinoes 172.18.1.101 y 172.18.1.102) ejecutando servidores VNC en sus puertos locales (ej. 5900-5909). El servidor websockify de noVNC se desplegará en un servidor dedicado, por ejemplo, en 172.18.1.11, escuchando en un puerto específico como el 8080.

Configuración Básica del Proxy websockify

Para que websockify pueda dirigir las conexiones a los servidores VNC correctos, se utiliza un archivo de configuración de destino. Este archivo contiene mapeos entre identificadores únicos (tokens) y las direcciones de los servidores VNC. Cada línea del archivo representa un token y su correspondiente destino VNC.

Creamos un directorio para almacenar estos archivos de tokens, por ejemplo, /etc/vnc_proxy/tokens. Un archivo de configuración para una máquina virtual específica podría lucir así:

vm_console_token_12345: 172.18.1.101:5908

Este archivo mapea el token vm_console_token_12345 al servidor VNC ubicado en 172.18.1.101 en el puerto 5908.

Para iniciar el servicio websockify, ejecutamos el siguiente comando, asegurándonos de especificar el directorio web de noVNC y el archivo de configuración de tokens:

nohup python3 /opt/noVNC/utils/websockify/run --web /opt/noVNC --target-config=/etc/vnc_proxy/tokens 8080 >> /var/log/websockify.log 2>&1 &

En este comando:

  • /opt/noVNC es la ruta donde se ha clonado o instalado noVNC.
  • --web /opt/noVNC indica a websockify dónde encontrar los archivos estáticos del cliente web de noVNC (vnc_auto.html, CSS, JS, etc.).
  • --target-config=/etc/vnc_proxy/tokens apunta al directorio que contiene los archivos de configuración de tokens.
  • 8080 es el puerto en el que websockify escuchará las conexiones WebSocket.
  • >> /var/log/websockify.log 2>&1 & redirige la salida a un archivo de registro y ejecuta el proceso en segundo plano.

Acceso desde el Navegador Web

Una vez que el proxy websockify está en funcionamiento, se puede acceder a la consola VNC de la máquina virtual desde cualquier navegador web compatible con HTML5. Para ello, se utiliza la página cliente vnc_auto.html de noVNC, pasándole los parámetros de conexión adecuados:

https://[IP_DEL_PROXY]:[PUERTO_DEL_PROXY]/vnc_auto.html?host=[IP_DEL_PROXY]&port=[PUERTO_DEL_PROXY]&path=[TOKEN_DE_LA_VM]

Utilizando los valores del ejemplo anterior:

https://172.18.1.11:8080/vnc_auto.html?host=172.18.1.11&port=8080&path=vm_console_token_12345

Esta URL conectará el navegador al proxy websockify, el cual, utilizando el token vm_console_token_12345, establecerá la conexión VNC con la máquina virtual en 172.18.1.101:5908.

Integración en Proyectos Existentes

Para integrar noVNC en una plataforma de gestión de máquinas virtuales existente, se pueden seguir los siguientes pasos:

  1. Configuración de Red: Si la plataforma será accesible desde la red pública, configure el enrutador o firewall para mapear un puerto público (ej. 8080) al puerto interno del servidor websockify (ej. 172.18.1.11:8080).
  2. Archivos del Cliente noVNC: Copie los archivos necesarios del cliente noVNC (vnc_auto.html, directorios core, vendor, app, etc.) al directorio de activos estáticos de su aplicación web.
  3. Lógica Backend: Implemente una acción o controlador en su servidor de aplicaciones que se ejecute cuando un usuario solicite acceso a la consola de una VM:
    • Autentique y autorice al usuario para acceder a la VM solicitada.
    • Recupere la dirección IP y el puerto VNC de la máquina virtual desde su base de datos o sistema de gestión.
    • Genere dinámicamente un archivo de token en el directorio configurado para websockify (ej. /etc/vnc_proxy/tokens). Este archivo contendrá el mapeo del token generado a la IP y puerto VNC de la VM.
    • Redirija al usuario a la URL del cliente noVNC (ej. /vnc_auto.html) pasándole los parámetros del servidor proxy (IP y puerto) y el token generado, así como cualquier contraseña VNC si es necesaria.
  4. Acceso Web: El usuario será redirigido a la interfaz de noVNC en el navegador, donde podrá interactuar con la consola de la máquina virtual.

Consideraciones Adicionales y Futuras Mejoras

Para entornos de prroducción o escenarios más complejos, se deben considerar las siguientes mejoras:

  • Conexiones Seguras (SSL/TLS): Configure websockify para utilizar SSL/TLS para cifrar las conexiones WebSocket, protegiendo así el tráfico entre el navegador del usuario y el proxy. Esto es crucial si el acceso es a través de redes no confiables.
  • Escalabilidad y Alta Disponibilidad: Implemente múltiples instancias de websockify y utilice un balanceador de carga o un proxy inverso como Nginx para distribuir el tráfico y garantizar la disponibilidad. Nginx puede configurarse para actuar como un proxy WebSocket.
  • Gestión de Contraseñas VNC: Implemente un sistema robusto para el manejo de contraseñas VNC, que podría incluir la generación de contraseñas de un solo uso o un protocolo de intercambio de claves seguro entre la aplicación web y el servidor websockify.

Etiquetas: noVNC WebSocket VNC KVM virtualización

Publicado el 7-18 03:12