# VNC

**Cicle formatiu:** CFGM Sistemes Microinformàtics i Xarxes (SMX) / CFGS Administració de sistemes informàtics en xarxa (ASIX)

**Sistema operatiu:** Ubuntu Server 26.04 LTS

---

# 1. Introducció

**VNC** (*Virtual Network Computing*) és un protocol de codi obert que permet accedir de forma gràfica a l'escriptori d'un ordinador remot. A diferència de X11 Forwarding (que reenvia finestres individuals), VNC transmet un **framebuffer complet**: tot el que es veuria a la pantalla del servidor, incloent-hi la sessió d'escriptori, que a més **persisteix** encara que el client es desconnecti.

En un entorn de servidor sense escriptori gràfic instal·lat (headless), VNC és útil per:

- Administrar gràficament aplicacions que no tenen interfície de text (per exemple GLPI, eines de virtualització amb client gràfic, o programari que només ofereix GUI).
- Donar suport remot a usuaris o alumnes que necessiten veure un escriptori complet.
- Muntar entorns de laboratori accessibles des de qualsevol client (Windows, Linux, macOS, mòbil).

# 2. Conceptes previs

- **Servidor VNC**: procés que captura el framebuffer i n'envia les actualitzacions (per exemple `Xtigervnc`).
- **Client / visor VNC**: aplicació que es connecta al servidor i mostra la pantalla (TigerVNC Viewer, Remmina, RealVNC...).
- **Display**: cada sessió VNC s'executa en un número de display virtual (`:1`, `:2`...). El port TCP resultant és `5900 + número de display` (`:1` → `5901`, `:2` → `5902`).
- **Wayland vs. X11**: VNC és un protocol basat en X11. El GNOME per defecte d'Ubuntu 26.04 fa servir Wayland exclusivament, incompatible amb VNC. Per això cal:
  - fer servir un entorn d'escriptori lleuger basat en X11 (Xfce, MATE), o
  - desactivar Wayland si es vol compartir la sessió local de GNOME.

En una instal·lació **Ubuntu Server** (sense entorn gràfic), aquest conflicte no existeix perquè no hi ha ni Wayland ni Xwayland en marxa: TigerVNC crea el seu propi display X11 net.

# 3. Instal·lació

Es recomana **TigerVNC**, ja que és la implementació que substitueix TightVNC als dipòsits moderns, ofereix millor rendiment i suport de xifratge.

## 3.1. Actualitza el sistema i instal·la el servidor

Actualitza la llista de paquets

```bash
sudo apt update
```

Instal·la el servidor

```bash
sudo apt install tigervnc-standalone-server tigervnc-common
```

## 3.2. Instal·la un entorn d'escriptori

Un servidor VNC no proporciona per si mateix cap escriptori: cal instal·lar-ne un. Per a un ús remot lleuger es recomana **Xfce**:

```bash
sudo apt install xfce4 xfce4-goodies
```

Alternatives:

```bash
# MATE (pes mitjà)
sudo apt install ubuntu-mate-desktop

# GNOME complet (més pesat, no recomanat per VNC en servidor)
sudo apt install ubuntu-desktop
```

> [!IMPORTANT]
> Si el procés d'instal·lació demana triar gestor de sessions per defecte (`gdm3` o `lightdm`), en un servidor sense ús gràfic local qualsevol opció és vàlida; manteniu la que ja teniu configurada per evitar sorpreses en pròximes actualitzacions.

# 4. Configuració del servidor

## 4.1. Estableix la contrasenya VNC

Cal executar-ho amb l'usuari que utilitzarà la sessió (no cal ser root):

```bash
vncpasswd
```

Es demanarà una contrasenya (i opcionalment una de només lectura). Es desa xifrada a `~/.vnc/passwd`.

## 4.2. Crea l'script d'inici de sessió (`xstartup`)

Aquest fitxer determina quin escriptori es carrega cada vegada que s'inicia una sessió VNC nova:

```bash
mkdir -p ~/.vnc
nano ~/.vnc/xstartup
```

Contingut per a Xfce:

```bash
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
startxfce4 &
```

Donar-li permisos d'execució:

```bash
chmod +x ~/.vnc/xstartup
```

## 4.3. Arrenca el servidor manualment (prova)

```bash
vncserver :1 -geometry 1920x1080 -depth 24 -xstartup ~/.vnc/xstartup -localhost no
```

Paràmetres habituals:

| Opció | Descripció |
|---|------|
| `-geometry AMPLExALT` | Resolució de la sessió virtual (p. ex. `1920x1080`) |
| `-depth` | Profunditat de color en bits (16, 24...) |
| `-localhost yes/no` | Si `yes`, només accepta connexions des del mateix equip (necessari per túnel SSH) |
| `-xstartup` | Ruta a l'script d'inici de sessió |
| `-alwaysshared` | Permet diverses connexions simultànies a la mateixa sessió |
| `-SecurityTypes` | Tipus d'autenticació/xifratge acceptats (p. ex. `VncAuth,TLSVnc`) |

Per aturar la sessió de prova:

```bash
vncserver -kill :1
```

## 4.4. Converteix en un servei systemd

Crear una unitat plantilla que permeti gestionar qualsevol display amb `systemctl`:

```bash
sudo nano /etc/systemd/system/vncserver@.service
```

```nano
[Unit]
Description=TigerVNC server per al display %i
After=syslog.target network.target

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

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24 -localhost yes
ExecStop=/usr/bin/vncserver -kill %i

Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
```

> Substituïu `ramon` per l'usuari real que farà servir la sessió gràfica.

Activar-lo:

```bash
sudo systemctl daemon-reload
sudo systemctl enable --now vncserver@:1.service
sudo systemctl status vncserver@:1.service
```

Verificar que escolta al port esperat:

```bash
ss -tlnp | grep 5901
```

# 5. Seguretat: túnel SSH

El trànsit VNC **no va xifrat per defecte**. La pràctica recomanada és no exposar mai el port 5901 directament a internet, sinó vincular el servidor a `localhost` (`-localhost yes`) i accedir-hi mitjançant un túnel SSH.

Des del client:

```bash
ssh -L 5901:localhost:5901 -N ramon@192.168.2.10
```

Aquesta ordre reenvia el port local 5901 fins al port 5901 de `localhost` **dins** del servidor remot, xifrat pel canal SSH. Cal deixar el terminal obert (o executar-ho en segon pla amb `-f`) i, després, connectar el visor VNC a:

```ini
localhost:5901
```

## Altres mesures de seguretat

- **Tallafoc**: si en algun cas cal exposar el port directament (no recomanat), restringir per IP amb `ufw`:
  ```bash
  sudo ufw allow from 192.168.2.0/24 to any port 5901 proto tcp
  ```
- **`-SecurityTypes`**: forçar autenticació forta o TLS (`TLSVnc`, `X509Vnc`) en lloc del mètode `VncAuth` bàsic.
- **Sessió de només lectura**: `vncpasswd -f` genera una contrasenya independent per a accés en mode visualització.
- No reutilitzar la contrasenya del sistema operatiu com a contrasenya VNC (TigerVNC la trunca a 8 caràcters).

# 6. Connexió des del client

## Client TigerVNC (Linux/Windows/macOS)

```bash
sudo apt install tigervnc-viewer
vncviewer localhost:5901
```

## Remmina (recomanat en escriptoris Linux amb interfície gràfica)

```bash
sudo apt install remmina remmina-plugin-vnc
```

Crear una connexió nova de tipus VNC apuntant a `localhost:5901` (si s'usa túnel SSH) o directament a la IP del servidor i el port corresponent (si la xarxa és de confiança i no s'usa túnel).

# 7. Funcionalitats i variants

| Funcionalitat | Descripció |
|---|-----|
| **Sessió persistent** | La sessió Xfce segueix activa encara que es tanqui el client; en reconnectar es recupera l'estat |
| **Múltiples displays** | Es poden mantenir diverses sessions simultànies (`:1`, `:2`...) per a diferents usuaris o propòsits |
| **Compartició d'escriptori físic** | Amb `x11vnc` es pot compartir la sessió gràfica **real** d'un equip (no una sessió virtual nova) |
| **Porta-retalls compartit** | Amb `autocutsel` es pot sincronitzar el porta-retalls entre client i servidor |
| **Compressió i qualitat** | El protocol permet ajustar compressió JPEG i profunditat de color per optimitzar l'amplada de banda |
| **Multiplataforma** | El protocol és obert; existeixen clients per a pràcticament qualsevol sistema operatiu |

## `x11vnc`: compartir una sessió gràfica ja existent

A diferència de `vncserver`, que crea un display X11 **nou i virtual**, `x11vnc` comparteix la pantalla física/real d'un equip que ja té sessió gràfica activa (útil en equips d'escriptori, no tant en servidors headless):

```bash
sudo apt install x11vnc
x11vnc -display :0 -auth guess -forever -loop -rfbauth ~/.vnc/passwd -rfbport 5900 -shared
```

# 8. Resolució de problemes habituals

| Símptoma | Causa probable | Solució |
|---|---|---|
| Pantalla en blanc en connectar | `xstartup` sense permisos d'execució o buit | `chmod +x ~/.vnc/xstartup`; revisar el contingut |
| El servei no arrenca | Sessió `:1` ja bloquejada per un procés anterior | `vncserver -kill :1` i tornar a arrencar; revisar `~/.vnc/*.log` |
| No es pot connectar des del client | Port no obert / servidor vinculat a `localhost` sense túnel actiu | Comprovar `ss -tlnp \| grep 590x`; obrir túnel SSH o ajustar `-localhost` |
| Falla `chmod`/no troba `xstartup` | El fitxer no existeix o té un altre nom | `ls -la ~/.vnc/xstartup` |
| Components d'Xfce fan `crash` (només rellevant si hi ha entorn gràfic local) | Variables de Wayland filtrant-se a la sessió VNC | Assegurar-se que la instal·lació és *headless* o desactivar Wayland a `/etc/gdm3/custom.conf` |

Ordres útils de diagnòstic:

```bash
vncserver -list
sudo systemctl status vncserver@:1.service
sudo journalctl -u vncserver@:1.service -n 50
cat ~/.vnc/*.log
```

# 9. Resum d'ordres

```bash
# Instal·lació
sudo apt install tigervnc-standalone-server tigervnc-common xfce4 xfce4-goodies -y

# Contrasenya
vncpasswd

# xstartup
chmod +x ~/.vnc/xstartup

# Arrencar / aturar manualment
vncserver :1 -geometry 1920x1080 -depth 24 -localhost yes
vncserver -kill :1

# Servei
sudo systemctl enable --now vncserver@:1.service
sudo systemctl status vncserver@:1.service

# Túnel SSH des del client
ssh -L 5901:localhost:5901 -N usuari@192.168.2.10
```

#### Versions d'aquest document

+ HTML - [vnc.html](https://proferamon.com/tic/vnc.html)
+ PDF - [vnc.pdf](https://proferamon.com/tic/docs/vnc.pdf)
+ ODT - [vnc.odt](https://proferamon.com/tic/odt/vnc.odt)
+ MD - [vnc.md](https://proferamon.com/tic/md/vnc.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
