Cómo utilizar Apache Guacamole para crear una conexión VNC

Hace poco aprendiste a instalar y utilizar Apache Guacamole para crear una conexión SSH en un servidor basado en Rocky Linux 8. Uno de los usos más populares de Guacamole es utilizarlo como visor VNC (Virtual Network Computing). Usando VNC, puedes acceder a tu escritorio o a un servidor desde cualquier lugar sin instalar ningún cliente de terceros.

En este tutorial, aprenderás a instalar VNC en tu servidor Linux y a utilizar Guacamole para crear una conexión VNC. Cubriremos todas las distribuciones comunes y especificaremos las diferencias cuando sea necesario.

Requisitos previos

  • Un servidor con Rocky Linux, CentOS, AlmaLinux, Ubuntu o Debian.

  • Debe estar instalado Apache Guacamole. Sigue nuestros tutoriales para ello.

  • Un usuario no root con privilegios sudo en el servidor al que te conectas.

  • Un mínimo de 2 núcleos de CPU y 4GB de RAM en tus servidores remotos para una conexión VNC sin problemas.

  • Asegúrate de que todo está actualizado.

    CentOS / Rocky Linux / AlmaLinux

    $ sudo dnf update
    

    Ubuntu / Debian

    $ sudo apt update && sudo apt upgrade
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.

    CentOS / Rocky Linux / AlmaLinux

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

    Ubuntu / Debian

    $ sudo apt install wget curl nano unzip -y
    

Paso 1 – Instala la interfaz gráfica de escritorio en tu servidor

Para nuestro tutorial, instalaremos el entorno gráfico Xfce. Sin embargo, puedes optar por instalar cualquier entorno de tu elección. Ejecuta los siguientes comandos para instalar una GUI.

CentOS / Rocky Linux / AlmaLinux

$ sudo dnf install -y epel-release
$ sudo dnf groupinstall -y "Xfce" "base-x"
$ sudo systemctl set-default graphical
$ sudo reboot

Si has seguido nuestro tutorial de Apache Guacamole, el repositorio EPEL ya estará instalado, por lo que puedes saltarte el primer comando. El segundo comando instala el entorno gráfico propiamente dicho y las librerías, y el tercer comando establece el entorno GUI por defecto. Tienes que reiniciar el servidor para que la instalación surta efecto.

Ubuntu / Debian

$ sudo apt install xfce4 xfce4-goodies
$ sudo systemctl set-default graphical
$ sudo reboot

Paso 2 – Instalar el servidor TigerVNC

Hay muchas aplicaciones de servidor VNC que puedes instalar en tu sistema. Para nuestro tutorial, instalaremos el software de servidor TigerVNC.

Ejecuta el siguiente comando para instalar el servidor TigerVNC.

CentOS / Rocky Linux / AlmaLinux

$ sudo dnf install tigervnc-server

Ubuntu / Debian

$ sudo apt install tigervnc-standalone-server

Paso 3 – Crear las credenciales de usuario VNC

El siguiente paso es crear un usuario del sistema para VNC desde el que se realizará la conexión.

CentOS / Rocky Linux / AlmaLinux

Ejecuta los siguientes comandos para crear un nuevo usuario y establecer una contraseña. Sustituye vncuser por un nombre de usuario de tu elección.

$ sudo adduser vncuser
$ sudo passwd vncuser

El siguiente paso es crear una contraseña de acceso que se utilizará para conectarse desde el cliente VNC al servidor de tu máquina.

Pasa a la página vncuser.

$ sudo su - vncuser

Establece una contraseña de acceso a VNC.

$ vncpasswd 
Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:

Se te pedirá que crees una contraseña y que la verifiques. A continuación, se te preguntará si quieres crear una contraseña de sólo vista. Una contraseña de sólo vista es útil si quieres limitar el acceso VNC a sólo ver el sistema y prohibir cualquier interacción con el ratón o el teclado. Introduce y si quieres configurar dicha contraseña o introduce n para finalizar el proceso.

Sal del shell vncuser.

$ exit

Ubuntu / Debian

Ejecuta el siguiente comando para crear un nuevo usuario y establecer una contraseña. Sustituye vncuser por un nombre de usuario de tu elección.

$ sudo adduser vncuser
Adding user `vncuser' ...
Adding new group `vncuser' (1001) ...
Adding new user `vncuser' (1001) with group `vncuser' ...
Creating home directory `/home/vncuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for vncuser
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] y

Cambia a la página vncuser.

$ sudo su - vncuser

Establece una contraseña de acceso a VNC.

$ vncpasswd 
Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:

Tenemos que configurar el archivo de inicio para que TigerVNC utilice Xfce.

Abre el archivo ~/.vnc/xstartup para editarlo.

$ sudo nano ~/.vnc/xstartup

Pega en él el siguiente código.

#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4 

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida guardar.

Puedes configurar opciones adicionales para el VNC a través del archivo ~/.vnc/config. Crea y abre el archivo para editarlo.

$ sudo nano ~/.vnc/config

Pega en él el siguiente código.

geometry=1024x768
dpi=96
depth=24

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida que lo guardes.

Prueba el servidor VNC.

$ vncserver
/usr/bin/xauth:  file /home/vncuser/.Xauthority does not exist


New 'vncdesktop:1 (vncuser)' desktop at :1 on machine vncdesktop

Starting applications specified in /home/vncuser/.vnc/xstartup
Log file is /home/vncuser/.vnc/vncdesktop:1.log

Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/vncuser/.vnc/passwd :1 to connect to the VNC server.

Puedes obtener una lista de todas las sesiones VNC actuales utilizando el siguiente comando.

$ vncserver -list
TigerVNC server sessions:

X DISPLAY #     RFB PORT #      PROCESS ID
:1              5901            1029

A continuación, tenemos que matar el proceso porque, en el siguiente paso, crearemos un archivo de servicio para él.

$ vncserver -kill :1
Killing Xtigervnc process ID 1029... success!

Sal del shell del usuario.

$ exit

Paso 4 – Crear el archivo de unidad VNC Systemd

CentOS / Rocky Linux / AlmaLinux

El archivo de unidad de servicio systemd de TigerVNC está disponible en el directorio /lib/systemd/system. Copia el archivo en el directorio /etc/systemd/system.

$ sudo cp /lib/systemd/system/[email protected] /etc/systemd/system/vncserver@:1.service

El servidor VNC se ejecuta por defecto en el puerto 5900. Cada usuario debe ejecutar su instancia de servidor VNC en un puerto distinto. El número :1 al final del comando indica a VNC que ejecute el servicio en un subpuerto de 5900. Por tanto, :1 se traduce en el puerto 5900, :2 se traduce en el puerto 5902 y así sucesivamente.

No sólo VNC debe saber el número de puerto en el que ejecutar el servicio, sino que también debes especificar qué usuario ejecutará el servidor bajo qué número de puerto. Puedes configurar esto editando el archivo /etc/tigervnc/vncserver.users. Ábrelo para editarlo.

$ sudo nano /etc/tigervnc/vncserver.users

Introduce el valor :1=vncuser justo antes de # :2=andrew para que tenga el siguiente aspecto.

# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
  :1=vncuser
# :2=andrew
# :3=lisa

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida que lo guardes.

Ubuntu / Debian

El instalador no instala un archivo de servicio systemd en los sistemas Ubuntu o Debian. Tienes que crearlo manualmente. Crea y abre el archivo de unidad systemd para TigerVNC.

$ sudo nano /etc/systemd/system/[email protected]

Pega en él el siguiente código.

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple
User=vncuser
PAMName=login
PIDFile=/home/%u/.vnc/%H%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver :%i -geometry 1440x900 -alwaysshared -fg
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida guardar.

El siguiente paso es común a todas las distribuciones de Linux.

Recarga el demonio systemd para activar el servicio.

$ sudo systemctl daemon-reload

Paso 5 – Iniciar el servidor VNC

CentOS / Rocky Linux / AlmaLinux

Inicia el servicio del servidor VNC.

$ sudo systemctl start vncserver@:1

Si quieres que el servicio siga funcionando a pesar de los reinicios del sistema, puedes activarlo.

$ sudo systemctl enable vncserver@:1

Comprueba el estado del servicio.

$ sudo systemctl status vncserver@:1
? vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-03-16 01:16:18 UTC; 6s ago
  Process: 6777 ExecStart=/usr/libexec/vncsession-start :1 (code=exited, status=0/SUCCESS)
 Main PID: 6784 (vncsession)
    Tasks: 0 (limit: 11179)
   Memory: 1.1M
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ? 6784 /usr/sbin/vncsession vncuser :1

Mar 16 01:16:18 guacamole systemd[1]: Starting Remote desktop service (VNC)...
Mar 16 01:16:18 guacamole systemd[1]: Started Remote desktop service (VNC).

Ubuntu / Debian

Inicia el servicio del servidor VNC.

$ sudo systemctl start [email protected]

Activa el servicio VNC.

$ sudo systemctl enable [email protected]

Comprueba el estado del servicio.

$ sudo systemctl status [email protected]
? [email protected] - Remote desktop service (VNC)
     Loaded: loaded (/etc/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-03-19 09:42:28 UTC; 6s ago
    Process: 1420 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
   Main PID: 1455 (vncserver)
      Tasks: 0 (limit: 4686)
     Memory: 884.0K
     CGroup: /system.slice/system-vncserver.slice/[email protected]
             ? 1455 /usr/bin/perl /usr/bin/vncserver :1 -geometry 1440x900 -alwaysshared -fg

Mar 19 09:42:28 vncdesktop systemd[1]: Starting Remote desktop service (VNC)...
Mar 19 09:42:28 vncdesktop systemd[1420]: pam_unix(login:session): session opened for user vncuser by (uid=0)
Mar 19 09:42:28 vncdesktop systemd[1]: Started Remote desktop service (VNC).
Mar 19 09:42:29 vncdesktop systemd[1455]: pam_unix(login:session): session opened for user vncuser by (uid=0)

Paso 6 – Configurar el cortafuegos

Para que el VNC sea accesible a través de la red, necesitamos abrir sus puertos.

CentOS / Rocky Linux / AlmaLinux

Ejecuta el siguiente comando para abrir los puertos del VNC y recargar el cortafuegos.

$ sudo firewall-cmd --permanent --add-service=vnc-server
$ sudo firewall-cmd --reload

Ubuntu / Debian

$ sudo ufw allow 5901:5910/tcp
$ sudo ufw reload

Paso 7 – Crea una conexión VNC con el servidor CentOS / Rocky Linux / AlmaLinux

Abre tu URL de Guacamole e introduce tus credenciales para iniciar la sesión.

Visita la pestaña Conexiones en Configuración de Guacamole. Haz clic en el botón Nueva conexión.

Guacamole Nueva Conexión

Elige un nombre para tu conexión y selecciona VNC en el menú desplegable.

Tipo de conexión VNC de Guacamole

En la sección Parámetros, introduce la dirección IP de tu servidor (167.172.46.187 en nuestro caso) como nombre de host y 5901 como puerto. En la secciónAutenticación, introduce el nombre de usuario y la contraseña de tu sistema VNC.

Parámetros VNC de Guacamole

Si quieres habilitar alguna configuración adicional, hazlo. Haz clic en Guardar para terminar de añadir la conexión.

Accede a tu máquina mediante VNC

Visita el panel de control de Guacamole y haz clic en tu conexión VNC en la sección Todas las conexiones.

Lista de conexiones VNC de Guacamole

Te aparecerá la pantalla de bloqueo de tu servidor.

Pantalla de bloqueo del escritorio VNC de Guacamole

Retírala e introduce tus credenciales de usuario VNC.

Pantalla de inicio de sesión del escritorio VNC de Guacamole

Pulsa el botón de Desbloqueo para pasar a la pantalla de inicio de tu servidor/escritorio.

Guacamole VNC Rocky Linux Desktop

Puedes empezar a trabajar en tu máquina.

Paso 8 – Crear una conexión VNC a un servidor remoto de Ubuntu/Debian

Si tu instalación de Guacamole y el entorno de escritorio están en el mismo servidor, puedes acceder al VNC de tu servidor siguiendo los pasos anteriores. Nuestra instalación de Rocky Linux estaba en el mismo servidor, pero nuestro entorno Ubuntu estaba en un servidor diferente. En este caso, utilizaremos el túnel SSH para crear una conexión VNC con el servidor, ya que es un método más seguro.

Abre tu URL de Guacamole e introduce tus credenciales para iniciar la sesión.

Visita la pestaña Conexiones en Configuración de Guacamole. Haz clic en el botón Nueva conexión.

Guacamole Nueva Conexión

Elige un nombre para tu conexión y selecciona VNC en el menú desplegable.

Guacamole Ubuntu Tipo de conexión VNC

En la sección Parámetros, introduce la dirección localhost como nombre de host y 5001 como puerto. Deja la sección Autenticación en blanco, ya que la utilizaremos en el siguiente paso. También hablaremos de por qué usamos localhost como host en un momento.

Parámetros VNC de Guacamole para el túnel SSH

Si quieres activar alguna configuración adicional, hazlo. Haz clic en Guardar para terminar de añadir la conexión.

Crear un túnel SSH

Ejecuta el siguiente comando desde el terminal del servidor que aloja a Guacamole.

$ ssh -L 5001:localhost:5901 [email protected]

Repasemos lo que ocurre aquí. El comando anterior reenvía la conexión SSH de tu sistema al servidor remoto utilizando el reenvío de puertos local.

  • La bandera -L especifica el reenvío de puerto local.
  • El puerto 5001 es el puerto de tu máquina Guacamole por el que podemos acceder al servidor remoto. Puedes elegir un puerto diferente si lo deseas.
  • localhost:5901 es el servidor VNC remoto y el número de pantalla (y su correspondiente número de puerto) al que debemos conectarnos. Como estamos haciendo un reenvío de puertos local, la dirección del servidor remoto se traduce a localhost para nosotros.
  • [email protected] en nuestro caso son el usuario SSH y la dirección IP del servidor remoto de Ubuntu / Debian al que estamos accediendo.

El túnel SSH permanecerá abierto mientras se ejecute el comando. Escribe exit en el terminal para salir del túnel y cerrar la conexión VNC.

Accede a tu máquina mediante VNC

Visita el panel de control de Guacamole y haz clic en tu conexión VNC en la sección Todas las conexiones.

Lista de conexiones VNC de Guacamole

Aparecerá un aviso de contraseña que te pedirá la contraseña de VNC que hayas establecido con el comando vncpasswd. Introduce la contraseña y pulsa Continuar para continuar.

Guacamole VNC Access Password Prompt

Una vez confirmada con éxito, se te llevará a la pantalla del escritorio de tu sistema.

Guacamole VNC Pantalla de escritorio de Ubuntu

Puedes empezar a trabajar en tu máquina.

Conclusión

Con esto concluye nuestro tutorial sobre el uso de Apache Guacamole para crear una conexión VNC con un servidor Linux. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...