Skip to content
AB
← All projects

Cloud · Ongoing

Self-Hosted Services Behind Cloudflare

My personal services run at home and reach the internet through Cloudflare Tunnels — no port forwarding, no public IP exposure, and no inbound firewall rules.

0
Ports forwarded
0
Inbound rules
Origin
IP never exposed

Why tunnels

The usual way to expose something running at home is to forward a port and hope. That publishes your residential IP, puts an open port in front of whatever is listening, and means a misconfigured service is directly reachable from the internet.

Cloudflare Tunnels invert it. cloudflared runs next to the service and makes an outbound connection to Cloudflare’s edge. Traffic arrives at Cloudflare and is handed back down that existing connection. There is no inbound firewall rule, no forwarded port, and the origin address is never published — each service is reached through a CNAME to a tunnel identifier rather than an address.

How it is arranged

Each service gets its own hostname on the zone, pointed at the tunnel. DNS, TLS termination and the public entry point all sit at Cloudflare, while the services themselves stay on the internal network behind a local reverse proxy.

Authentication is the part worth getting right. Anything that should not be world-readable sits behind an identity check rather than relying on the service having good auth of its own, so the exposure surface is one well-understood front door instead of one per application.

What it pairs with

The same zone carries mail routing for the domain and the DNS for my AWS-hosted sites, so one control plane covers the public surface of everything I run, whether the origin is a container in my house or an S3 bucket in ap-south-1.

The service inventory itself is on the homelab page — this one is about how any of it is reachable.