Zum Inhalt

Cloudflare Tunnel mit Docker einrichten

Veröffentlicht am 22. August 2026 · Geschätzte Lesezeit: 4 Minuten

Mit einem Cloudflare Tunnel erreichst du einen lokalen Webdienst über eine eigene Domain, ohne eine Portfreigabe im Router einzurichten. Der cloudflared-Container baut die Verbindung aus deinem Heimnetz zu Cloudflare auf und leitet Anfragen an den gewünschten Dienst weiter. Für die Einrichtung solltest du etwa 20 Minuten einplanen.

Voraussetzungen

  • Ein Server mit Docker und Docker Compose
  • Eine Domain, deren DNS über ein Cloudflare-Konto verwaltet wird
  • Ein bereits laufender lokaler Webdienst, zum Beispiel auf http://192.168.178.20:8080
  • Zugriff auf das Cloudflare-Dashboard

1. Tunnel im Cloudflare-Dashboard anlegen

Öffne das Cloudflare-Dashboard und gehe zu Networking → Tunnels → Create Tunnel. Wähle Cloudflared, vergib einen eindeutigen Namen und speichere den Tunnel.

Cloudflare zeigt anschließend einen Installationsbefehl mit einem langen Token an. Kopiere nur den Wert hinter --token. Er wird im nächsten Schritt als <tunnel-token> eingesetzt.

Token geheim halten

Das Tunnel-Token erlaubt einem Connector, sich mit deinem Tunnel zu verbinden. Speichere es nicht in einem öffentlichen Repository. Falls es versehentlich veröffentlicht wurde, rotiere das Token im Cloudflare-Dashboard.

2. Projektordner und Token-Datei anlegen

Führe diesen Befehl auf dem Docker-Server aus. Er erstellt den Projektordner und wechselt hinein:

mkdir -p ~/cloudflare-tunnel && cd ~/cloudflare-tunnel

Lege danach die Datei .env an. Ersetze <tunnel-token> durch den kopierten Wert aus dem Cloudflare-Dashboard:

printf 'TUNNEL_TOKEN=%s\n' '<tunnel-token>' > .env

Beschränke den Zugriff auf deinen Benutzer:

chmod 600 .env

3. Compose-Datei anlegen

Lege im Ordner ~/cloudflare-tunnel eine Datei namens compose.yaml mit diesem Inhalt an:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel --no-autoupdate run --token ${TUNNEL_TOKEN}

${TUNNEL_TOKEN} wird beim Start aus der geschützten .env-Datei eingesetzt. Der Container benötigt keine eingehende Portfreigabe.

4. Container starten und Verbindung prüfen

Starte den Connector auf dem Docker-Server:

docker compose up -d

Prüfe anschließend den Status:

docker compose ps

Zeige bei Problemen die letzten Protokollzeilen an:

docker compose logs --tail=50 cloudflared

Im Cloudflare-Dashboard sollte der Tunnel nach kurzer Zeit als verbunden erscheinen.

Firewall prüfen

In einem stark eingeschränkten Netzwerk muss der Server ausgehend Port 7844 erreichen können. Eine eingehende Freigabe im Router ist nicht nötig.

5. Webdienst mit einer Subdomain verbinden

Öffne im Cloudflare-Dashboard den Tunnel und wähle Routes → Add route → Published application. Trage Folgendes ein:

  • Hostname: zum Beispiel dienst.example.de
  • Service: zum Beispiel http://192.168.178.20:8080

Ersetze die Beispielwerte durch deine Subdomain, die IP-Adresse deines lokalen Servers und den Port des Webdienstes. Speichere die Route und rufe anschließend https://dienst.example.de im Browser auf.

Dienst zusätzlich absichern

Ein veröffentlichter Hostname ist grundsätzlich aus dem Internet erreichbar. Verwende die Anmeldung des Dienstes oder schalte Cloudflare Access davor. Admin-Oberflächen ohne starke Anmeldung und Mehrfaktor-Authentifizierung gehören nicht öffentlich ins Internet.

6. Backup und Rückweg vorbereiten

Sichere die beiden lokalen Dateien verschlüsselt. Dieser Befehl wird im Projektordner ausgeführt und erstellt ein Archiv, das auch das geheime Token enthält:

tar czf cloudflare-tunnel-backup-$(date +%F).tar.gz compose.yaml .env

Backup enthält ein Geheimnis

Bewahre das Archiv verschlüsselt und nicht in einem öffentlich erreichbaren Ordner auf.

Zum Abschalten des lokalen Connectors führst du im Projektordner diesen Befehl aus:

docker compose down

Entferne danach im Cloudflare-Dashboard die veröffentlichte Route. Falls der Tunnel nicht mehr verwendet wird, lösche ihn dort ebenfalls oder rotiere sein Token.

7. Typische Fehler beheben

  • Fehler 502: Die unter Service eingetragene IP-Adresse oder der Port ist falsch, oder der lokale Dienst läuft nicht.
  • Tunnel bleibt getrennt: Prüfe das Token, die Container-Protokolle und ausgehende Firewall-Regeln.
  • Seite öffnet sich, Anmeldung fehlt: Nimm die Route sofort offline und richte zuerst eine sichere Anmeldung oder Cloudflare Access ein.
  • SSH oder RDP funktioniert nicht wie eine Webseite: Nicht-HTTP-Dienste benötigen auf der Client-Seite ebenfalls cloudflared und eine passende Access-Konfiguration.

8. Quellen und Videos

Fertig

Der lokale Webdienst ist nun über deine HTTPS-Subdomain erreichbar, ohne dass du einen Port im Router geöffnet hast. Teste die Adresse einmal im WLAN und einmal über das Mobilfunknetz. Beides sollte funktionieren, während im Router weiterhin keine Weiterleitung für den Dienst existiert.