RustDesk selbst hosten: Eigener Remote-Desktop-Server
TeamViewer & Co. sind bequem – aber deine Fernwartungs-Sitzungen laufen über fremde Server. RustDesk ist die Open-Source-Alternative: Der Server besteht aus zwei schlanken Diensten (hbbs für die ID-Vermittlung, hbbr für den Relay) und lässt sich in wenigen Minuten selbst hosten. In diesem Tutorial richtest du deine eigene RustDesk-Infrastruktur mit Docker Compose ein – inklusive Ports, Key-Handling und Client-Konfiguration.
Warum ein eigener RustDesk-Server?
Fernwartung ist praktisch, bis man merkt, dass die Session über die Server eines Drittanbieters läuft. RustDesk ist eine Open-Source-Alternative zu TeamViewer & AnyDesk – und der Server, der die Verbindungen vermittelt, gehört dann dir. Du behältst die Kontrolle darüber, wer sich verbinden kann, und die Sitzungen laufen über deine eigene Infrastruktur statt über fremde Relay-Server.
Konzept: hbbs, hbbr & die Ports
Das Server-Image rustdesk/rustdesk-server enthält beide Binaries – du startest sie als getrennte Container:
- hbbs – ID-/Rendezvous-Server: verwaltet die Geräte-IDs, koordiniert den Verbindungsaufbau (TCP/UDP 21116) und den NAT-Test (21115).
- hbbr – Relay-Server: leitet den Datenverkehr weiter, wenn keine direkte Verbindung möglich ist (TCP 21117).
- hbbs -r …: teilt dem ID-Server die Adresse des Relay-Servers mit, damit er diese an die Clients weitergibt.
Vorbereitung: Daten & Firewall
mkdir -p ~/rustdesk/hbbs ~/rustdesk/hbbr
cd ~/rustdesk
./hbbsund./hbbr→ jeweils/root: Hier liegen Datenbank und – wichtig – die Server-Schlüssel (id_ed25519*), die hbbs beim ersten Start erzeugt.USER_UID/USER_GID: Im offiziellen Image ohne Funktion (Dienste laufen im Container als Root) – sie schaden nicht, lassen sich aber gefahrlos entfernen.- Für
rd.huuu.bizmuss ein DNS-A-Eintrag auf die Server-IP zeigen – die Clients erreichen den Server später über diesen Namen.
Docker Compose – die Datei
So sieht das fertige Setup aus (deine Vorlage, um Kommentare ergänzt):
services:
hbbs:
container_name: hbbs
image: rustdesk/rustdesk-server:latest
command: hbbs -r rd.huuu.biz:21117 -k "" # -r = Relay-Adresse (hbbr), -k "" = ohne Schlüsselprüfung
environment:
- USER_UID=1000
- USER_GID=1000
# - ALWAYS_USE_RELAY=N # erzwingt Direktverbindung, Relay nur als Fallback
volumes:
- ./hbbs:/root # Datenbank + Schlüssel des ID-Servers
ports:
- 21115:21115 # NAT-Typ-Test
- 21116:21116 # TCP: ID-Dienst / Hole Punching
- 21116:21116/udp # UDP: Heartbeat & ID-Dienst
- 21118:21118 # Web-Client (TCP)
networks:
- rustdesk-net
depends_on:
- hbbr # Relay muss vor dem ID-Server laufen
restart: unless-stopped
hbbr:
container_name: hbbr
image: rustdesk/rustdesk-server:latest
command: hbbr
volumes:
- ./hbbr:/root # Relay-Daten
ports:
- 21117:21117 # Relay (TCP) – wird in hbbs via -r referenziert
- 21119:21119 # Web-Client (TCP)
networks:
- rustdesk-net
restart: unless-stopped
networks:
rustdesk-net: # internes Netz zwischen hbbs und hbbr
driver: bridge
command: hbbs -r rd.huuu.biz:21117: Der ID-Server bekommt die öffentliche Relay-Adresse – die Clients erhalten sie bei der Registrierung automatisch mitgeteilt.-k "": schaltet die Schlüsselprüfung ab (Details im nächsten Abschnitt) – für den Testbetrieb praktisch.depends_on: startet zuerst den Relay-Server, damit hbbs ihn direkt erreichen kann.:latestfolgt der aktuellen Server-Version – wer kontrolliert updaten will, pinnt ein Versions-Tag.
Konfiguration: Relay, Key & Clients
Zwei Dinge entscheiden darüber, ob sich Clients verbinden dürfen: der -r-Parameter und die Schlüsselprüfung.
| Thema | Erklärung |
|---|---|
-r rd.huuu.biz:21117 | Adresse des Relay-Servers, die hbbs an alle Clients weitergibt. Muss von außen erreichbar sein (DNS + Port 21117). |
-k "" | Deaktiviert die Schlüsselprüfung – jeder Client mit korrekter Server-Adresse darf sich verbinden. Bequem, aber weniger sicher. |
| Public Key | Ohne -k "" erzeugt hbbs ein Schlüsselpaar in ./hbbs; den öffentlichen Schlüssel zeigt das Log (docker logs hbbs) – er muss in jedem Client hinterlegt werden. |
ALWAYS_USE_RELAY | Auf Y setzen, wenn direkte P2P-Verbindungen unterbunden werden sollen (z. B. hinter strikten NATs). |
| Client-Einstellung | Im RustDesk-Client unter „ID/Relay-Server“ den Wert rd.huuu.biz eintragen – Port 21116 ist der Standard und kann weggelassen werden. |
-k "" nur zum Testen verwenden. Für den Dauerbetrieb den
generierten Public Key aus dem Log in die Clients eintragen – dann kann sich nur anschließen, wer den Schlüssel kennt.
Netzwerk, Firewall & Erreichbarkeit
Damit alles von außen funktioniert, müssen folgende Ports in der Firewall freigegeben sein:
| Port | Protokoll | Zweck |
|---|---|---|
| 21115 | TCP | NAT-Typ-Test |
| 21116 | TCP + UDP | ID-Dienst, Hole Punching, Heartbeat |
| 21117 | TCP | Relay (hbbr) – Datenübertragung |
| 21118 / 21119 | TCP | Web-Client (Browser) |
# Beispiel: UFW (Ports nur für die RustDesk-Dienste)
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
21116/udp wird gern vergessen – ohne ihn funktioniert die ID-Anmeldung der Clients nicht.
Erster Start & erste Verbindung
cd ~/rustdesk
docker compose up -d
docker compose logs -f hbbs # zeigt u. a. den generierten Public Key
Danach auf dem Ziel-Rechner den RustDesk-Client einrichten:
- Unter Einstellungen → Netzwerk bei „ID/Relay-Server“
rd.huuu.bizeintragen (ohne Port – 21116 ist Standard). - Wird die Schlüsselprüfung genutzt, den Public Key aus
docker logs hbbsins Feld „Key“ kopieren. - Die angezeigte ID erscheint danach im Netz – vom anderen Gerät aus verbinden und das Passwort eingeben.
- Verbindungstest: Direktverbindung (P2P) wird bevorzugt; ist keine möglich, springt automatisch der Relay-Server ein.
Backups, Keys & Updates
Für Updates reicht docker compose pull && docker compose up -d – die
Daten bleiben dank Volumes erhalten. Wichtig: Ein Backup der Ordner ./hbbs und ./hbbr
sichert auch die Server-Schlüssel.
id_ed25519*-Dateien in ./hbbs
gelöscht, erzeugt hbbs neue Schlüssel – und alle Clients mit dem alten Public Key sind abgemeldet. Wer mit
-k "" arbeitet, umgeht das Problem, verzichtet dafür aber auf die Schlüsselprüfung.
Häufige Probleme (FAQ)
| Problem | Lösung |
|---|---|
| Clients finden den Server nicht | Port 21116 TCP+UDP muss öffentlich erreichbar sein – DNS-Eintrag prüfen, Firewall (Host & Provider) kontrollieren. |
| Verbindung kommt nicht zustande / nur sehr langsam | Relay-Adresse prüfen (-r rd.huuu.biz:21117), Port 21117 offen? Falls nötig ALWAYS_USE_RELAY=Y setzen. |
| „Key mismatch“ beim Verbinden | Public Key im Client entspricht nicht dem Server – aktuellen Key aus docker logs hbbs eintragen oder (nur Test) mit -k "" starten. |
| Web-Client funktioniert nicht | Ports 21118 und 21119 müssen offen sein – sie werden nur für den Browser-Client benötigt. |
| Geräte-IDs verschwinden nach Neustart | Volumes prüfen: ./hbbs:/root und ./hbbr:/root müssen gemountet bleiben. |
| Nach Update keine Verbindung mehr | Image-Update kann Datenbankformat ändern – vorher Backups von ./hbbs/./hbbr ziehen und Version pinnen. |
Fazit
RustDesk bringt Fernwartung zurück unter eigene Kontrolle: zwei kleine Container, sechs offene Ports und ein DNS-Eintrag genügen, damit deine Clients sich über deinen eigenen ID- und Relay-Server verbinden. Die Einrichtung ist in fünf Minuten erledigt – der einzige Punkt, den man im Betrieb nicht vernachlässigen darf, ist der Umgang mit den Server-Schlüsseln und der Firewall.
-r auf die öffentliche Relay-Adresse setzen. ③ Ohne -k "" gehört der Public Key in jeden Client.
④ Schlüssel-Ordner (./hbbs) sichern – Verlust meldet alle Clients ab.