Tailscale vs Cloudflare Tunnel for homelab access: the comparison everyone gets wrong
The Reddit fight nobody asks the right question about. Tailscale and Cloudflare Tunnel solve different problems — and choosing between them is mostly choosing which problem you actually have.
The Tailscale-vs-Cloudflare-Tunnel debate is the most consistently miscast comparison in homelab subreddits. People ask which is better the same way they’d ask which is better between a hammer and a screwdriver, and the most-upvoted reply on the 145-upvote “Yet another debate” thread on r/homelab gets it exactly right with 376 upvotes of its own:
“Cloudflare Tunnels: I don’t want to expose my server to the public net, but I want this service publicly accessible. Tailscale: I don’t want to expose my server to the public net, but I want a couple of friends or family members to have access. Gross oversimplification, but that’s how I see it.”
That’s the comparison. Everything else is implementation detail. This piece walks through what each one is actually for, where they overlap, where they don’t, and which one you should pick — with the unfortunate-but-honest answer that for most serious homelab setups, the answer is “both, for different things.”
The setup question that drives the choice
Before picking either tool, answer this: do the services on your homelab need to be reachable by people who don’t have your stuff installed, or only by you and a few trusted people who can install a client?
- Public-reachable services — Plex/Jellyfin for friends who won’t install a VPN, a status page you want indexed, a webhook endpoint a third-party SaaS needs to hit, a personal blog. Whatever it is, the constraint is “anyone with the URL should be able to load it.” → Cloudflare Tunnel territory.
- Trusted-mesh services — your Proxmox web UI, your Home Assistant dashboard, your file server, your SSH access, anything that’s “for you and maybe family.” → Tailscale territory.
The reason the comparison gets messy is that most homelabs have both kinds of services, and people who only know one tool try to use it for both. You can technically expose Plex via Tailscale Funnel (Tailscale’s public-share feature) and you can technically gate Cloudflare Tunnel access behind Cloudflare Access policies. Both work. But each tool is much better at its native use case than at the other one’s native use case, and trying to force a single tool to do both jobs is where the friction shows up.
Tailscale: the “I never want a public port” path
Tailscale runs WireGuard with a coordination layer that handles NAT traversal and identity. You install the client on every device you want in your mesh — phones, laptops, servers, even some routers — and they form a private overlay network where each device gets a 100.x.x.x IP that’s only reachable to other Tailscale-authenticated devices. No public port forwarding. No DNS records needed. No cert management.
The Reddit dataset is unambiguous about why this is popular. From the 519-upvote “How do you securely expose your self-hosted services” thread:
“Then don’t expose yourself. Use a mesh VPN solution that you have full control of authentication and access etc. — ie. tailscale (where no ports are openly exposed).”
And from the same thread, a top reply with 79 upvotes: “I have a combination of tailscale/wireguard and pangolin. It’s definitely working well for me.” This is the modal homelab user in late 2025 — Tailscale for personal access, something else (Pangolin, Cloudflare Tunnel, reverse proxy) for the public services they also want to expose.
What Tailscale is good at:
- Zero-port-forward access from anywhere. Your phone on hotel Wi-Fi can SSH into your home server. Your laptop on a coffee shop network can hit your Home Assistant. Nothing is exposed.
- Identity-bound access. You can scope which devices can reach which other devices via ACLs. Friend who installed Tailscale on their phone can reach your Plex but not your Proxmox UI.
- Magic DNS. Each device gets a stable hostname (
myserver.tail-net.ts.net). No DNS gymnastics. - SSO friendly. Use Google, GitHub, Microsoft, or a custom OIDC for who’s allowed on your tailnet.
Where Tailscale gets awkward:
- Sharing with non-technical users. Tailscale Funnel exists but you’re back to a Cloudflare-Tunnel-shaped problem at that point. A QR-code-install for technical-ish friends and family works (see the 7-upvote comment on the “Yet another debate” thread). For grandma watching Plex, it’s a stretch.
- CGNAT and double-NAT. Mostly handled by the coordination server, but occasionally you’ll see slower connection negotiation when both ends are behind aggressive NAT.
- No L7 filtering or WAF. It’s a VPN, not a firewall. You get to whatever service is listening on the device.
Cloudflare Tunnel: the “public service without a public port” path
Cloudflare Tunnel works the opposite direction: a cloudflared daemon on your home server makes an outbound connection to Cloudflare’s edge. Cloudflare receives traffic for your domain (plex.yourdomain.com), routes it through the persistent outbound tunnel, and your server responds without ever needing inbound ports open. Free for personal use, scales to enterprise.
The pitch is straightforward and the 509-upvote “Why does everyone insist on no public facing ports?” thread captures the security argument clearly. A top comment with 672 upvotes lays it out:
“When you have ports open, bots will come knocking. They did all the time before I switched to tunnels, and I could see the dozens of attempts on my UNIFI dashboard every day. None were successful, but if there is a zero day exploit, by definition we don’t know what the risk is.”
What Cloudflare Tunnel is good at:
- Public service exposure without port forwarding. Friend clicks a link, gets your Plex. No client install required.
- DDoS protection and WAF. You get Cloudflare’s edge protection free as part of the deal — large attack absorbed before it hits your residential connection.
- Easy TLS. Cloudflare handles the cert at the edge. No Let’s Encrypt automation on your side.
- Cloudflare Access bolt-on. Optional zero-trust auth layer where you can require Google/GitHub/email login before traffic reaches your service. Combines best-of-both.
- CGNAT-proof. Works fine on residential connections behind CGNAT or double-NAT because it’s pure outbound.
Where Cloudflare Tunnel gets awkward:
- Cloudflare TOS forbids streaming media. The most common gotcha in 2025: streaming Plex or Jellyfin through Cloudflare Tunnel violates their TOS — they classify it as bandwidth abuse. The Yet another debate” thread flagged this directly: “Streaming Plex or Jellyfin behind CF tunnels breaks their TOS.” Enforcement is inconsistent — some users report years of streaming without action, others have been banned. Don’t bet your media server on it. Use Tailscale for media access.
- Trust in Cloudflare’s intermediary position. Your traffic transits Cloudflare’s network. They terminate TLS at the edge. For most homelab use that’s fine; for paranoid users it’s a deal-breaker.
- Dependent on the Cloudflare relationship. If they decide your traffic violates TOS, your service is gone. Self-hosted alternatives like Pangolin are emerging — a 622-upvote Pangolin 1.13 release post on r/selfhosted in December captured the demand — but the maturity gap is still wide.
- Need a domain in Cloudflare’s DNS. Not a huge deal but it’s an extra step.
The combined stack that actually works
After three years of running both on my homelab, the working pattern is:
Cloudflare Tunnel for:
- Public web services that need to “just work” for visitors (a personal site, a webhook endpoint)
- Anything you want behind Cloudflare Access for friend-of-the-family auth
- Services where you want DDoS protection on a residential connection
Tailscale for:
- Everything administrative: Proxmox UI, Portainer, router admin, SSH
- Plex / Jellyfin / file sharing for trusted people who can install a client
- Connecting multiple sites — your homelab in apartment A, a Pi at parents’ house, a VPS — all in one mesh
- Phone access from anywhere without exposing anything
The intersection — where both work and you have to pick — is “public-ish access to a service that isn’t streaming media.” Status pages, admin panels you want to share with one collaborator, a notes app. In that intersection, Cloudflare Tunnel + Cloudflare Access is usually the better choice because it scales to non-technical users without client install, but Tailscale Funnel works if you don’t want to be dependent on Cloudflare’s relationship.
The lurking third option: Pangolin and friends
The 622-upvote December r/selfhosted thread for Pangolin 1.13 is the signal that an open-source third path is maturing fast. Pangolin is self-hostable (typically on a small VPS), gives you Cloudflare-Tunnel-like reverse-proxy functionality without routing through Cloudflare’s network, and pairs naturally with WireGuard for the mesh-VPN side. It’s not yet at parity for the Cloudflare-equivalent features — no global edge, no WAF, no DDoS absorption at Cloudflare scale — but for users whose constraint is “I don’t want a third party in my traffic path,” it’s now a viable option.
If you’re starting fresh in late 2025, the working three-tool stack is:
- Tailscale for the private mesh
- Cloudflare Tunnel for the public services you don’t mind routing through Cloudflare
- Pangolin (or a VPS + reverse proxy + WireGuard) for the public services you don’t want Cloudflare to terminate
For most homelab users the third tier is overkill and Tailscale + Cloudflare Tunnel is plenty. For privacy-focused or business-class setups, the third tier earns its place.
What the YouTube tutorials usually skip
Most YouTube Tailscale or Cloudflare Tunnel tutorials walk through one setup in isolation. The most credible of the head-to-head videos is Mackey Tech’s “Which is Best for Raspberry Pi & HomeLab? Tailscale vs Cloudflare Tunnel” (17 min, July 2025), and it lands on the right framing in the first thirty seconds: “Both promise hassle-free remote access, but they work in different ways with different benefits and different use cases.” His specific articulation of Tailscale is the clearest one I have seen on YouTube: “a private mesh VPN built on WireGuard’s VPN protocol… acts similar to a peer-to-peer network where there’s no central server, and each Tailscale device can act as both a client and a server.” Cloudflare Tunnel he describes as “a reverse proxy, but it’s different in that your server initiates an outbound connection to Cloudflare. This means you don’t need to expose any inbound ports on your firewall, making it easier and safer to share a hosted service.” Mackey’s recommendation pattern matches the one this article arrives at: Tailscale for personal mesh, Cloudflare Tunnel for “securely sharing a hosted website or maybe a service for a homeowners association or a small business.”
The other useful YouTube angle is from the Tailscale-evangelism corner. 2GuysTek’s “I ditched traditional VPN for Tailscale (and you should too!)” (8 min, 92K views, January 2025) and Thomas Wilde’s “The BEST way to access Immich from anywhere! | Tailscale + Cloudflare” (19 min, 56K views, January 2025) are the two most-viewed framing pieces. Wilde’s video specifically walks through using both tools together on Immich — Tailscale for the admin path, Cloudflare Tunnel for the share-with-non-Tailscale-users path — which is the exact combined pattern this article recommends and which most single-tool tutorials skip.
The Reddit reality is that nobody runs just one — and the “which is better” question is the wrong one. The honest question is “for this specific service, which is the right one?” — and most YouTube tutorials do not frame it that way.
The other thing YouTube usually skips: the streaming TOS gotcha. I have not yet seen a Cloudflare Tunnel walkthrough on YouTube that warns the viewer about the Plex/Jellyfin streaming issue. It’s the single most common cause of homelab users being burned by Cloudflare Tunnel, and it’s not in the official Cloudflare docs in a way that’s easy to find. The Reddit threads call it out reliably; the video tutorials almost never do.
The verdict
Neither tool is winning at the other’s job. Tailscale is the right answer for private mesh access. Cloudflare Tunnel is the right answer for public-facing exposure of non-streaming services. If you only need one, the choice is determined entirely by who needs to reach the service. If you have both kinds of services (which most serious homelabs do), run both — they don’t conflict, they don’t compete, and together they cover the entire problem space.
The next time someone in r/homelab asks “Tailscale vs Cloudflare Tunnel,” the right answer is to ask back: “Who needs to reach the service?” The answer to that question chooses the tool. Stop comparing the tools to each other.
Sources
Every reference behind this piece. If we make a claim, it's because at least one of these said so — or we lived it ourselves.
- Firsthand Three years of running both Tailscale and Cloudflare Tunnel on my own homelab
- Docs Tailscale documentation — Tailscale
- Docs Cloudflare Tunnel documentation — Cloudflare
- Blog r/selfhosted — "How do you securely expose your self-hosted services" (519 ups) — r/selfhosted
- Blog r/homelab — "Why does everyone insist on no public facing ports?" (509 ups) — r/homelab
- Blog r/homelab — "Yet another debate: Why the push for Tailscale over Cloudflare Tunnels?" (145 ups) — r/homelab
- YouTube Which is Best for Raspberry Pi & HomeLab? Tailscale vs Cloudflare Tunnel Tutorial — Mackey Tech
- YouTube Stop Port Forwarding! Tailscale & Cloudflare Tunnels Explained (Homelab Series Part 5) — Bob Loves Tech
- YouTube The BEST way to access Immich from anywhere! | Tailscale + Cloudflare — Thomas Wilde
- YouTube I ditched traditional VPN for Tailscale (and you should too!) — 2GuysTek