SSD Nodes Learn 🎉 VPS da $5.50/mese
Guide Matt ConnorDi Matt Connor

Desktop remoto su VPS Linux con xrdp e XFCE

Avvia un desktop grafico reale sul VPS con xrdp e XFCE, usa un tunnel SSH senza aprire la porta 3389 e scopri quando scegliere RustDesk.

Che cosa significa realmente desktop remoto su un VPS Linux

La ricerca «desktop remoto su un VPS Linux» può riferirsi a due prodotti diversi. Scegliere quello sbagliato può costare un pomeriggio. Il primo è un broker per l'accesso remoto. Il server self-hosted di RustDesk è l'esempio più comune: inoltra una sessione tra due macchine che già possiedi, ad esempio il laptop e il PC di casa. Il server noleggiato non esegue alcun desktop. Fa comunicare i due estremi e inoltra i pacchetti quando non possono raggiungersi direttamente. Il secondo è un vero desktop grafico in esecuzione sul server noleggiato. In questo caso i pixel vengono elaborati nel data center e trasmessi al tuo dispositivo. Le tecnologie utilizzate possono essere xrdp, VNC (virtual network computing) o un workspace in un container.

Una domanda permette di distinguerli. Dopo aver configurato il sistema, dove si trova il puntatore del mouse? Se si trova su una macchina che già possiedi, ti serve un broker. Se si trova sul VPS, ti serve un desktop sul VPS. Il resto di questa guida tratta soprattutto il secondo caso, perché è quello che la maggior parte delle guide trascura.

Quale opzione è adatta al tuo caso

  • RustDesk con un relay gestito da te. Protegge la sessione dal passaggio attraverso un server pubblico di rendezvous gestito da terzi, perché possiedi la coppia di chiavi. Non protegge la macchina controllata, che resta il PC su cui hai installato il client, con la password configurata su quel PC.
  • xrdp tramite un tunnel SSH o una VPN. Ti protegge dalla scansione continua di Internet sulla porta TCP 3389 e dai tentativi di indovinare la password nella schermata di accesso RDP, perché quella porta non è mai esposta a Internet. Non protegge una password debole dell'account da chiunque abbia già accesso al tunnel.
  • VNC tramite lo stesso tunnel. Fornisce una sessione desktop che sopravvive alla disconnessione, usando un protocollo più datato e semplice di RDP. Da solo non protegge nulla: tutta la sicurezza dipende dal tunnel, quindi VNC da solo su una porta pubblica è l'opzione peggiore in questo caso.
  • Un workspace in un container, come Webtop o Kasm. Fornisce un browser o un desktop completo in un container che puoi eliminare e ricreare, proteggendo la macchina reale da qualunque elemento venga aperto dal browser. Non protegge l'host: queste immagini vengono eseguite con privilegi estesi e con un sudo senza password all'interno, quindi il container non è un confine di sicurezza a cui affidare un carico di lavoro ostile.

Installare xrdp e XFCE su Ubuntu 24.04

L'immagine di un server VPS non include un desktop grafico. È necessario installarne uno, quindi installare xrdp, il server open source che usa RDP (remote desktop protocol), lo stesso protocollo utilizzato dal client Windows. Scegliete un desktop leggero: XFCE è la scelta abituale.

sudo apt update
sudo apt install -y xrdp xorgxrdp xfce4 xfce4-goodies dbus-x11
systemctl is-active xrdp

Ad agosto 2026, Ubuntu 24.04 include xrdp 0.9.24 e xorgxrdp nel componente universe. Installate xorgxrdp indicandolo per nome, anche se è soltanto un pacchetto raccomandato: è il backend del server X che xrdp avvia per una nuova sessione. Senza questo pacchetto, la finestra di accesso accetta la password e poi torna direttamente alla finestra di accesso.

Indicate ora alla sessione quale desktop avviare. xrdp esegue /etc/xrdp/startwm.sh, che a sua volta esegue ~/.xsession quando quel file esiste.

echo "xfce4-session" > ~/.xsession
chmod 644 ~/.xsession

Infine, xrdp deve poter leggere la chiave TLS (transport layer security) che presenta ai client. Il file ha modalità 640 ed è di proprietà del gruppo ssl-cert.

ls -l /etc/ssl/private/ssl-cert-snakeoil.key
id xrdp

L'elenco mostra -rw-r----- 1 root ssl-cert. Se id xrdp non stampa ssl-cert tra i gruppi, eseguite sudo adduser xrdp ssl-cert e poi sudo systemctl restart xrdp. Se saltate questo passaggio, xrdp non può aprire la chiave e /var/log/xrdp.log registra l'errore con il nome del file snakeoil nella riga.

Perché non dovresti aprire la porta 3389 su Internet

La porta TCP 3389 viene sottoposta continuamente a scansione da parte di sistemi presenti su Internet e una schermata di accesso RDP risponde a ogni tentativo di autenticazione. Non aprirla. Configura xrdp affinché sia in ascolto sull'indirizzo di loopback e raggiungilo tramite un tunnel già considerato attendibile.

Modifica /etc/xrdp/xrdp.ini e cambia il listener nella sezione [Globals].

[Globals]
port=tcp://.:3389

Il file fornito documenta questa sintassi nei propri commenti: tcp://.:3389 significa 127.0.0.1:3389, mentre tcp://:3389 significa tutte le interfacce. Riavvia il servizio e verifica il risultato, perché un errore di battitura può lasciare silenziosamente il servizio in ascolto su tutti gli indirizzi.

sudo systemctl restart xrdp
ss -tlnp | grep 3389

Devi ottenere 127.0.0.1:3389. Se visualizzi 0.0.0.0:3389, xrdp ha ignorato la modifica, in genere perché la riga è finita sotto un'altra intestazione di sezione più avanti nel file.

Ora apri il tunnel dal tuo computer.

ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com

-N significa «apri la connessione ma non eseguire alcun comando», quindi la sessione serve soltanto a trasportare la porta. Lascia aperto quel terminale e configura il client RDP per connettersi a 127.0.0.1:3389. Su un client Linux il software è FreeRDP 3 e il relativo binario su Ubuntu 24.04 si chiama xfreerdp3:

sudo apt install -y freerdp3-x11
xfreerdp3 /v:127.0.0.1:3389 /u:you /dynamic-resolution +clipboard /sound

Su Windows usa mstsc, già incluso nel sistema, e inserisci 127.0.0.1 come computer. Al primo collegamento FreeRDP chiede di considerare attendibile il certificato e visualizza Do you trust the above certificate? (Y/T/N). È il comportamento previsto con il certificato self-signed snakeoil.

Se ssh risponde bind [127.0.0.1]:3389: Address already in use, qualcosa sul tuo computer sta già utilizzando la porta 3389. Sposta l'estremità locale usando ssh -N -L 13389:127.0.0.1:3389 you@vps.example.com e connettiti a 127.0.0.1:13389.

Un tunnel per ogni persona diventa presto scomodo. Per un team, la soluzione migliore è una rete privata. Inserisci il server dietro una VPN WireGuard self-hosted, assegnagli l'indirizzo del tunnel 10.8.0.1 e imposta port=tcp://10.8.0.1:3389 in modo che xrdp risponda soltanto all'interno della VPN. In entrambi i casi, la regola firewall per la porta 3389 non dovrebbe esistere. Se non sai con certezza quali connessioni consentono le regole attuali, parti da le basi del firewall ufw su un VPS e verifica prima di connetterti, non dopo.

Quanta RAM utilizza un desktop remoto su un VPS da 2 GB

Il desktop scelto determina se un piano da 2 GB è sufficiente o inutilizzabile. I valori seguenti sono stime tipiche arrotondate della memoria utilizzata subito dopo l’accesso a Ubuntu 24.04. Sono ricavati da confronti pubblicati e non da misurazioni eseguite sul tuo sistema. Misura il consumo effettivo con free -m subito dopo la connessione.

ChartTypical memory in use after login, Ubuntu 24.04 (published figures)
The data behind this chart
[
  {
    "label": "LXQt",
    "idle_ram_mb": 300
  },
  {
    "label": "XFCE",
    "idle_ram_mb": 400
  },
  {
    "label": "MATE",
    "idle_ram_mb": 500
  },
  {
    "label": "KDE Plasma",
    "idle_ram_mb": 800
  },
  {
    "label": "GNOME",
    "idle_ram_mb": "1,200"
  }
]

Il punto è la differenza tra questi 5 desktop. LXQt utilizza circa 300 MB e XFCE circa 400 MB, quindi entrambi lasciano spazio per un browser su un sistema da 2 GB. GNOME richiede circa 1,200 MB prima ancora di aprire una finestra. Su un sistema da 2 GB, il browser deve quindi contendersi la memoria rimanente con il desktop.

Il costo principale è il browser, non la shell del desktop. Un browser moderno utilizza tra 150 e 400 MB per scheda attiva. Un VPS da 2 GB con XFCE gestisce quindi alcune schede, poi inizia a usare lo swap. Aggiungi lo swap per fare in modo che il sistema rallenti invece di terminare i processi: sudo fallocate -l 2G /swapfile, quindi sudo chmod 600 /swapfile, sudo mkswap /swapfile, sudo swapon /swapfile e una riga corrispondente in /etc/fstab, così lo swap resta disponibile dopo un riavvio. Se qualcosa scompare senza preavviso, esegui dmesg | grep -i "killed process". Questa riga indica che l’out-of-memory killer del kernel ha terminato il processo. Di solito la vittima è il browser.

Anche la CPU è un limite, ed è più facile sottovalutarlo. Un VPS non dispone di una GPU, quindi X utilizza il rendering software tramite llvmpipe. La CPU deve quindi elaborare ogni pixel. Lo scorrimento di una pagina complessa e la riproduzione di video si manifestano come normale carico della CPU. Il frame rate diminuisce, invece di bloccare il sistema. È lo stesso limite che incontri se ti chiedi se puoi giocare su un VPS: per qualsiasi attività 3D la risposta è no, proprio per questo motivo.

Audio e clipboard in una sessione xrdp

Ubuntu 24.04 usa PipeWire per l'audio, mentre il reindirizzamento audio di xrdp è stato scritto per PulseAudio. Per questo, una nuova installazione offre il video ma non l'audio. Ubuntu include il bridge.

sudo apt install -y pipewire-module-xrdp pulseaudio-utils alsa-utils

Disconnettiti completamente dalla sessione RDP e accedi di nuovo, perché il modulo viene caricato all'avvio della sessione. Riconnettersi non è sufficiente. Verifica quindi dall'interno della sessione:

pactl list short sinks
speaker-test -c 2 -t wav -l 1

Dovresti vedere un sink il cui nome contiene xrdp e sentire il tono di test tramite il client. Se non compare alcun sink xrdp, il modulo non è stato caricato in questa sessione. Anche il client deve richiedere l'audio: questa è l'opzione /sound di xfreerdp3 oppure l'impostazione "Audio remoto" nella sezione Risorse locali del client Windows.

Il clipboard di testo funziona in entrambe le direzioni quando xrdp-chansrv è in esecuzione per la sessione; xrdp lo avvia automaticamente. Verifica con pgrep -a xrdp-chansrv. Se la copia e l'incolla smettono di funzionare durante una sessione, il processo è terminato e una nuova connessione lo riavvia. La copia dei file, anziché del testo, usa un canale separato chiamato reindirizzamento delle unità: /drive:home,/home/you su xfreerdp3 monta una cartella locale nella sessione remota.

Il popup di polkit e altri problemi al primo accesso

La sorpresa più comune al primo accesso è una finestra di dialogo con il messaggio Authentication is required to create a color managed device. La causa è specifica. Il servizio colord chiede a polkit l'autorizzazione, polkit concede automaticamente questa azione soltanto a una sessione che considera locale e una sessione RDP non è considerata locale. Di conseguenza, polkit chiede la password. Ubuntu 24.04 include polkit 124, che ha rimosso i vecchi file di autorità locali .pkla. Pertanto, tutte le guide che indicano di creare /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla non hanno alcun effetto su 24.04. È invece necessario creare una regola JavaScript.

/* /etc/polkit-1/rules.d/45-allow-colord.rules */
polkit.addRule(function(action, subject) {
    if (action.id.indexOf("org.freedesktop.color-manager.") === 0 &&
        subject.isInGroup("sudo")) {
        return polkit.Result.YES;
    }
});

Esegui sudo systemctl restart polkit e riconnettiti. È utile conoscere altri due problemi in base al relativo sintomo.

La schermata di accesso accetta la password e torna subito alla schermata iniziale. La sessione è stata avviata, ma si è chiusa subito. Leggi prima /var/log/xrdp-sesman.log, quindi ~/.xsession-errors nella tua home directory. Un xorgxrdp mancante, un ~/.xsession che indica un desktop non installato, una home directory su cui non puoi scrivere o un disco pieno causano tutti questo comportamento.

Ti connetti e visualizzi una schermata grigia con un cursore a forma di X. X è stato avviato, ma il desktop non è partito. Anche in questo caso si tratta di ~/.xsession: esegui manualmente xfce4-session tramite SSH e leggi l'errore visualizzato.

Cosa fa il server RustDesk self-hosted

RustDesk è suddiviso in due processi. hbbs è il server ID e rendezvous a cui si registrano i client, mentre hbbr è il relay che trasporta la sessione quando una connessione peer-to-peer diretta non riesce. Nessuno dei due esegue un desktop. Entrambi provengono dalla stessa immagine. Questo è il file Compose pubblicato dal progetto, con l'indirizzo del relay modificato per usare il nome host del server:

services:
  hbbs:
    container_name: hbbs
    image: rustdesk/rustdesk-server:latest
    command: hbbs -r rustdesk.example.com:21117
    ports:
      - 21115:21115
      - 21116:21116
      - 21116:21116/udp
      - 21118:21118
    volumes:
      - ./data:/root
    restart: unless-stopped
  hbbr:
    container_name: hbbr
    image: rustdesk/rustdesk-server:latest
    command: hbbr
    ports:
      - 21117:21117
      - 21119:21119
    volumes:
      - ./data:/root
    restart: unless-stopped

Avvia i container, quindi leggi la chiave pubblica generata dal server al primo avvio:

sudo docker compose up -d
sudo cat ./data/id_ed25519.pub

Ogni client richiede il nome host del server e la relativa chiave pubblica. Inserisci entrambi nelle impostazioni Network del client RustDesk. La chiave privata corrispondente resta in ./data/id_ed25519. Se elimini la directory dei dati, il server genera una nuova coppia di chiavi. Di conseguenza, devi riconfigurare ogni client con la nuova chiave. Esegui il backup di questa directory.

Il firewall deve consentire direttamente queste porte. hbbs usa le porte TCP 21115, 21116 e 21118, oltre alla porta UDP 21116. hbbr usa le porte TCP 21117 e 21119.

sudo ufw allow 21115/tcp
sudo ufw allow 21116/tcp
sudo ufw allow 21116/udp
sudo ufw allow 21117/tcp
sudo ufw allow 21118/tcp
sudo ufw allow 21119/tcp

Perché RustDesk non può essere pubblicato dietro nginx o Traefik

Gli utenti che terminano già TLS per tutti i servizi su un unico reverse proxy provano questa configurazione, ma non funziona. hbbs e hbbr usano protocolli binari proprietari su TCP e UDP, non HTTP. Non esiste un header Host su cui basare il routing e non esiste una richiesta HTTP da analizzare. Di conseguenza, un blocco nginx server o un router HTTP di Traefik non ha alcun criterio di corrispondenza. Il listener UDP sulla porta 21116 non è un componente HTTP a nessun livello.

Sono possibili due configurazioni. nginx può inoltrare le porte TCP con un blocco stream. Si tratta di un semplice inoltro a livello 4, non di un reverse proxy nel senso consueto. Le porte 21118 e 21119 trasportano i websocket usati dal client web di RustDesk. Poiché usano HTTP standard, possono essere pubblicate dietro il proxy. In questo caso, aggiungi regole firewall per consentire l'accesso alle porte 21118 e 21119 soltanto al proxy. hbbs si basa infatti sull'header X-Real-IP nelle connessioni websocket per determinare l'indirizzo reale del client.

Un browser temporaneo in un container

A volte serve soltanto un browser pulito, con un IP che non cambia, isolato dalla propria macchina. Un ambiente di lavoro in un container offre questa possibilità installando molto meno software. Webtop di LinuxServer è l'opzione più leggera:

services:
  webtop:
    image: lscr.io/linuxserver/webtop:latest
    container_name: webtop
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - /path/to/data:/config
    ports:
      - 127.0.0.1:3000:3000
      - 127.0.0.1:3001:3001
    shm_size: "1gb"
    restart: unless-stopped

La porta 3000 serve HTTP e la porta 3001 serve HTTPS. Il desktop è accessibile in una scheda del browser, senza alcun client RDP. I tag delle immagini includono XFCE, KDE, MATE e i3, basati su diverse distribuzioni. La documentazione del progetto descrive chiaramente il rischio: il container dispone di accesso privilegiato all'host e include un terminale con sudo senza password. Per questo non deve essere esposto a Internet senza protezioni. Le porte indicate sopra sono quindi associate a 127.0.0.1 invece di essere pubblicate su tutti gli indirizzi. Accedere tramite lo stesso tunnel SSH o la stessa VPN usata per xrdp.

Kasm Workspaces applica lo stesso concetto su scala molto più ampia. Include una console web, account utente e container separati per ogni sessione, che vengono ripristinati al termine della sessione. Richiede più risorse di quante ne offra un VPS di piccole dimensioni. Ad agosto 2026 il requisito minimo documentato è di 2 core CPU, 4 GB di memoria e 50 GB di SSD. Inoltre, ogni sessione utente usa per impostazione predefinita 2 core e 2768 MB. Un piano da 2 GB non è sufficiente per eseguirlo. L'installazione consiste nel download e nell'esecuzione di uno script:

cd /tmp
curl -O https://kasm-static-content.s3.amazonaws.com/kasm_release_1.17.0.7f020d.tar.gz
tar -xf kasm_release_1.17.0.7f020d.tar.gz
sudo bash kasm_release/install.sh

VNC e i casi in cui è ancora adatto

VNC invia aggiornamenti del framebuffer invece di comandi di disegno. Su una connessione lenta risulta quindi più pesante di RDP e non dispone di un canale audio. È utile in un caso specifico: quando vuoi una sessione desktop che continui a essere eseguita dopo la disconnessione e vuoi ritrovare la stessa sessione al tuo ritorno. TigerVNC lo consente. vncserver -localhost yes :1 associa Xvnc a 127.0.0.1 sulla porta TCP 5901 e rifiuta le connessioni provenienti da qualsiasi altra origine. Puoi quindi inoltrarlo tramite tunnel esattamente come xrdp, usando ssh -N -L 5901:127.0.0.1:5901 you@vps.example.com. Non pubblicare mai una porta VNC. La maggior parte dei server VNC protegge la password durante l'handshake, ma non protegge il traffico successivo. Su una porta pubblica, il contenuto della sessione è quindi leggibile in transito.

Un VPS è adatto come desktop?

Come computer principale quotidiano, no. I motivi sono diversi. Non c'è una GPU, quindi tutto il rendering viene eseguito dalla CPU. Ogni pressione di un tasto deve attendere un viaggio di andata e ritorno sulla rete, e una latenza di 40 ms che in SSH sembra trascurabile si nota in un editor di testo. Il video viene compresso due volte: prima dal sito e poi dall'encoder RDP. I file si trovano su un disco che non possiedi fisicamente, e un uso intensivo del desktop consuma una quota mensile di banda dimensionata per un web server.

Come macchina usa e getta, invece, è molto adatto. Le stesse caratteristiche spiegano il motivo. L'indirizzo IP è stabile e appartiene a un data center, esattamente ciò che serve quando un servizio deve rilevare sempre lo stesso indirizzo. La macchina può essere ricreata da un'immagine in pochi minuti, quindi una sessione che ha acquisito qualcosa di dannoso non comporta costi rilevanti. È isolata dall'hardware reale e continua a funzionare quando chiudi il laptop. La fatturazione oraria rende economico un desktop temporaneo.

Se non hai ancora stabilito a cosa serva il server, vale la pena leggere l'elenco pratico delle attività per cui un VPS è adatto prima di installarvi un desktop. Se volevi un desktop per eseguire una sola applicazione Windows, confronta prima questa esigenza con le differenze effettive tra Linux e Windows Server, perché la licenza modifica il costo della soluzione.

FAQ

Posso eseguire un desktop remoto su un VPS da 2 GB?

Sì, con un desktop leggero. Dopo l'accesso, XFCE o LXQt usa circa 300-400 MB, lasciando memoria sufficiente per un browser con alcune schede. GNOME o KDE Plasma su 2 GB lascia quasi nessuna memoria alle applicazioni. Aggiungete un file di swap da 2 GB, così la pressione sulla memoria rallenta il sistema invece di terminare i processi. Se qualcosa scompare senza messaggi, controllate dmesg | grep -i "killed process" per verificare l'intervento dell'oom killer del kernel.

Devo aprire la porta 3389 nel firewall del VPS?

No. La porta TCP 3389 è sottoposta continuamente a scansioni e un endpoint RDP esposto facilita i tentativi di indovinare la password. Impostate port=tcp://.:3389 in /etc/xrdp/xrdp.ini, così xrdp resta in ascolto solo su 127.0.0.1. Verificate l'impostazione con ss -tlnp | grep 3389 e raggiungetelo con ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com. Per più di una o due persone, associate xrdp a un indirizzo WireGuard invece che al loopback.

Perché xrdp chiede «Authentication is required to create a color managed device»?

Il servizio colord chiede l'autorizzazione a polkit, che concede quell'azione senza prompt solo a una sessione locale attiva. Una sessione RDP non è locale, quindi viene richiesto di inserire la password a ogni accesso. Su Ubuntu 24.04 la vecchia correzione .pkla non ha effetto, perché polkit 124 non utilizza più i file di autorizzazione locali. Create /etc/polkit-1/rules.d/45-allow-colord.rules con una regola JavaScript che restituisce polkit.Result.YES per gli ID delle azioni che iniziano con org.freedesktop.color-manager., quindi eseguite sudo systemctl restart polkit.

Posso mettere un server RustDesk self-hosted dietro nginx o Traefik?

Non il servizio principale. hbbs e hbbr usano protocolli binari propri invece di HTTP, quindi non è presente alcun header Host su cui effettuare il routing. Inoltre, UDP 21116 non può attraversare un proxy HTTP. Aprite nel firewall le porte TCP da 21115 a 21119 e la porta UDP 21116, quindi lasciate che i client si connettano direttamente. Le porte websocket 21118 e 21119, usate dal client web, usano HTTP e possono essere gestite da un proxy. In tal caso, configurate il firewall in modo che solo il proxy possa raggiungerle, perché hbbs considera attendibile X-Real-IP su quelle connessioni.

Perché nella mia sessione xrdp non c'è audio?

Ubuntu 24.04 usa PipeWire, mentre il reindirizzamento audio di xrdp è stato progettato per PulseAudio. L'audio quindi non è disponibile finché non installate il bridge. Eseguite sudo apt install -y pipewire-module-xrdp, quindi chiudete completamente la sessione e accedete di nuovo. Il modulo viene caricato all'avvio della sessione e una riconnessione non lo carica. Verificate con pactl list short sinks la presenza di un sink con xrdp nel nome. Assicuratevi inoltre che il client richieda l'audio: su xfreerdp3 è il flag /sound, mentre nel client Windows è l'opzione «Remote audio».

#remote-desktop#xrdp#rustdesk#vnc#self-hosting