Self-hosting guides reach for the same move to put a service on the internet safely: a Cloudflare Tunnel, or a VPS running nginx or Caddy as a reverse proxy. Both work, both hide your home IP, and both are sold as "secure remote access" with no mention of the one question that decides whether your traffic is private: where does TLS get terminated? Whoever terminates it reads your plaintext. For most of these setups that is not you.
//Terminating TLS Means Reading the Plaintext
"Terminating TLS" means being the endpoint that decrypts the connection. HTTPS is encrypted between two parties, and the party that holds the private key and decrypts the stream sees everything inside it - URLs, headers, cookies, request bodies, responses. When a middlebox terminates your visitors' TLS, there are really two separate encrypted connections - visitor to middlebox, and middlebox to origin - with the middlebox in the clear between them. That is not a flaw; it is how a reverse proxy does caching, routing and filtering. It just means the middlebox is a party that reads your traffic.
//The Cloudflare Tunnel, Specifically
A Cloudflare Tunnel runs cloudflared on your box, which makes an outbound-only connection to Cloudflare's edge. Nothing listens for inbound connections on your origin, and you can close every inbound port on your router - a genuine and large security win, and the reason the tunnel is popular. Your home IP never appears in DNS; visitors only ever reach Cloudflare.
But the visitor's HTTPS session terminates at Cloudflare's edge. Cloudflare decrypts your traffic there to proxy and cache it, then opens a second encrypted connection to your origin (in Full or Full Strict mode). In between, Cloudflare sees your plaintext. This is documented behaviour, not a secret - it is how the product provides its features - but it is the thing the "secure tunnel" framing elides. The honest one-liner: a Cloudflare Tunnel hides your service from everyone except Cloudflare.
//A VPS Reverse Proxy Is the Same Trust Shape
Fronting your service with a VPS running nginx or Caddy puts the TLS endpoint on the VPS. It decrypts every request before forwarding it, so it reads your plaintext exactly as Cloudflare's edge does. The difference is custody: you own and operate the VPS, which is better if you secure it well and worse if you do not - a small internet-facing box you forget to patch is now a machine that sees all your traffic and has a public IP of its own.
//The One Arrangement Where Only You Read It
If you want the middle to be unable to read your traffic, it must not terminate TLS. In a TCP passthrough setup - HAProxy in TCP mode, or SNI-based routing without decryption - the middlebox reads only the server name from the handshake to know where to forward, then relays the still-encrypted stream. A reverse SSH tunnel carrying an already-TLS connection has the same shape. Only your origin holds the keys, so only your origin sees plaintext.
The cost is that you lose everything that needs to see inside the request at the edge: caching, a web application firewall, path-based routing, header rewriting, HTTP/2 multiplexing. Passthrough is the right call when end-to-end confidentiality past the middlebox matters more than edge features - and the wrong call when you actually wanted those features and assumed you could have them and privacy too.
//Sourcing and Framing
The cloudflared outbound-only connection model, the no-open-ports and hidden-origin properties, and the two-connection SSL-mode architecture (visitor to edge, edge to origin, with Flexible leaving the origin leg unencrypted) are from Cloudflare's own developer documentation. The TLS-termination reasoning - that the party holding the key reads the plaintext - is standard TLS, and the HAProxy SNI-routing / TCP-passthrough behaviour is from HAProxy's documented modes. The framing is this site's recurring one: these tools relocate who can see your traffic, and the useful literacy is naming that party on purpose rather than inheriting it from a tutorial.