Ich habe schon eine ganze Weile mit verschiedenen Möglichkeiten experimentiert, von unterwegs und ohne dabei einen eigenen Client zu benötigen. Dabei bin ich irgendwann auf Apache Guacamole gestoßen, einem webbasierten Remotedesktop-Tool, das im Browser läuft und RDP, VNC und SSH unterstützt. Und sich mit 2FA sichern lässt. Also alles abdeckt, was ich benötige.
Guacamole läuft bei mir als Docker-Container im Homelab und bietet mir über einen gesicherten Webzugang die Möglichkeit, sowohl meine Windows- als auch meine Linux-VMs zu nutzen. Ein Browser (und Internet) reicht, und ich habe Zugriff auf eine vollständige Desktop-Umgebung – mit gewohnter Software, Dateiablage und allem Drum und Dran. Das funktioniert in den meisten Fällen auch mit restriktiven Firewalls/Proxies, da alles über HTTPS und Websockets abgewickelt wird. Durch Zwei-Faktor-Authentifizierung und restriktive Firewall-Regeln ist das Ganze auch sicher genug, um es von außen erreichbar zu machen. Und es funktioniert meistens sogar hinter restriktiven Firewalls, solange Websockets funktionieren, und eignet sich damit auch für den Zugriff von z.B. der Arbeit oder der Schule/Uni - vorausgesetzt, die vorliegenden Regelungen lassen es zu.
Schematischer Aufbau
Technisch ist das ganze eigentlich recht simpel aufgebaut:
Grober Aufbau
Guacamole ist das Herzstück vom ganzen, es stellt das Webinterface bereit, kümmert sich um das Benutzermanagement und verwaltet auch die Verbindungen. Guacamole wiederum steuert Guacd an, das ist ein Dienst, der diverse Protokolle wie RDP und VNC in ein allgemeineres Format übersetzt. Für die Benutzer- und Verbindungsverwaltung wird auch noch eine MySQL-Datenbank benötigt. Davor steht bei mir ein Caddy, aber jeder beliebige andere Reverse-Proxy tut es auch.
Einrichtung
Docker-Compose
services:
guacdb:
container_name: guacamoledb
image: mariadb:latest
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: '9ngmZtFToD3Ll4ncBA6V'
MYSQL_DATABASE: 'guacamole_db'
MYSQL_USER: 'guacamole_user'
MYSQL_PASSWORD: 'qi1tqoSTRGx5eD4ghCAG'
volumes:
- './db-data:/var/lib/mysql'
- './initdb.sql:/docker-entrypoint-initdb.d/initdb.sql'
guacd:
container_name: guacd
image: guacamole/guacd:latest
restart: unless-stopped
guacamole:
container_name: guacamole
image: guacamole/guacamole:latest
restart: unless-stopped
ports:
- 8080:8080
environment:
GUACD_HOSTNAME: "guacd"
MYSQL_HOSTNAME: "guacdb"
MYSQL_DATABASE: "guacamole_db"
MYSQL_USER: "guacamole_user"
MYSQL_PASSWORD: "qi1tqoSTRGx5eD4ghCAG"
TOTP_ENABLED: "true" # optional, forciert 2FA
depends_on:
- guacdb
- guacd
Vor dem Start muss allerdings die Datenbank noch befüllt werden. Das Container-Image bringt ein Script mit, um den nötigen Dump zu erzeugen:
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
Nun kann mit docker compose up -d
der Stack gestartet werden. Der MariaDB-Container importiert beim ersten Start alles, was unter /docker-entrypoint-initdb.d/
liegt in alphabetischer Reihenfolge - und damit auch den Dump, den wir eben angelegt haben.
Reverse Proxy
Guacamole müsste nun unter dem angegebenen Port (hier 8080) erreichbar sein, es muss der Pfad /guacamole
aufgerufen werden. Jetzt kann noch ein beliebiger Reverse-Proxy auf Guacamole verwiesen werden, beispielsweise Caddy:
guacamole.example.com {
rewrite / /guacamole
reverse_proxy http://192.168.1.2:8080
}
Ich habe hierbei auch einen Rewrite von /
zu /guacamole
hinzugefügt, damit man den Pfad nicht händisch angeben muss.
Konfiguration
Die initialen Logindaten sind guacadmin
/guacadmin
. Sofern TOTP über die Umgebungsvariablen aktiviert wurde, wird nun direkt nach einem zweiten Faktor gefragt. Oben rechts unter Einstellungen lässt sich dann eine Verbindung anlegen. Bei RDP lohnt es sich, den Haken bei Grössenänderungs-Methode: Display Update
zu setzen. Die Haken unten bei Geschwindigkeit kann man setzen, wie man möchte - ich hab hier Desktophintergrund aktivieren
und Schriftartglättung (ClearType) aktivieren
.
Nutzung
Auf der Startseite sollte nun die Verbindung angezeigt werden. Nach einem Klick sollte die Verbindung stehen und sich auch mit Änderung der Fenstergröße automatisch anpassen.
Performance
Nach meiner Erfahrung ist die Performance primär von der Single-Thread-Performance des Hosts abhängig - auf den Futros läuft Guacamole langsamer als auf dem Mini-PC mit Ryzen-Prozessor. Aber beides ist definitiv nutzbar, auch wenn ich nicht 24/7 darüber arbeiten wollen würde.