Warum niemand außerhalb Ihres Netzwerks localhost erreicht
Ein Webhook-Anbieter braucht eine URL, an die er POSTen kann, und Ihr Server
läuft auf localhost:3000. Oder ein Teamkollege möchte sich durch den Branch
klicken, den Sie gerade laufen haben, oder Ihr Handy muss den Dev-Server
erreichen, um ein Layout zu prüfen. Der Server läuft. Von außerhalb Ihres
Netzwerks kommt niemand heran.
Portweiterleitung auf dem Router würde funktionieren, legt aber Ihre private
IP offen und braucht Admin-Zugriff, den Sie oft gar nicht haben. Cloudflare
Tunnel geht den anderen Weg. cloudflared, ein kleiner Daemon, den Sie neben
Ihrem Server laufen lassen, baut eine ausgehende Verbindung zum Edge-Netzwerk
von Cloudflare auf, und Cloudflare schickt den Traffic durch genau diese
Verbindung zurück. Sie öffnen keinen eingehenden Port und brauchen keine
öffentliche IP.
Es gibt zwei Varianten. Ein Quick Tunnel liefert mit einem einzigen Befehl eine öffentliche HTTPS-URL, auf einem zufälligen Hostnamen, der stirbt, sobald Sie den Prozess beenden. Das ist das Werkzeug für eine Fünf-Minuten-Demo oder einen Webhook-Test. Ein benannter Tunnel gibt Ihnen einen stabilen Hostnamen auf Ihrer eigenen Domain, der Neustarts übersteht — damit wird er zu einem kleinen, echten Stück Infrastruktur.
Wie Cloudflare Tunnel ohne offenen Port funktioniert
Der Trick ist eine Umkehr der Richtung. Einen Dienst freizugeben bedeutet normalerweise, einen eingehenden Port zu öffnen: Etwas im Internet baut eine Verbindung zu Ihrer Maschine auf, wofür sie eine routbare Adresse und eine Firewall-Regel braucht, die diesen Traffic durchlässt. Genau das zu blockieren ist der Job von NAT und den meisten Heim- und Büro-Firewalls.
cloudflared nimmt nie eingehende Verbindungen entgegen. Es wählt sich beim
Edge-Netzwerk von Cloudflare über gewöhnliches ausgehendes HTTPS ein — dieselbe
Art Verbindung, die Ihr Browser den ganzen Tag über öffnet — und hält sie
offen. Cloudflare schiebt Anfragen dann über diese Verbindung nach unten und
liest die Antworten zurück, ähnlich wie ein Server Nachrichten über ein
WebSocket an einen Browser pusht, der die Verbindung zuerst aufgebaut hat.
Ihre Firewall sieht eine ausgehende Verbindung, die sie ohnehin schon erlaubt.
Deshalb verhält sich der Tunnel hinter NAT oder auf einem Laptop ohne
öffentliche IP genau gleich: Einer ausgehenden Verbindung ist das egal.
Der Preis dafür ist, dass Cloudflare jetzt im Pfad sitzt. Ihr Tunnel-Hostname löst zu Cloudflare auf, das jede Anfrage an seinem Edge entschlüsselt, sie neu verschlüsselt und durch den Tunnel an Ihren Daemon weiterschickt. Das ist dieselbe Architektur wie hinter einem CDN oder einem Reverse Proxy: Sie geben den direkten Zugriff auf, im Tausch gegen eine Zwischenstation, die TLS terminiert und Zugriffsregeln anwenden kann, bevor überhaupt etwas Ihre Maschine erreicht.
Wie Sie mit einem Befehl einen Quick Tunnel erstellen
Installieren Sie zuerst cloudflared: brew install cloudflared auf macOS,
das .deb/.rpm-Paket aus dem Cloudflare-Repository auf Linux, oder den
Windows-Installer von der GitHub-Releases-Seite. Läuft schon etwas auf einem
lokalen Port, genügt:
| |
Ein paar Sekunden später erscheint eine Ausgabe wie diese:
| |
Diese URL liefert HTTPS mit einem Zertifikat, das Cloudflare verwaltet — an
der TLS-Konfiguration müssen Sie nie etwas anfassen. Geben Sie ihr ein paar
Sekunden, bis sie auflöst. Ab dann erreicht jeder mit dem Link Ihr
localhost:3000, bis Sie Strg+C drücken. Danach ist der Hostname endgültig
weg, und der nächste Lauf erzeugt einen neuen. Sie loggen sich nirgends ein,
legen keinen DNS-Eintrag an und brauchen kein Konto.
Die Grenzen sind aber real. Der Hostname ist zufällig, Sie können ihn also nicht in eine Webhook-Konfiguration eintragen, die einen Neustart überleben muss. Cloudflare deckelt Quick Tunnel bei 200 gleichzeitigen Anfragen und unterstützt darauf keine Server-Sent Events, ein langlebiger SSE-Stream bricht also ab. Es gibt auch keine Uptime-Garantie: Cloudflares Nutzungsbedingungen behandeln Quick Tunnel als reine Testhilfe.
Für einen Webhook, den Sie gerade jetzt debuggen, oder damit Ihr Handy den Dev-Server erreicht, reicht das völlig. Muss es morgen noch laufen, richten Sie einen benannten Tunnel ein.
Wie Sie einen benannten Tunnel auf Ihrer eigenen Domain einrichten
Ein benannter Tunnel braucht ein kostenloses Cloudflare-Konto und eine Domain, deren DNS bei Cloudflare liegt. Das Setup machen Sie einmal.
1. cloudflared gegen Ihr Konto authentifizieren:
| |
Das öffnet einen Browser und lässt Sie die zu autorisierende Domain auswählen.
Anschließend wird ein Zertifikat unter ~/.cloudflared/cert.pem gespeichert,
das jeder spätere Befehl verwendet.
2. Den Tunnel erstellen und die ID notieren:
| |
Das registriert einen Tunnel namens my-app und schreibt eine
Credentials-Datei, <TUNNEL-ID>.json, nach ~/.cloudflared/. Diese Datei ist
die Identität des Tunnels. Behandeln Sie sie wie ein Secret: Wer sie besitzt,
kann Traffic durch Ihren Tunnel schicken.
3. Die Konfiguration schreiben. Legen Sie ~/.cloudflared/config.yml an:
| |
ingress ist eine geordnete Liste von Hostname-zu-Service-Regeln, geprüft von
oben nach unten. Wenn Sie nginx als
Reverse Proxy vor Ihre Apps
gestellt haben, ist das dieselbe Routing-Idee, nur in YAML statt in
proxy_pass-Direktiven geschrieben. Ein Tunnel kann mehrere lokale Dienste
auf unterschiedlichen Hostnamen bedienen. Die letzte Regel ist Pflicht. Sie ist
der Catch-all, der für jeden Hostnamen, den die Regeln davor nicht getroffen
haben, ein 404 zurückgibt, und cloudflared startet ohne sie erst gar nicht.
4. DNS auf den Tunnel zeigen lassen:
| |
Das erstellt einen CNAME-Eintrag für app.example.com, der auf
<TUNNEL-ID>.cfargotunnel.com zeigt. Es ist ganz gewöhnliche
DNS-Auflösung, nur dass sie
auf Cloudflares Tunnel-Infrastruktur zielt statt auf eine Server-IP. Führen
Sie den Befehl einmal für jeden Hostnamen in Ihrer Ingress-Liste aus.
5. Starten:
| |
app.example.com liefert nun aus, was auf localhost:3000 lauscht, über
HTTPS. Cloudflare terminiert TLS am Edge, Ihr Origin darf reines HTTP bleiben,
weil die Tunnel-Verbindung selbst schon verschlüsselt ist.
Ein Tunnel, der in einem Terminal läuft, stirbt mit dem Terminal. Damit er einen Neustart übersteht, installieren Sie ihn als Systemdienst:
| |
Unter Linux läuft das mit sudo, wodurch $HOME zu /root wird und
cloudflared eine config.yml, die Sie als eigener Benutzer angelegt haben,
nicht mehr findet. Zeigen Sie stattdessen explizit auf die Datei:
| |
Das kopiert Ihre Konfiguration nach /etc/cloudflared/config.yml und
registriert cloudflared bei systemd (oder launchd, oder dem
Windows-Dienstemanager), sodass es beim Booten startet und nach einem Absturz
neu startet.
Wann Cloudflare Tunnel die falsche Wahl ist
Ein Tunnel passt, wenn Traffic außerhalb Ihres Netzwerks startet und eine Maschine ohne öffentliche IP erreichen muss, oder eine, die Sie nicht direkt freigeben wollen: ein Laptop, ein Homeserver, eine Box hinter Firmen-NAT. In diesen Fällen ist er das falsche Werkzeug:
- Sie haben bereits einen Server mit öffentlicher IP. Der Tunnel fügt
Cloudflares Edge als zusätzlichen Hop ein, ohne dass etwas dabei
herausspringt. Ein DNS-
A-Eintrag plus Ihr eigener Reverse Proxy oder Ihre eigene TLS-Terminierung ist einfacher und hat ein bewegliches Teil weniger, das ausfallen kann. - Sie brauchen garantiert niedrige Latenz oder bewegen große Datenmengen. Jedes Byte läuft durch Cloudflares Netzwerk. Für die meisten Web-Anwendungen ist dieser Preis vernachlässigbar, für latenzkritische oder durchsatzstarke Workloads nicht.
- Der Dienst muss laufen, auch wenn eine Maschine ausfällt. Ein
cloudflaredauf einer Maschine ist ein einzelner Ausfallpunkt, undservice installdeckt nur Prozessneustarts ab. Stirbt dieser Host, wird der Hostname dunkel. Redundanz heißt, denselben Tunnel von einer zweiten Maschine aus zu betreiben. - Ihr Code vertraut der TCP-Quelladresse für Sicherheitsentscheidungen.
Anfragen erreichen Ihren Origin aus Cloudflares IP-Bereichen. Die echte
Client-IP kommt im Header
CF-Connecting-IPan, und alles, was die Socket-Adresse liest, sieht stattdessen Cloudflares Edge.
Quick Tunnel oder benannter Tunnel: womit Sie anfangen sollten
Sind Sie sich nicht sicher, welchen Sie brauchen, brauchen Sie einen Quick
Tunnel. Führen Sie cloudflared tunnel --url http://localhost:<port> gegen
das aus, woran Sie gerade arbeiten, und öffnen Sie die URL. Wechseln Sie zu
einem benannten Tunnel, sobald Sie an eine seiner beiden echten Grenzen
stoßen: einen Hostnamen, der die Terminal-Sitzung überleben muss, oder einen
Dienst, der unbeaufsichtigt weiterlaufen muss.