Cloudflare Tunnel statt Portfreigabe
Wie diese Seite ohne offenen Port im Router erreichbar ist — und welche Sicherheitseigenschaften man dabei gewinnt und abgibt.
Diese Seite läuft auf einem Rechner hinter einem gewöhnlichen Privatanschluss. Im Router ist kein Port offen, es gibt keine feste IP-Adresse und trotzdem ist sie unter der eigenen Domain erreichbar.
Wie das funktioniert
cloudflared baut eine ausgehende, dauerhafte Verbindung zum Cloudflare-Netz auf.
Anfragen an die Domain landen bei Cloudflare und werden durch diese bestehende
Verbindung nach innen gereicht. Es gibt keinen eingehenden Verbindungsaufbau.
# cloudflared/config.yml
ingress:
- hostname: it-handwerk-stuttgart.de
service: http://app:3000
- service: http_status:404
Was man gewinnt
- Kein offener Port, keine Angriffsfläche am Router
- Die Ursprungs-IP-Adresse steht nicht im DNS
- TLS-Zertifikate laufen ohne eigenen ACME-Client
- DDoS-Abwehr und Rate-Limiting liegen vor dem eigenen Rechner
Was man abgibt
Cloudflare terminiert TLS und sieht damit den Klartext des Datenverkehrs. Das ist keine Nebensächlichkeit, sondern die zentrale Abwägung: Für eine öffentliche Showcase-Seite ist es unkritisch, für ein System mit personenbezogenen Daten gehört diese Entscheidung dokumentiert und geprüft.
Dazu kommt eine Abhängigkeit von einem einzelnen Anbieter. Fällt Cloudflare aus, ist die Seite offline, obwohl der eigene Server läuft.
Echte Besucher-IP im Backend
Hinter dem Tunnel steht in X-Forwarded-For nicht mehr zwingend die
Client-Adresse. Cloudflare setzt CF-Connecting-IP — darauf sollte sich das
Rate-Limiting stützen:
const ip =
request.headers.get('cf-connecting-ip') ??
request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ??
'unknown';
Fazit
Für selbst gehostete Projekte ohne feste IP ist der Tunnel die pragmatischste Lösung. Man sollte nur wissen, dass man Vertraulichkeit gegen Erreichbarkeit tauscht — und diese Entscheidung bewusst treffen.