Algunos usuarios alquilan VPS relativamente económicos con Windows para ejecutar servicios de escritorio remoto. Lo mismo se puede hacer en Linux sin necesidad de alojar hardware propio en un centro de datos o alquilar un servidor dedicado. Algunos necesitan un entorno gráfico familiar para pruebas y desarrollo o un escritorio remoto con un ancho de banda amplio para trabajar desde dispositivos móviles. Hay muchas opciones para la implementación del sistema Virtual Network Computing (VNC) basado en el protocolo Remote FrameBuffer (RFB). En este breve artículo, explicaremos cómo configurarlo en una máquina virtual con cualquier hipervisor.
Contenido:
Selección del servidor VNC
El servicio VNC se puede integrar en el sistema de virtualización, donde el hipervisor lo conectará a los dispositivos emulados sin necesidad de configuración adicional. Esta opción conlleva costosos gastos y no es soportada por todos los proveedores, incluso en una implementación menos intensiva, cuando en lugar de simular un dispositivo gráfico real, se pasa a la máquina virtual una abstracción simplificada (framebuffer). A veces, el servidor VNC se vincula a un servidor X en funcionamiento, pero este método es más adecuado para acceder a una máquina física, ya que en una virtual presenta una serie de complejidades técnicas. Lo más sencillo es instalar un servidor VNC con un servidor X integrado. No requiere hardware físico (adaptador de video, teclado y ratón) ni su emulación por parte del hipervisor, por lo que es adecuado para VPS de cualquier tipo.
Instalación y configuración
Necesitaremos una máquina virtual con Ubuntu Server 18.04 LTS en su configuración predeterminada. En los repositorios estándar de esta distribución hay varios servidores VNC: , , y otros. Nos hemos decidido por TigerVNC, un fork actual de TightVNC que ya no es soportado por el desarrollador. La configuración de otros servidores se realiza de manera similar. También es necesario elegir un entorno de escritorio: en nuestra opinión, la opción óptima es XFCE debido a sus relativamente bajos requerimientos de recursos computacionales. Aquellos que lo deseen pueden instalar otro DE o WM: aquí depende de las preferencias personales, sin embargo, la elección del software afecta directamente la necesidad de memoria RAM y núcleos de procesamiento.

La instalación del entorno de escritorio con todas las dependencias se realiza con el siguiente comando:
sudo apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsA continuación, es necesario instalar el servidor VNC:
sudo apt-get install tigervnc-standalone-server tigervnc-commonEjecutarlo con privilegios de superusuario es una mala idea. Creamos un usuario y un grupo:
sudo adduser vnc 
Agregaremos al usuario al grupo sudo para que pueda abordar tareas relacionadas con la administración. Si no es necesario, se puede omitir este paso:
sudo gpasswd -a vnc sudoEn el siguiente paso, necesitamos iniciar el servidor VNC con privilegios del usuario vnc para crear una contraseña segura y los archivos de configuración en el directorio ~/ .vnc/. La longitud de la contraseña puede ser de 6 a 8 caracteres (los adicionales se recortan). Si es necesario, también se establece una contraseña solo para ver, es decir, sin acceso al teclado y al ratón. Los siguientes comandos se ejecutan en nombre del usuario vnc:
su - vnc
vncserver -localhost no 
Por defecto, el protocolo RFB utiliza un rango de puertos TCP de 5900 a 5906, que son los llamados puertos de visualización, cada uno de los cuales corresponde a una pantalla del servidor X. Estos puertos están asociados con pantallas desde :0 hasta :6. La instancia del servidor VNC que hemos iniciado escucha en el puerto 5901 (pantalla :1). Otras instancias pueden funcionar en otros puertos con pantallas :2, :3, etc. Antes de continuar con la configuración, necesitamos detener el servidor:
vncserver -kill :1El comando debería generar un mensaje similar a: «Killing Xtigervnc process ID 18105… success!».
Al iniciar TigerVNC, se ejecuta el script ~/ .vnc/ xstartup para configurar los parámetros de configuración. Crearemos nuestro propio script, guardando primero una copia de seguridad del existente, si es que existe:
mv ~/ .vnc/ xstartup ~/ .vnc/ xstartup.b
nano ~/ .vnc/ xstartupLa sesión del entorno de escritorio XFCE se inicia con el siguiente script xstartup:
#!/bin/bash
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
xrdb $HOME/.Xresources
exec /usr/bin/startxfce4 &El comando xrdb es necesario para que el sistema VNC lea el archivo .Xresources en el directorio home. Allí, el usuario puede definir varios parámetros del entorno gráfico: renderizado de fuentes, colores del terminal, temas del cursor, etc. El script debe hacerse ejecutable:
chmod 755 ~/ .vnc/ xstartupCon esto, la configuración del servidor VNC está completa. Si se inicia con el comando vncserver -localhost no (como el usuario vnc), se podrá conectar con la contraseña establecida anteriormente y ver la siguiente imagen:

Iniciar el servicio a través de systemd
El inicio manual del servidor VNC no es adecuado para un uso en producción, por lo que configuraremos un servicio del sistema. Los comandos se ejecutan en nombre de root (usamos sudo). Primero, creamos un nuevo archivo de unidad para nuestro servidor:
sudo nano /etc/systemd/system/vncserver@.serviceEl símbolo @ en el nombre permite pasar un argumento para configurar el servicio. En nuestro caso, establece el puerto de visualización VNC. El archivo de unidad consta de varias secciones:
[Unit]
Description=Servidor TigerVNC
After=syslog.target network.target
[Service]
Type=simple
User=vnc
Group=vnc
WorkingDirectory=/home/vnc
PIDFile=/home/vnc/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x960 :%i
ExecStop=/usr/bin/vncserver -kill :%i
[Install]
WantedBy=multi-user.targetLuego, hay que notificar a systemd sobre la aparición de un nuevo archivo y activarlo:
sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.serviceEl número 1 en el nombre establece el número de pantalla.
Detenemos el servidor VNC, lo iniciamos como un servicio y verificamos su estado:
# от имени пользователя vnc
vncserver -kill :1# с привилегиями суперпользователя
sudo systemctl start vncserver@1
sudo systemctl status vncserver@1Si el servicio está funcionando, deberíamos recibir un resultado similar.

Conexión al escritorio
Nuestra configuración no utiliza cifrado, por lo que los paquetes de red pueden ser interceptados por atacantes. Además, en los servidores VNC se suelen , por lo que no es recomendable abrirlos para acceso desde Internet. Para una conexión segura en la computadora local, es necesario empaquetar el tráfico en un túnel SSH y luego configurar el cliente VNC. En Windows se puede usar un cliente gráfico de SSH (por ejemplo, PuTTY). Para mayor seguridad, TigerVNC en el servidor solo escucha en localhost y no es accesible directamente desde redes públicas:
sudo netstat -ap |more 
En Linux, FreeBSD, OS X y otros sistemas operativos similares a UNIX, el túnel desde la computadora cliente se realiza usando la herramienta ssh (en el servidor VNC debe estar funcionando sshd):
ssh -L 5901:127.0.0.1:5901 -C -N -l vnc vnc_server_ipLa opción -L vincula el puerto 5901 de la conexión remota al puerto 5901 en localhost. La opción -C activa la compresión, y -N le indica a la herramienta ssh que no es necesario ejecutar un comando remoto. La opción -l establece el login para el acceso remoto.
Después de configurar el túnel en la computadora local, es necesario iniciar el cliente VNC y establecer una conexión con el host 127.0.0.1:5901 (localhost:5901), utilizando para acceder al servidor VNC la contraseña establecida anteriormente. Ahora podemos interactuar de forma segura a través de un túnel cifrado con el entorno de escritorio XFCE en la VPS. En la captura de pantalla del emulador de terminal, se está ejecutando la herramienta top para mostrar el bajo consumo de recursos de la máquina virtual. A partir de aquí, todo dependerá de las aplicaciones del usuario.

Instalar y configurar un servidor VNC en Linux se puede hacer prácticamente en cualquier VPS. No se necesitan configuraciones costosas y que consumen muchos recursos con emulación de adaptador de video ni comprar licencias comerciales de software. Aparte de la opción que hemos considerado para el servicio del sistema, hay otras: ejecutar en modo demonio (a través de /etc/rc.local) al iniciar el sistema o a demanda mediante inetd. Esta última es interesante para crear configuraciones multiusuario. El super servidor de Internet iniciará el servidor VNC y lo conectará con el cliente, mientras que el servidor VNC creará una nueva pantalla y comenzará una sesión. Para la autenticación dentro de ella se puede utilizar un gestor de pantalla gráfico (por ejemplo, ), y después de que el cliente se desconecte, la sesión se cerrará y todos los programas en la pantalla se cerrarán.
Fuente: habr.com
