Virtueller Desktop in Docker + Internet Browserzugriff

 

Spätestens jetzt habe ich wirklich keinen Bedarf mehr für einen VPN- Tunnel ins eigene Heimnetzwerk: Eine Desktop Infrastructure (CDI) ermöglicht mir den Zugriff von einem Browser direkt auf eine virtuelle Linux-Arbeitsfläche im eigenen Netzwerk: Bereitgestellt über einen Container.

Docker Basics

Docker ermöglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.
Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker

Für den Start reicht ein simpler docker run - Befehl und der Desktop kann über den Browser mit Port 6901 erreicht werden:

sudo docker run --rm -it --shm-size=512m -p 6901:6901 -e VNC_PW=password kasmweb/desktop:1.15.0

Damit Kasm Desktop sicher vom Internet erreicht werden kann, setze ich Traefik als Let's Encrypt Reverse-Proxy ein. Der Reverse-Proxy stellt eine verschlüsselte HTTPS-Verbindung zur Verfügung und ermöglicht es mehrere Websites auf einem Server zu betreiben.

Alternativ zu einem Reverse-Proxy kann auch ein Cloudflare-Tunnel für das Veröffentlichen von Webservices aus dem eigenen Netzwerk verwendet werden:

Schritt für Schritt Kasm Desktop in Docker inklusive Zugriff vom Internet

Hardwareanforderung:
  1. Für die Docker-Installation kann eine nahezu beliebige Hardware verwendet werden. Zum Beispiel ein virtueller Server eines Providers, oder für zu Hause: ein Mini-PC, Notebook, MAC, ein NAS: QNAP, Synology oder eine andere Hardware mit x68-64 Architektur auf der sich Windows oder Linux installieren lässt.

Schematische Darstellung: Zugriff vom Internet
Voraussetzungen für den Internetzugriff:
  1. Eigene registrierte Domain, siehe Domain und dessen Verwaltung.
  2. Cloudflare oder Reverse Proxy:
    1. Cloudflare-Tunnel Service
    2. oder alternativ:
    3. Port-Forwarding und Reverse Proxy mit Let's Encrypt-Zertifikat
    siehe auch: Cloudflare oder Reverse Proxy
Nachdem der hier vorgestellt Container https mit einem Self-Signed Zertifikat verwendet, benötigt Traefik als Voraussetzungen folgende zusätzliche Option:

      - '--serverstransport.insecureskipverify'
 

Docker-Compose YAML mit Zugriff über das Internet

version: "3.8"
services:
  kasmweb:
    image: kasmweb/desktop:1.15.0
    #Labels für ReverseProxy, siehe: https://www.libe.net/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.workspace.rule=Host(`workspace.domain.tld`)"      
      - "traefik.http.routers.workspace.entrypoints=web"
      - "traefik.http.routers.workspace.entrypoints=websecure"
      - "traefik.http.routers.workspace.tls=true"
      - "traefik.http.routers.workspace.tls.certresolver=myresolver"
      - "traefik.http.services.workspace.loadbalancer.server.scheme=https"
      - "traefik.http.services.workspace.loadbalancer.server.port=6901"
      - "traefik.http.routers.workspace.middlewares=forward-auth-verify"
    volumes:
      - ./profile:/home/kasm-user
    shm_size: '1g'
    restart: always    
    environment:
      - VNC_PW=password
    expose:     
      - "6901"
    #Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
    ports:
      - "6901:6901"

#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy 
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
  default:
    external:
      name: webproxy

Die Datei verwendet keine Volumes, sondern Unterordner unterhalb der Datei docker-compose.yml. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner. Für den Aufruf aus dem Internet verwende ich zusätzlich zum Benutzernamen und dem Passwort eine Anmeldung über das Google-Konto. Verantwortlich dafür ist eine eigene Middleware, welche über das Label: "traefik.http.routers.workspace.middlewares=forward-auth-verify" zwischengeschaltet wird. Siehe: Traefik und oAuth: Eigene Webservices mit Google anmelden.

Starten - docker compose up

In dem Beispiel werden die Profildaten auf einen persistenten Ordner umgeleitet. Als Voraussetzung muss dieser vor dem eigentlichen Start angelegt werden:

mkdir profile
sudo chmod 777 ./profile/ -R
docker compose up -d

Root Berechtigungen

Um im Desktop ohne Passwort zum Root-Account wechseln zu können, habe ich das Docker-Image, wie in der Dokumentation beschrieben erweitert:

 

zusätzliche Datei: Dockerfile (ohne Endung), Inhalt:

[+]
FROM kasmweb/desktop:1.15.0
USER root

ENV HOME /home/kasm-default-profile
ENV STARTUPDIR /dockerstartup
ENV INST_SCRIPTS $STARTUPDIR/install
WORKDIR $HOME

######### Customize Container Here ###########

RUN apt-get update \
    && apt-get install -y sudo \
    && echo 'kasm-user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers \
    && rm -rf /var/lib/apt/list/*

######### End Customizations ###########

RUN chown 1000:0 $HOME
RUN $STARTUPDIR/set_user_permission.sh $HOME

ENV HOME /home/kasm-user
WORKDIR $HOME
RUN mkdir -p $HOME && chown -R 1000:0 $HOME

USER 1000

Quelle:

In der docker-compose.yml - Datei kann dann das angepasste Image für den Build / Start verwendet werden:

Inhalt docker-compose.yml- Datei:

[+]
version: "3.8"
services:
  kasmweb:
    container_name: kasmweb-desktop
    build:
      context: ./
      dockerfile: Dockerfile
    #Labels für ReverseProxy, siehe: https://www.libe.net/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.workspace.rule=Host(`workspace.domain.tld`)"      
      - "traefik.http.routers.workspace.entrypoints=web"
      - "traefik.http.routers.workspace.entrypoints=websecure"
      - "traefik.http.routers.workspace.tls=true"
      - "traefik.http.routers.workspace.tls.certresolver=myresolver"
      - "traefik.http.services.workspace.loadbalancer.server.scheme=https"
      - "traefik.http.services.workspace.loadbalancer.server.port=6901"
      - "traefik.http.routers.workspace.middlewares=forward-auth-verify"

    shm_size: '1g'
    restart: always    
    volumes: 
      - ./profile:/home/kasm-user
    environment:
      - VNC_PW=???
    expose:     
      - "6901"
    #Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
    ports:
      - "6901:6901"

#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy 
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
  default:
    external:
      name: webproxy

mögliche Clients

Neben bekannten Linux-Distributionen, wie Debian, CentOS, Kali, Fedora oder Ubuntu gibt es auch angepasste Images für den Start von bestimmten Applikationen, wie Gimp, Blender, Inkscape, LibreOffice oder für das Laden eines bestimmten Browsers: z.B. Chrome, Chromium, den Tor-Browser oder Edge. Die vollständige Clientliste kann der Herstellerseite entnommen werden: https://www.kasmweb.com/docs/latest/guide/custom_images.html

Um beispielsweise Debian zu verwenden, muss lediglich das Image in der Docker-compose-Datei ausgetauscht werden:

version: "3.8"
services:
  kasmweb:
    ..
    image: kasmweb/debian-bookworm-desktop:1.15.0
    ..

Oder beim Einsatz des Dockerfile der From Befehl zu Beginn des Dockerfile: 

FROM kasmweb/debian-bookworm-desktop:1.15.0
...

Fazit

Alternativ zu einem VPN-Zugriff und einer Remote-Verbindung auf einen bestehenden physischen oder virtuellen Client kann mit einer CDI (Container Desktop Infrastructure) ein Zugriff auf eine Desktopoberfläche innerhalb des eigenen Netzwerks ermöglicht werden. Im Vergleich zu virtuellen Servern oder Clients ist ein containerbasierter Desktop ressourcenschonender und kann daher schnell mal auf einer möglicherweise bereits vorhanden Hardware betrieben werden. Siehe auch: Günstiger und sparsamer Docker Mini Server für zu Hause.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details