La pantalla negra en VNC con Ubuntu no era un problema de red. Era la configuración de xstartup.
Y el puerto 5901 ni siquiera hacía falta abrirlo.
Son los dos puntos donde la mayoría se atasca al configurar VNC en Ubuntu. El cliente se conecta, pero la pantalla sigue negra. Y no queda claro si hay que abrir el 5901 a Internet.
Necesitaba probar una interfaz gráfica en un servidor Ubuntu de AWS EC2, así que instalé TigerVNC yo mismo. Aquí cuento el proceso tal como fue.
¿Cuándo hace falta VNC en un servidor Ubuntu?
Para administrar un servidor basta con SSH. VNC solo hace falta cuando tienes que ver la pantalla real, como un flujo de autenticación en el navegador o el estado de una aplicación gráfica.
Normalmente administraba los servidores por SSH. No instalé VNC porque quisiera un escritorio remoto siempre disponible.
Hubo un periodo de desarrollo y pruebas en el que tenía que revisar un navegador y aplicaciones gráficas directamente en un Ubuntu en la nube.
Eran tareas en las que tenía que ver con mis propios ojos flujos de autenticación y redirección, o comprobar en qué estado de pantalla estaba de verdad una aplicación gráfica.
Por eso añadí TigerVNC y un entorno de escritorio ligero solo durante el periodo en que necesitaba la interfaz gráfica. Si el trabajo se resuelve por CLI, sigo sin instalar VNC.
Cómo instalé Xfce y TigerVNC
Para tener un escritorio remoto VNC en Ubuntu, instala un entorno de escritorio ligero (Xfce) y el servidor TigerVNC. Luego define la contraseña de conexión con vncpasswd.
En ese momento mi entorno principal era Ubuntu 22.04 LTS.
Muchas guías antiguas usan 20.04, pero su soporte estándar terminó el 31 de mayo de 2025. Si lo montas desde cero hoy, creo que lo correcto es partir de 22.04 o 24.04 LTS.
Instalar los paquetes (Xfce y TigerVNC)
Primero actualiza la lista de paquetes y después instala los paquetes.
sudo apt update sudo apt install -y xfce4 xfce4-goodies tigervnc-standalone-server
La instalación en sí no tarda mucho. El tiempo se va en el paso siguiente.
Definir la contraseña de conexión con vncpasswd
Cuando termine la instalación, crea la contraseña para las conexiones VNC con vncpasswd.
vncpasswd
Esta contraseña es distinta de la de tu cuenta de Linux. Es la que escribes en el cliente VNC al conectarte.
¿Por qué sale una pantalla negra en VNC con Ubuntu?
Si después de conectarte solo ves una pantalla negra, no empieces por la red. Revisa primero el permiso de ejecución de ~/.vnc/xstartup y el comando que inicia la sesión de escritorio.
Ese fue justo el primer problema que tuve.
El proceso de VNC estaba en marcha y el cliente se conectaba. Por eso, al principio no sospeché de la red.
Al revisarlo, vi que ~/.vnc/xstartup no lograba iniciar bien la sesión de escritorio. Corregí el permiso de ejecución y el comando de inicio de sesión, volví a levantar la sesión VNC y se resolvió.

Desde entonces cambié el orden en que diagnostico. Primero separo dos problemas: que la conexión no se establezca o que se conecte y solo muestre negro.
En el primer caso reviso la red, el firewall y el estado del servicio. En el segundo voy primero a xstartup.

La primera vez que pasé por todo esto tardé unos 40–50 minutos, contando las pruebas y errores.
Ese tiempo es el total desde instalar VNC hasta conectarme de verdad. En medio tuve que configurar el entorno de escritorio, escribir xstartup, resolver la pantalla negra, arreglar permisos y sesión, y montar el túnel SSH.
En el segundo entorno ya conocía la causa y terminé en menos de 20 minutos.
Corregir el permiso de xstartup y el comando de inicio de sesión
Dale permiso de ejecución a ~/.vnc/xstartup y comprueba que contenga un comando que inicie la sesión de escritorio.
chmod +x ~/.vnc/xstartup
Dentro de xstartup, el comando que inicia la sesión de Xfce tiene que estar escrito para ejecutarse sin problemas.
Si ese archivo está mal, el servidor VNC puede funcionar bien y aun así la pantalla sale negra.
¿Hay que abrir el puerto 5901? Mejor un túnel SSH
No hace falta exponer el puerto de VNC (5901) a Internet. Si conectas un puerto local con el servidor mediante un túnel SSH, no tienes que añadir una regla para VNC en el grupo de seguridad.
El protocolo RFB que usa VNC no cifra el tráfico por sí mismo. Los datos de pantalla y la autenticación viajan tal cual.
Por eso conviene envolverlo en un túnel SSH en lugar de abrir el puerto a Internet.
Una vez pensé que tenía que abrir el puerto 5901 y quise empezar por modificar el grupo de seguridad de AWS.
Al final no lo hice. Usé un túnel SSH en lugar de exponer el puerto de VNC a Internet.
La conexión fue, a grandes rasgos, localhost:5901 en mi máquina → SSH → localhost:5901 en el servidor. En el grupo de seguridad no abrí el 5901 de VNC a todo Internet.

Que VNC no funcionara no era motivo para abrir el 5901 a Internet.
Lo que necesitaba no era publicar un puerto. Necesitaba una sesión de escritorio que funcionara y un túnel SSH.
¿Cómo ejecutar el servidor VNC como servicio de systemd?
Si registras el servidor VNC como servicio de systemd, no tienes que volver a ejecutar vncserver a mano después de reiniciar el servidor.
Crea un archivo de unidad con la forma [email protected] y actívalo con systemctl.
Así, aunque el servidor se reinicie, la sesión VNC vuelve a levantarse sola. Ya no hace falta entrar por SSH y escribir vncserver cada vez.
sudo systemctl enable [email protected] sudo systemctl start [email protected] sudo systemctl status [email protected]
Con el comando de estado ves al momento si la sesión arrancó bien.

¿Volvería a usar VNC? Alternativas y cómo elijo
Para el código uso SSH o un entorno remoto, y para revisar una interfaz web, un navegador headless. Creo que VNC solo tiene sentido cuando necesitas la interfaz gráfica completa de Linux.
Elijo según el objetivo.
| Objetivo | Herramienta |
|---|---|
| Administrar el servidor, editar código | SSH, VS Code Remote SSH, devcontainer, code-server |
| Revisar una interfaz web, automatizar el navegador | navegador headless |
| Revisar la sesión de escritorio de Linux | VNC |
En resumen: el código va por SSH y el resultado en pantalla, por un navegador headless. VNC solo cuando necesito la sesión de escritorio en sí.
También he usado X11 forwarding. Al trabajar con varias ventanas gráficas durante mucho tiempo, hubo casos en que VNC, que mantiene una sesión de escritorio completa, me resultó más cómodo.
Así que no defiendo que “un servidor Ubuntu necesita interfaz gráfica”. Más bien, si el trabajo se resuelve por CLI, prefiero no instalar VNC.
Hoy no tengo VNC encendido todo el tiempo en esa instancia EC2. Pasé a crear el entorno gráfico solo cuando lo necesito.
¿Hay motivo para mantener siempre activos el demonio de VNC y el escritorio en un servidor expuesto a Internet? Si no lo hay, creo que solo suman superficie de ataque y piezas que operar.
Preguntas frecuentes
VNC se conecta, pero la pantalla sale negra. ¿Por qué?
En la mayoría de los casos es la configuración de ~/.vnc/xstartup, no la red. Empieza por revisar el permiso de ejecución (chmod +x) y que el comando de inicio de sesión esté en el archivo.
¿Tengo que abrir el puerto 5901 en el grupo de seguridad?
No. Basta con conectar un puerto local al servidor mediante un túnel SSH. No hace falta exponer el 5901 directamente a Internet.
¿Hay otras formas de acceso remoto además de VNC?
Depende del objetivo. Para código, SSH o un entorno de desarrollo remoto es más simple. Para revisar una interfaz web, un navegador headless.
Considera VNC solo cuando necesites ver toda la interfaz gráfica de Linux.
Referencias
- RFC 6143: The Remote Framebuffer Protocol: fuente primaria de que VNC (RFB) no cifra la sesión
- Canonical: fin del soporte estándar de Ubuntu 20.04 LTS (en inglés): fuente primaria de la fecha de fin de soporte estándar de 20.04 (31 de mayo de 2025)
Este artículo fue localizado a partir del original en coreano: https://jjeongil.tistory.com/2090.