Grafische desktop op Linux VPS installeren
Ontdek hoe u een grafische desktop op uw Linux VPS draait met xrdp en XFCE. Wij leggen uit hoe u veilig via SSH verbindt en wanneer RustDesk een betere keuze is voor uw beheer.
Wat remote desktop op een Linux VPS daadwerkelijk betekent
Twee verschillende producten beantwoorden aan de zoekopdracht "remote desktop op een Linux VPS", en het kiezen van de verkeerde optie kost u een middag werk. De eerste is een broker voor externe toegang. De self-hosted server van RustDesk is hier een veelvoorkomend voorbeeld van: deze fungeert als relay voor een sessie tussen twee machines die u al bezit, zoals uw laptop en de pc thuis. De gehuurde server tekent in dit geval helemaal geen desktop. Deze brengt de twee uiteinden met elkaar in contact en stuurt pakketten door wanneer ze elkaar niet rechtstreeks kunnen bereiken. De tweede optie is een echte grafische desktop die op de gehuurde server draait, waarbij de pixels in het datacenter worden gegenereerd en naar u worden gestreamd. Dit betreft xrdp, VNC (virtual network computing) of een container-workspace.
Eén vraag maakt het onderscheid. Zodra dit werkt, waar bevindt de muisaanwijzer zich dan? Op een machine die u al bezit, wilt u een broker. Op de VPS zelf, wilt u een desktop op de VPS. Het tweede scenario krijgt hieronder de meeste aandacht, omdat dit het scenario is dat de meeste handleidingen overslaan.
Welke optie past bij uw werkzaamheden
- RustDesk met een eigen relay. Dit voorkomt dat de sessie via een openbare rendezvous-server van derden verloopt, omdat u zelf het sleutelpaar beheert. Het biedt geen bescherming voor de machine die wordt bestuurd; dit blijft de pc waarop u de client heeft geïnstalleerd, met het bijbehorende wachtwoord van die pc.
- xrdp via een SSH-tunnel of VPN. Dit beschermt u tegen het constante scannen van TCP 3389 over het hele internet en tegen het raden van wachtwoorden op het RDP-inlogscherm, omdat deze poort nooit direct verbonden is met het internet. Het beschermt een zwak accountwachtwoord echter niet tegen iemand die al toegang heeft tot de tunnel.
- VNC via dezelfde tunnel. Dit biedt een desktopsessie die een verbreking van de verbinding overleeft, gebruikmakend van een protocol dat ouder en eenvoudiger is dan RDP. Op zichzelf biedt dit geen enkele bescherming: de tunnel verzorgt de volledige beveiliging. VNC op een openbare poort is daarom de minst veilige optie in deze lijst.
- Een container-werkruimte zoals Webtop of Kasm. Dit biedt een browser of een volledige desktop in een container die u kunt verwijderen en opnieuw kunt opbouwen. Dit beschermt uw fysieke machine tegen alles wat die browser bezoekt. Het biedt echter geen bescherming voor de host: deze images draaien met ruime privileges en een wachtwoordloze
sudobinnenin, waardoor de container geen grens is die u moet vertrouwen bij een vijandige werklast.
Installatie van xrdp en XFCE op Ubuntu 24.04
Een VPS-serverimage wordt geleverd zonder grafische desktopomgeving. U installeert er een en vervolgens xrdp, de open-source server die RDP (Remote Desktop Protocol) spreekt, hetzelfde protocol dat de Windows-client gebruikt. Kies een lichte desktop; XFCE is hiervoor de standaardkeuze.
sudo apt update
sudo apt install -y xrdp xorgxrdp xfce4 xfce4-goodies dbus-x11
systemctl is-active xrdpUbuntu 24.04 bevat xrdp 0.9.24 en xorgxrdp in de universe-component, per augustus 2026. Installeer xorgxrdp bij naam, ook al is het slechts een aanbevolen pakket: het is de X server-backend die xrdp start voor een nieuwe sessie. Zonder dit pakket accepteert het inlogscherm uw wachtwoord, waarna u direct wordt teruggeleid naar het inlogscherm.
Geef nu aan de sessie door welke desktop moet worden gestart. xrdp voert /etc/xrdp/startwm.sh uit, dat op zijn beurt ~/.xsession uitvoert wanneer dat bestand bestaat.
echo "xfce4-session" > ~/.xsession
chmod 644 ~/.xsessionTot slot moet xrdp de TLS (Transport Layer Security) sleutel kunnen lezen die het aan clients aanbiedt. Dat bestand heeft modus 640 en is eigendom van de groep ssl-cert.
ls -l /etc/ssl/private/ssl-cert-snakeoil.key
id xrdpDe lijst toont -rw-r----- 1 root ssl-cert. Als id xrdp niet ssl-cert tussen de groepen weergeeft, voer dan sudo adduser xrdp ssl-cert uit en vervolgens sudo systemctl restart xrdp. Slaat u dit over, dan kan xrdp de sleutel niet openen en noteert /var/log/xrdp.log de foutmelding met de snakeoil-bestandsnaam in de regel.
Waarom u poort 3389 niet moet openstellen voor het internet
TCP 3389 wordt continu gescand door alles op het internet, en een RDP-inlogscherm reageert beleefd op elke wachtwoordpoging. Stel deze poort niet open. Koppel xrdp in plaats daarvan aan het loopback-adres en bereik het via een tunnel die u al vertrouwt.
Bewerk /etc/xrdp/xrdp.ini en wijzig de listener in de sectie [Globals].
[Globals]
port=tcp://.:3389Het meegeleverde bestand documenteert die syntaxis in de eigen commentaren: tcp://.:3389 betekent 127.0.0.1:3389, en tcp://:3389 betekent elke interface. Herstart en controleer dit, want een typefout hier zorgt er stilletjes voor dat de service op alle adressen actief blijft.
sudo systemctl restart xrdp
ss -tlnp | grep 3389U wilt 127.0.0.1:3389. Als u 0.0.0.0:3389 ziet, betekent dit dat xrdp uw wijziging heeft genegeerd, meestal omdat de regel verderop in het bestand onder een andere sectiekop is beland.
Open nu de tunnel vanaf uw eigen machine.
ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com-N betekent "open de verbinding maar voer geen commando uit", zodat de sessie alleen bestaat om de poort te transporteren. Laat die terminal openstaan en wijs de RDP-client naar 127.0.0.1:3389. Op een Linux-client is de software FreeRDP 3, waarvan het binaire bestand op Ubuntu 24.04 xfreerdp3 heet:
sudo apt install -y freerdp3-x11
xfreerdp3 /v:127.0.0.1:3389 /u:you /dynamic-resolution +clipboard /soundGebruik op Windows de ingebouwde mstsc en typ 127.0.0.1 als de computer. FreeRDP vraagt u bij de eerste verbinding om het certificaat te vertrouwen en toont Do you trust the above certificate? (Y/T/N), wat verwacht wordt bij het zelfondertekende snakeoil-certificaat.
Als ssh bind [127.0.0.1]:3389: Address already in use antwoordt, houdt iets op uw eigen machine poort 3389 al bezet. Verplaats het lokale eindpunt met ssh -N -L 13389:127.0.0.1:3389 you@vps.example.com en verbind met 127.0.0.1:13389.
Eén tunnel per persoon wordt vermoeiend, dus voor een team is een privaat netwerk de betere oplossing. Plaats de server achter een zelfgehost WireGuard VPN, geef het het tunneladres 10.8.0.1, en stel port=tcp://10.8.0.1:3389 in zodat xrdp alleen binnen het VPN reageert. Hoe dan ook, de firewallregel voor 3389 zou in het geheel niet moeten bestaan. Als u niet zeker weet wat uw huidige regels toestaan, begin dan bij ufw firewall basics op een VPS en controleer dit voordat u verbinding maakt, niet erna.
Hoeveel RAM verbruikt een remote desktop op een 2 GB VPS
De desktopomgeving die u kiest, bepaalt of een 2 GB-abonnement comfortabel of ontoereikend is. De onderstaande cijfers zijn afgeronde, typische waarden voor het geheugengebruik direct na het inloggen op Ubuntu 24.04, gebaseerd op gepubliceerde vergelijkingen in plaats van metingen op uw eigen machine. Meet uw eigen verbruik met free -m direct nadat u verbinding heeft gemaakt.
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"
}
]Bij deze 5 desktops is de spreiding het belangrijkste punt. LXQt verbruikt ongeveer 300 MB en XFCE ongeveer 400 MB; beide laten op een 2 GB-machine voldoende ruimte over voor een browser. GNOME vereist ongeveer 1,200 MB voordat u ook maar één venster opent, waardoor de browser op een 2 GB-systeem moet vechten om het resterende geheugen.
De browser is de werkelijke kostenpost, niet de desktopomgeving. Een moderne browser verbruikt tussen de 150 en 400 MB per actief tabblad, dus een 2 GB VPS met XFCE kan een handvol tabbladen aan voordat het systeem begint te swappen. Voeg swap toe zodat de machine vertraagt in plaats van processen te beëindigen: sudo fallocate -l 2G /swapfile, gevolgd door sudo chmod 600 /swapfile, sudo mkswap /swapfile, sudo swapon /swapfile, en een bijbehorende regel in /etc/fstab zodat dit na een reboot behouden blijft. Wanneer een proces zonder waarschuwing verdwijnt, voer dan dmesg | grep -i "killed process" uit. Die regel betekent dat de kernel out-of-memory killer het proces heeft beëindigd, waarbij de browser meestal het slachtoffer is.
CPU is de andere beperkende factor, en deze wordt vaak onderschat. Een VPS heeft geen GPU, dus X valt terug op software-rendering via llvmpipe, wat betekent dat de CPU elke pixel tekent. Het scrollen door een zware pagina en het afspelen van video resulteren beide in een hoge CPU-belasting, waarbij de framerate daalt in plaats van dat de machine vastloopt. Dit is dezelfde grens waar u tegenaan loopt als u zich afvraagt of u kunt gamen op een VPS: voor alles wat 3D is, is het antwoord nee, en wel om precies deze reden.
Geluid en klembord in een xrdp-sessie
Ubuntu 24.04 gebruikt PipeWire voor audio, en de geluidsomleiding van xrdp is geschreven voor PulseAudio. Daarom werkt video na een schone installatie direct, maar blijft geluid uit. Ubuntu levert de benodigde bridge mee.
sudo apt install -y pipewire-module-xrdp pulseaudio-utils alsa-utilsMeld u volledig af bij de RDP-sessie en meld u opnieuw aan, omdat de module wordt geladen bij het starten van de sessie. Opnieuw verbinden is onvoldoende. Controleer daarna vanuit de sessie:
pactl list short sinks
speaker-test -c 2 -t wav -l 1U hoort een sink te zien waarvan de naam xrdp bevat, en u hoort de testtoon via uw client. Als er geen xrdp-sink is, is de module niet in deze sessie geladen. Uw client moet ook om audio vragen: dit is de /sound-vlag in xfreerdp3, of de instelling "Remote audio" onder Local Resources in de Windows-client.
Tekstklembord werkt in beide richtingen zodra xrdp-chansrv voor uw sessie draait; xrdp start dit automatisch voor u. Bevestig dit met pgrep -a xrdp-chansrv. Als kopiëren en plakken halverwege een sessie stopt met werken, is dat proces beëindigd en zal opnieuw verbinden het proces herstarten. Het kopiëren van bestanden in plaats van tekst is een apart kanaal genaamd drive redirection: /drive:home,/home/you in xfreerdp3 koppelt een lokale map aan de externe sessie.
De polkit-pop-up en andere problemen bij de eerste aanmelding
De meest voorkomende verrassing bij de eerste aanmelding is een dialoogvenster met de tekst Authentication is required to create a color managed device. De oorzaak is specifiek. De colord-service vraagt polkit om toestemming; polkit verleent die actie alleen stilzwijgend aan een sessie die als lokaal wordt beschouwd. Een RDP-sessie wordt niet als lokaal aangemerkt, waardoor polkit terugvalt op het vragen om een wachtwoord. Ubuntu 24.04 wordt geleverd met polkit 124, waarin de oude lokale autorisatiebestanden .pkla zijn verwijderd. Elke handleiding die adviseert om /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla te schrijven, heeft daarom geen enkel effect op 24.04. Schrijf in plaats daarvan een JavaScript-regel.
/* /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;
}
});Voer sudo systemctl restart polkit uit en maak opnieuw verbinding. Twee andere fouten zijn het vermelden waard vanwege hun symptomen.
Het aanmeldvenster accepteert uw wachtwoord, maar keert direct terug. De sessie is gestart en direct beëindigd. Lees eerst /var/log/xrdp-sesman.log en vervolgens ~/.xsession-errors in uw thuismap. Een ontbrekende xorgxrdp, een ~/.xsession die verwijst naar een desktopomgeving die niet is geïnstalleerd, een thuismap waar u niet naar kunt schrijven of een volle schijf zijn de gebruikelijke oorzaken.
U maakt verbinding en ziet een grijs scherm met een X-cursor. X is gestart, maar de desktopomgeving niet. Dit is opnieuw ~/.xsession: voer xfce4-session handmatig uit via SSH en lees de foutmelding die wordt weergegeven.
Wat de zelfgehoste RustDesk-server doet
RustDesk is opgesplitst in twee processen. hbbs is de ID- en rendezvous-server waar clients zich bij registreren, en hbbr is de relay die de sessie afhandelt wanneer een directe peer-to-peer-verbinding mislukt. Geen van beide draait een desktopomgeving. Beide zijn afkomstig uit één image; dit is het compose-bestand dat het project publiceert, waarbij het relay-adres is gewijzigd naar uw eigen hostnaam:
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-stoppedStart de container en lees vervolgens de publieke sleutel die de server bij de eerste start heeft gegenereerd:
sudo docker compose up -d
sudo cat ./data/id_ed25519.pubElke client heeft uw hostnaam en die publieke sleutel nodig; beide voert u in onder de netwerkinstellingen in de RustDesk-client. De bijbehorende privésleutel blijft in ./data/id_ed25519 staan. Als u de datamap verwijdert, genereert de server een nieuw paar, waardoor elke client opnieuw moet worden geconfigureerd met de nieuwe sleutel. Maak een back-up van die map.
De firewall moet deze poorten direct toestaan. hbbs gebruikt TCP 21115, 21116 en 21118, plus UDP 21116. hbbr gebruikt TCP 21117 en 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/tcpWaarom RustDesk niet achter Nginx of Traefik kan worden geplaatst
Lezers die voor alles TLS-termination uitvoeren op één reverse proxy, merken dat dit bij RustDesk niet werkt. hbbs en hbbr gebruiken hun eigen binaire protocollen over TCP en UDP, geen HTTP. Er is geen Host-header om op te routeren en geen HTTP-verzoek om te inspecteren, waardoor een Nginx server-blok of een Traefik HTTP-router geen match kan vinden. De UDP-listener op 21116 is op geen enkele laag een HTTP-proces.
Twee methoden werken wel. Nginx kan de TCP-poorten doorsturen met een stream-blok; dit is eenvoudige layer 4-forwarding in plaats van een reverse proxy in de gebruikelijke zin. Daarnaast bevatten poorten 21118 en 21119 de websockets die door de RustDesk-webclient worden gebruikt. Omdat dit standaard HTTP is, kunnen deze twee poorten wel achter uw proxy worden geplaatst. Als u dit doet, voeg dan firewallregels toe zodat alleen de proxy poorten 21118 en 21119 kan bereiken, omdat hbbs de X-Real-IP-header op websocket-verbindingen vertrouwt om het werkelijke clientadres te bepalen.
Een wegwerpbrowser in een container
Soms wilt u enkel een schone browser met een vast IP-adres, volledig gescheiden van uw eigen machine. Een container-werkplek biedt dit met aanzienlijk minder geïnstalleerde software. Webtop van LinuxServer is de lichtgewicht optie:
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-stoppedPoort 3000 bedient HTTP en 3001 bedient HTTPS; u opent de desktop in een browsertabblad zonder dat er een RDP-client nodig is. De image-tags ondersteunen XFCE, KDE, MATE en i3 op diverse basisdistributies. De documentatie van het project is helder over het risico: de container heeft bevoorrechte toegang tot de host en bevat een terminal met wachtwoordloze sudo, waardoor deze niet onbeschermd aan het internet mag worden blootgesteld. Daarom zijn de bovenstaande poorten gebonden aan 127.0.0.1 in plaats van gepubliceerd op alle adressen. Benader deze via dezelfde SSH-tunnel of VPN die u voor xrdp gebruikte.
Kasm Workspaces hanteert hetzelfde concept op veel grotere schaal, met een webconsole, gebruikersaccounts en containers per sessie die worden gereset zodra de sessie eindigt. Dit vereist meer rekenkracht dan een kleine VPS biedt. Sinds augustus 2026 is het gedocumenteerde minimum 2 CPU-cores, 4 GB geheugen en 50 GB SSD, waarbij elke gebruikerssessie standaard nog eens 2 cores en 2768 MB verbruikt. Een 2 GB-abonnement is hiervoor onvoldoende. De installatie bestaat uit een download en een 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.shVNC, en waar het nog steeds van pas komt
VNC verstuurt framebuffer-updates in plaats van tekencommando's. Hierdoor voelt het op een trage verbinding zwaarder aan dan RDP en ontbreekt ondersteuning voor geluid. Het is nuttig in één specifieke situatie: u wilt een desktopsessie die actief blijft nadat u de verbinding verbreekt, en u wilt dezelfde sessie hervatten wanneer u terugkeert. TigerVNC biedt deze functionaliteit. vncserver -localhost yes :1 bindt Xvnc aan 127.0.0.1 op TCP 5901 en weigert verbindingen van buitenaf. U tunnelt dit daarom op exact dezelfde wijze als xrdp met ssh -N -L 5901:127.0.0.1:5901 you@vps.example.com. Stel een VNC-poort nooit open naar het internet. De meeste VNC-servers beveiligen het wachtwoord alleen tijdens de handshake en daarna niet meer. Bij een publieke poort is de inhoud van de sessie daardoor leesbaar over het netwerk.
Is een VPS geschikt als desktop?
Als dagelijks systeem is het antwoord nee, en daar zijn diverse redenen voor. Er is geen GPU aanwezig, waardoor de CPU alle grafische taken moet uitvoeren. Elke toetsaanslag wacht op een netwerk-round-trip; een latentie van 40 ms die in SSH acceptabel aanvoelt, is merkbaar in een teksteditor. Video wordt tweemaal gecomprimeerd: eerst door de website en daarna door de RDP-encoder. Uw bestanden staan op een schijf die u niet in eigen beheer heeft, en intensief desktopgebruik verbruikt een maandelijkse bandbreedte die is berekend op een webserver.
Als wegwerpmachine is het echter zeer geschikt, en dezelfde eigenschappen verklaren waarom. Het IP-adres is stabiel en behoort toe aan een datacenter; dit is gewenst wanneer een dienst een consistent adres vereist. De machine kan binnen enkele minuten vanaf een image worden hersteld, waardoor een sessie die besmet is geraakt geen enkel risico vormt. Het is geïsoleerd van uw fysieke hardware en blijft actief wanneer uw laptop is gesloten. Dankzij facturatie per uur is een tijdelijke desktop goedkoop.
Als u nog aan het onderzoeken bent waarvoor de server dient, is de praktische lijst met toepassingen waar een VPS goed in is het lezen waard voordat u er een desktopomgeving op installeert. En als de reden voor een desktop een specifieke Windows-applicatie was, weeg dit dan eerst af tegen de werkelijke verschillen tussen Linux en Windows Server, aangezien de licentie de kosten van de oplossing beïnvloedt.
FAQ
Kan ik een remote desktop draaien op een 2 GB VPS?
Ja, met een lichtgewicht desktopomgeving. XFCE of LXQt verbruikt na het inloggen ongeveer 300 tot 400 MB, wat voldoende ruimte overlaat voor een browser met enkele tabbladen. GNOME of KDE Plasma op 2 GB laat vrijwel geen ruimte over voor applicaties. Voeg een swap-bestand van 2 GB toe zodat geheugendruk de machine vertraagt in plaats van processen te beëindigen. Als een proces zonder melding verdwijnt, controleer dan dmesg | grep -i "killed process" voor de kernel out-of-memory killer.
Moet ik poort 3389 openen op mijn VPS-firewall?
Nee. TCP 3389 wordt constant gescand en een blootgesteld RDP-inlogscherm nodigt uit tot het raden van wachtwoorden. Stel port=tcp://.:3389 in binnen /etc/xrdp/xrdp.ini zodat xrdp alleen op 127.0.0.1 luistert, bevestig dit met ss -tlnp | grep 3389 en benader het via ssh -N -L 3389:127.0.0.1:3389 you@vps.example.com. Voor meer dan één of twee gebruikers kunt u xrdp beter binden aan een WireGuard-adres in plaats van aan de loopback-interface.
Waarom vraagt xrdp om "Authentication is required to create a color managed device"?
De colord-service vraagt polkit om toestemming, en polkit verleent die actie alleen stilzwijgend aan een lokale sessie. Een RDP-sessie wordt niet als lokaal beschouwd, waardoor u bij elke aanmelding een wachtwoordprompt krijgt. Op Ubuntu 24.04 werkt de oude .pkla-oplossing niet, omdat polkit 124 de lokale autorisatiebestanden heeft verwijderd. Maak /etc/polkit-1/rules.d/45-allow-colord.rules aan met een JavaScript-regel die polkit.Result.YES retourneert voor actie-ID's die beginnen met org.freedesktop.color-manager., en voer daarna sudo systemctl restart polkit uit.
Kan ik een zelfgehoste RustDesk-server achter nginx of Traefik plaatsen?
Niet de hoofdservice. hbbs en hbbr gebruiken hun eigen binaire protocollen in plaats van HTTP, waardoor er geen Host-header is om op te routeren, en UDP 21116 kan helemaal niet door een HTTP-proxy. Open TCP 21115 tot en met 21119 en UDP 21116 op de firewall en laat clients direct verbinding maken. De websocket-poorten 21118 en 21119, gebruikt door de webclient, zijn HTTP en kunnen wel achter een proxy staan. Als u dit doet, beperk de toegang via de firewall zodat alleen de proxy ze kan bereiken, aangezien hbbs X-Real-IP vertrouwt op die verbindingen.
Waarom heb ik geen geluid in mijn xrdp-sessie?
Ubuntu 24.04 gebruikt PipeWire, terwijl de geluidsomleiding van xrdp is gebouwd voor PulseAudio. Audio ontbreekt totdat u de bridge installeert. Voer sudo apt install -y pipewire-module-xrdp uit en log daarna volledig uit en weer in, omdat de module bij het starten van de sessie wordt geladen en een reconnect deze niet opnieuw laadt. Controleer met pactl list short sinks of er een sink is genaamd xrdp, en zorg ervoor dat de client om audio vraagt; dit is de /sound-vlag op xfreerdp3 of "Remote audio" in de Windows-client.