VNC (Virtual Network Computing) permite ver y controlar un escritorio gráfico remoto desde cualquier sistema operativo con un visor VNC. En este tutorial instalarás TigerVNC y el entorno de escritorio XFCE en un servidor Ubuntu 24.04, configurarás la sesión como servicio de systemd y te conectarás a ella a través de un túnel SSH, sin exponer el puerto VNC a Internet.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM (el escritorio consume memoria aunque nadie esté conectado).
  • Un usuario no root con privilegios sudo. En esta guía se llama your_user; sustitúyelo por el tuyo.
  • Acceso SSH al servidor y el puerto 22 permitido en el firewall.
  • Un visor VNC en tu equipo local: TigerVNC Viewer (Windows, macOS y Linux), Remmina (Linux) o el cliente VNC integrado de macOS.

Paso 1: Instalar el entorno de escritorio XFCE

Un servidor Ubuntu no trae interfaz gráfica. XFCE es ligero y funciona bien sobre VNC, a diferencia de GNOME, que depende de aceleración gráfica. Instala el escritorio y dbus-x11, que las aplicaciones de XFCE necesitan para arrancar dentro de la sesión VNC:

sudo apt update
sudo apt install xfce4 xfce4-goodies dbus-x11

Si durante la instalación aparece la pregunta sobre el gestor de pantalla (gdm3 o lightdm), elige lightdm. No lo vas a usar para VNC, pero es el más ligero.

Comprueba que el lanzador de XFCE está disponible:

which startxfce4
/usr/bin/startxfce4

Paso 2: Instalar TigerVNC

TigerVNC está en los repositorios oficiales de Ubuntu. El paquete tigervnc-standalone-server contiene el servidor Xvnc y el script vncserver, y tigervnc-tools incluye vncpasswd:

sudo apt install tigervnc-standalone-server tigervnc-tools

Verifica que el paquete está instalado:

dpkg -l tigervnc-standalone-server | tail -n 1
ii  tigervnc-standalone-server 1.13.1+dfsg-2build2 amd64        Standalone virtual network computing server

Paso 3: Establecer la contraseña VNC

Los pasos siguientes se ejecutan como el usuario que va a usar el escritorio, no como root. Define la contraseña que pedirá el visor al conectar:

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

La contraseña se guarda cifrada en ~/.vnc/passwd.

Paso 4: Configurar el arranque del escritorio

Cuando arranca una sesión, vncserver ejecuta el script ~/.vnc/xstartup. Créalo para que lance XFCE:

nano ~/.vnc/xstartup
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4

Las dos líneas unset evitan que XFCE intente reutilizar el bus D-Bus de tu sesión SSH, lo que provoca una pantalla gris o que el escritorio se cierre al instante. Haz el script ejecutable:

chmod +x ~/.vnc/xstartup

Paso 5: Probar la sesión manualmente

Antes de crear el servicio, arranca una sesión en el display :1. Cada display N escucha en el puerto 5900 + N, así que :1 usa el puerto 5901. La opción -localhost yes hace que solo acepte conexiones desde el propio servidor, y -geometry fija la resolución del escritorio:

vncserver :1 -localhost yes -geometry 1920x1080 -depth 24

Comprueba que la sesión está activa y que solo escucha en 127.0.0.1:

vncserver -list
ss -tln | grep 5901
TigerVNC server sessions:

X DISPLAY #	RFB PORT #	RFB UNIX PATH	PROCESS ID #	SERVER
:1		5901				12345		Xtigervnc

LISTEN 0      5          127.0.0.1:5901      0.0.0.0:*

Si en lugar de 127.0.0.1:5901 ves 0.0.0.0:5901, comprueba que has pasado -localhost yes. Detén la sesión de prueba, porque a partir de ahora la gestionará systemd:

vncserver -kill :1

Paso 6: Crear un servicio de systemd

Un servicio de systemd arranca la sesión VNC al iniciar el servidor y la reinicia si falla. Crea una unidad con plantilla, donde el número tras @ es el display:

sudo nano /etc/systemd/system/[email protected]
[Unit]
Description=TigerVNC server en el display %i
After=network.target

[Service]
Type=forking
User=your_user
Group=your_user
WorkingDirectory=/home/your_user
ExecStartPre=-/usr/bin/vncserver -kill :%i
ExecStart=/usr/bin/vncserver :%i -localhost yes -geometry 1920x1080 -depth 24
ExecStop=/usr/bin/vncserver -kill :%i
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Sustituye your_user en las tres líneas por tu usuario. La opción -kill de ExecStartPre lleva el prefijo - para que un fallo (no había sesión previa) no impida el arranque. Recarga systemd y activa el servicio para el display 1:

sudo systemctl daemon-reload
sudo systemctl enable --now [email protected]

Comprueba el estado:

sudo systemctl status [email protected]
● [email protected] - TigerVNC server en el display 1
     Loaded: loaded (/etc/systemd/system/[email protected]; enabled; preset: enabled)
     Active: active (running) since ...

Paso 7: Conectarse a través de un túnel SSH

VNC no cifra el tráfico por sí mismo, así que no abras el puerto 5901 en el firewall. En su lugar, crea un túnel SSH desde tu equipo local que redirija el puerto 5901 local al 5901 del servidor. Sustituye your_server_ip por la IP de tu servidor:

ssh -L 5901:localhost:5901 -N your_user@your_server_ip

El comando se queda en primer plano sin mostrar nada: el túnel está abierto mientras siga en ejecución. En Windows puedes usar el mismo comando en PowerShell, que incluye OpenSSH.

Con el túnel abierto, abre tu visor VNC y conéctate a localhost:5901. En macOS también puedes abrir Finder y usar Ir > Conectarse al servidor con la dirección vnc://localhost:5901. Introduce la contraseña del paso 3 y verás el escritorio XFCE.

Asegúrate de que en el firewall solo está permitido SSH:

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Varios usuarios

Cada usuario necesita su propio display, su contraseña (vncpasswd) y su ~/.vnc/xstartup. Como la unidad anterior fija User=your_user, copia el archivo con otro nombre para cada usuario adicional, por ejemplo /etc/systemd/system/[email protected] con User=ana, y actívalo en un display libre:

sudo systemctl daemon-reload
sudo systemctl enable --now [email protected]

Ese usuario se conectará con un túnel al puerto 5902.

Solución de problemas

Pantalla gris o negra al conectar. Casi siempre es el script de arranque. Comprueba que ~/.vnc/xstartup es ejecutable, que contiene las líneas unset y que dbus-x11 está instalado. Revisa el log de la sesión:

cat ~/.vnc/*:1.log

El servicio no arranca. Consulta el journal. Un error habitual es que el display ya esté en uso por una sesión iniciada a mano:

sudo journalctl -u [email protected] -n 50
vncserver -list

"Connection refused" en el visor. Verifica que el túnel SSH sigue abierto y que la sesión escucha en el puerto 5901 del servidor con ss -tln | grep 5901.

La sesión va lenta. Reduce la resolución en la línea ExecStart de la unidad (por ejemplo -geometry 1280x720), ejecuta sudo systemctl daemon-reload y reinicia el servicio con sudo systemctl restart [email protected]. En el visor, elige compresión Tight con calidad JPEG media.

Conclusión

Ya tienes un escritorio XFCE accesible por VNC en Ubuntu 24.04, gestionado por systemd y protegido por un túnel SSH en lugar de un puerto expuesto. Como siguientes pasos, puedes configurar el acceso SSH solo con claves y desactivar la autenticación por contraseña, restringir SSH a una VPN privada como Tailscale o WireGuard, o evaluar Apache Guacamole si necesitas dar acceso gráfico desde el navegador a varios usuarios.