Introducción

Virtual Network Computing, o VNC, es un sistema de conexión que le permite usar su teclado y mouse para interactuar con un entorno de escritorio gráfico en un servidor remoto. Hace que administrar archivos, software y ajustes en un servidor remoto sea más fácil para los usuarios que aún no se sienten cómodos con la línea de comandos.

A través de esta guía, configurará un servidor VNC con TightVNC en un servidor Ubuntu 20.04 y se conectará de forma segura a través de un túnel SSH. Luego, utilizará un programa cliente VNC en su equipo local para interactuar con el servidor a través de un entorno de escritorio gráfico.

Requisitos previos

Para completar este tutorial, necesitará lo siguiente:

Paso 1: instalación del entorno de escritorio y el servidor VCN

Por defecto, el servidor Ubuntu 20.04 no incluye un entorno de escritorio gráfico o un servidor VNC instalado, por lo que empezará por instalarlos.

Tiene muchas opciones con respecto a qué servidor VNC y qué entorno de escritorio puede elegir. En este tutorial, instalará paquetes para el entorno de escritorio Xfce más reciente y el paquete de TightVNC disponible en el repositorio oficial de Ubuntu. Tanto Xfce como TightVNC son conocidos por ser ligeros y rápidos, lo que ayudará a garantizar que la conexión de VNC sea homogénea y estable, incluso, con conexiones de Internet más lentas.

Después de conectarse a su servidor con SSH, actualice su lista de paquetes:

  • sudo apt update

Ahora, instale Xfce y el paquete xfce4-goodies, que contiene algunas mejoras para el entorno de escritorio:

  • sudo apt install xfce4 xfce4-goodies

Durante la instalación, es posible que se le solicite elegir un administrador de visualización predeterminado para Xfce. Un administrador de visualización es un programa que le permite seleccionar e iniciar sesión en un entorno de escritorio a través de una interfaz gráfica. Solo utilizará Xfce cuando se conecte con un cliente de VNC, y en estas sesiones de Xfce, ya tendrá la sesión iniciada con su non-root user de Ubuntu. Así que, a los efectos de este tutorial, su elección del administrador de visualización no es relevante. Seleccione cualquiera y presione ENTER.

Cuando finalice la instalación, instale el servidor TightVNC:

  • sudo apt install tightvncserver

Luego, ejecute un comando vncserver para establecer una contraseña de acceso a VNC, cree los archivos de configuración iniciales e inicie una instancia de servidor VNC:

  • vncserver

Se le indicará que introduzca y verifique una contraseña para acceder a su máquina de forma remota:

Output
You will require a password to access your desktops. Password: Verify:

La contraseña debe tener entre seis y ocho caracteres de largo. Las contraseñas de más de 8 caracteres se reducirán automáticamente.

Una vez que verifique la contraseña, tendrá la opción de crear una contraseña de solo lectura. Los usuarios que inicien sesión con la contraseña de solo vista no podrán controlar la instancia de VNC con su mouse o teclado. Esta es una opción útil si desea demostrar algo a otras personas que utilizan su servidor VNC, pero no es un requisito necesario.

Luego, el proceso crea los archivos de configuración predeterminados que se requieren y la información de conexión para el servidor. Además, inicia una instancia de servidor predeterminada en el puerto 5901. Este puerto se llama puerto de visualización, y VNC se refiere a él como :1. VNC puede iniciar varias instancias en otros puertos de visualización, en las que :2 hace referencia al puerto 5902, :3 al puerto 5903, y así sucesivamente:

Output
Would you like to enter a view-only password (y/n)? n xauth: file /home/sammy/.Xauthority does not exist New 'X' desktop is your_hostname:1 Creating default startup script /home/sammy/.vnc/xstartup Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

Tenga en cuenta que si en algún momento quiere cambiar su contraseña o agregar una contraseña de solo lectura, puede hacerlo con el comando vncpasswd:

  • vncpasswd

En este momento, el servidor VNC está instalado y en ejecución. Ahora, lo configuraremos para iniciar Xfce y que permita el acceso al servidor a través de una interfaz gráfica.

Paso 2: configuración del servidor VNC

El servidor VNC debe saber qué comandos ejecutar cuando se inicia. Específicamente, VNC debe saber a qué entorno de escritorio gráfico deberá conectarse.

Los comandos que ejecuta el servidor VNC durante el inicio están ubicados en un archivo de configuración denominado xstartup en la carpeta .vnc, en el directorio de inicio. La secuencia de comandos de inicio se creó cuando ejecutó el comando vncserver en el paso anterior, pero creará una propia para abrir el escritorio Xfce.

Debido a que cambiará la configuración del servidor VNC, primero, detenga la instancia del servidor VNC que se está ejecutando en el puerto 5901 con el siguiente comando:

  • vncserver -kill :1

El resultado tendrá el siguiente aspecto, pero verá un PID diferente:

Output
Killing Xtightvnc process ID 17648

Antes de modificar el archivo xstartup, realice una copia de seguridad del original:

  • mv ~/.vnc/xstartup ~/.vnc/xstartup.bak

Ahora, cree un nuevo archivo xstartup y ábralo en un editor de texto, como nano:

  • nano ~/.vnc/xstartup

Luego, agregue las siguientes líneas al archivo:

~/.vnc/xstartup
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &

La primera línea es un shebang. En los archivos ejecutables de texto sin formato que están en las plataformas *nix, un shebang le indica al sistema qué intérprete debe utilizarse para ejecutarlo. En este caso, está pasando el archivo al intérprete Bash. Esto permitirá que cada línea sucesiva se ejecute como comandos, en orden.

El primer comando del archivo, xrdb $HOME/.Xresources, le indica al marco de trabajo de la GUI de VNC que lea el archivo .Xresources del usuario del servidor. El archivo .Xresources es donde un usuario puede realizar cambios a ajustes concretos del escritorio gráfico, como los colores de la terminal, los temas del cursor y la renderización de fuentes. El segundo comando le indica al servidor que inicie Xfce. Cada vez que inicie o reinicie el servidor VNC, estos comandos se ejecutarán automáticamente.

Guarde y cierre el archivo después de añadir estas líneas. Si utiliza nano, podrá hacerlo presionando CTRL+X, Y y luego ENTER.

Para garantizar que el servidor VNC pueda utilizar este nuevo archivo de inicio correctamente, deberá hacerlo ejecutable:

  • chmod +x ~/.vnc/xstartup

Luego, reinicie el servidor VNC:

  • vncserver -localhost

Observe que esta vez el comando incluye la opción -localhost, que vincula el servidor VNC a la interfaz de bucle invertido de su servidor. Esto hará que VNC solo permita las conexiones que provienen del servidor en el que está instalado.

En el siguiente paso, establecerá un túnel SSH entre su equipo local y su servidor; básicamente, lo que hacemos es engañar a VNC para que crea que la conexión proveniente del equipo local se originó en el servidor. Esta estrategia agregará una capa adicional de seguridad en torno a VNC, ya que los únicos usuarios que podrán acceder son aquellos que ya cuentan con el acceso de SSH al servidor.

Verá un resultado similar a este:

Output
New 'X' desktop is your_hostname:1 Starting applications specified in /home/sammy/.vnc/xstartup Log file is /home/sammy/.vnc/your_hostname:1.log

Una vez que lo haya configurado, está listo para conectarse al servidor VNC desde el equipo local.

Paso 3: conexión segura al escritorio de VNC

VNC no utiliza protocolos seguros cuando se conecta. Para establecer una conexión segura con el servidor, establecerá un túnel SSH y, luego, le indicará al cliente VNC que se conecte a través de ese túnel en lugar de crear una conexión directa.

Cree una conexión SSH en su equipo local que se reenvíe de forma segura a la conexión localhost para VNC. Puede hacerlo a través de la terminal en Linux o macOS con el siguiente comando ssh:

  • ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

A continuación, se explican las opciones del comando ssh:

  • -L 59000:localhost:5901: el conmutador -L especifica que el puerto determinado en el equipo local (59000) se debe redireccionar al host y puerto determinados en el servidor de destino (localhost:5901, es decir, el puerto 5901 en el servidor de destino, definido como your_server_ip). Tenga en cuenta que el puerto local que especifica es de algún modo arbitrario; siempre que el puerto no esté vinculado a otro servicio, puede utilizarlo como el puerto de redirección para el túnel.
  • -C: este indicador habilita la compresión, que puede ayudar a reducir el consumo de recursos y acelerar los procesos.
  • -N: esta opción le indica a ssh que no quiere ejecutar comandos remotos. Este ajuste es útil cuando solo quiere redireccionar los puertos.
  • -l sammy your_server_ip: el conmutador -l permite especificar el usuario con el que quiere iniciar sesión cuando se conecte al servidor. Asegúrese de sustituir sammy y your_server_ip con el nombre del non-root user y la dirección IP de su servidor.

Nota: este comando establece un túnel SSH que redirecciona la información desde el puerto 5901 del servidor VNC hacia el puerto 59000 del equipo local a través del puerto 22 de cada equipo, que es el puerto predeterminado para SSH. Suponiendo que cumplió con el requisito previo, Guía de configuración inicial del servidor para Ubuntu 20.04, habrá agregado una regla UFW para permitir las conexiones con su servidor a través de OpenSSH.

Este método es más seguro que simplemente abrir el firewall de su servidor para permitir las conexiones al puerto 5901, ya que eso posibilitaría que cualquier persona acceda al servidor a través de VNC. Al conectarse a través de un túnel SSH, está limitando el acceso a los equipos que ya tienen acceso de SSH al servidor.

Si está utilizando PuTTY para conectarse a su servidor, puede crear un túnel SSH haciendo clic con el botón secundario en la barra superior de la ventana de la terminal y, luego, en la opción Cambiar la configuración…:

Haga clic con el botón secundario en la barra superior para mostrar la opción Cambiar la configuración

Busque la rama Conexión en el menú con estructura de árbol ubicado en la parte izquierda de la ventana de reconfiguración de PuTTY. Despliegue la rama SSH y haga clic en Túneles. En la pantalla Opciones de control del puerto de redirección SSH, ingrese 59000 como el puerto fuente y localhost:5901 como el destino, tal como se muestra en la imagen:

Ejemplo de la configuración del túnel SSH de PuTTY

Luego, haga clic en el botón Agregar y, a continuación, en el botón Aplicar para implementar el túnel.

Una vez que el túnel se esté ejecutando, utilice un cliente VNC para conectar a localhost:59000. Se le pedirá que autentique usando la contraseña que configuró en el Paso 1.

Una vez conectado, verá el escritorio Xfce predeterminado. Debería tener un aspecto similar a este:

Conexión de VNC al servidor Ubuntu 20.04 con el entorno de escritorio Xfce

Puede acceder a los archivos en su directorio principal con el administrador de archivos o desde la línea de comandos, como se indica aquí:

Administrador de archivos a través de la conexión de VNC a Ubuntu 20.04

Pulse CTRL+C en su terminal para detener el túnel SSH y regresar a su solicitud. Esto también desconectará su sesión de VNC.

Ahora, puede configurar su servidor VNC para que se ejecute como un servicio de systemd.

Paso 4: ejecución de VNC como servicio del sistema

Al configurar el servidor VNC para que se ejecute como un servicio de systemd, puede iniciarlo, detenerlo y reiniciarlo según sea necesario, tal como haría con cualquier otro servicio. También puede utilizar los comandos de administración de systemd para asegurarse de que VNC se inicie cuando el servidor arranque.

Primero, cree un nuevo archivo de unidad que llamaremos /etc/systemd/system/vncserver@.service:

  • sudo nano /etc/systemd/system/vncserver@.service

El símbolo @ al final del nombre nos dejará pasar un argumento que puede utilizar en la configuración del servicio. Lo utilizará para especificar el puerto de visualización de VNC que quiere utilizar cuando administre el servicio.

Añada las siguientes líneas al archivo. Asegúrese de cambiar el valor de User, Group, WorkingDirectory y el nombre de usuario en el valor de PIDFILE para que coincidan con su nombre de usuario:

/etc/systemd/system/vncserver@.service
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

El comando ExecStartPre detiene VNC si ya se está ejecutando. El comando ExecStart inicia VNC y establece la profundidad del color a color de 24 bits con una resolución de 1280 x 800. También puede modificar estas opciones de inicio según sus necesidades. Además, observe que el comando ExecStart incluye nuevamente la opción -localhost.

Guarde y cierre el archivo.

A continuación, informe al sistema de la existencia de un nuevo archivo de unidad:

  • sudo systemctl daemon-reload

Habilite el archivo de unidad:

  • sudo systemctl enable vncserver@1.service

El 1 tras el signo @ indica en qué número de pantalla debe aparecer el servicio; en este caso, el valor predeterminado es :1, como se explicó en el paso 2.

Detenga la instancia actual del servidor de VNC si aún se está ejecutando:

  • vncserver -kill :1

Luego, inícielo tal como iniciaría cualquier otro servicio de systemd:

  • sudo systemctl start vncserver@1

Puede verificar si ha comenzado con este comando:

  • sudo systemctl status vncserver@1

Si se inició correctamente, el resultado debería verse así:

Output
● vncserver@1.service - Start TightVNC server at startup Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2020-05-07 17:23:50 UTC; 6s ago Process: 39768 ExecStartPre=/usr/bin/vncserver -kill :1 > /dev/null 2>&1 (code=exited, status=2) Process: 39772 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS) Main PID: 39795 (Xtightvnc) ...

Ahora, el servidor VNC está listo para ser utilizado cada vez que arranque su servidor, y puede administrarlo con los comandos systemctl, como cualquier otro servicio de systemd.

Sin embargo, no habrá diferencias del lado del cliente. Para volver a conectarse, inicie el túnel SSH de nuevo:

  • ssh -L 59000:localhost:5901 -C -N -l sammy your_server_ip

Luego, realice una nueva conexión utilizando el software del cliente de VNC con localhost:59000 para conectarse con el servidor.

Conclusión

Ahora, tiene un servidor de VNC seguro ejecutándose en su servidor Ubuntu 20.04. Ahora podrá administrar sus archivos, software y ajustes con una interfaz gráfica fácil de utilizar, y podrá ejecutar software gráfico, como navegadores web, de forma remota.

0 Comments

Creative Commons License