Tailscale vs Cloudflare comes down to the data path. Tailscale builds a WireGuard mesh where devices connect directly and a coordination server only hands out keys and policy. Cloudflare Access and Tunnel send every request through Cloudflare’s edge, where Access authorizes it. Pick Tailscale for SSH and arbitrary protocols on managed machines; pick Cloudflare for browser apps and unmanaged users.
The two get compared constantly because they answer the same question: how do people reach internal systems without a flat VPN. They answer it with opposite architectures, a checkpoint versus a mesh, and almost every practical difference between them falls out of that one choice. Neither is the “more Zero Trust” option. They fit different fleets.
Tailscale vs Cloudflare at a glance
Prices checked October 2026 on Tailscale’s pricing page and Cloudflare’s Access plans.
| Tailscale | Cloudflare Access + Tunnel | |
|---|---|---|
| Data path | Direct WireGuard between devices; relays only when direct fails | Every request passes through Cloudflare’s edge |
| Who sees application plaintext | Only the two endpoints | Cloudflare’s edge, for proxied HTTP |
| Software at the origin | Tailscale on the node, or a subnet router | cloudflared, outbound connections only |
| Policy | One tailnet policy file | Per-application Access policies |
| Free tier | Personal: up to 6 users | Free: up to 50 users |
| Paid entry price | Standard: $8 per user per month | Pay-as-you-go: $7 per user per month, paid annually |
The data path is the real difference
Tailscale’s data plane is WireGuard between peers. Its documentation is specific about what the central service does and does not do: the coordination server exchanges public keys and distributes policy, and “the private key never, ever leaves its node.” When two devices cannot reach each other directly, traffic falls back to a DERP relay, and even then, per the DERP servers doc, “it’s impossible for a DERP server to decrypt your traffic”; it “blindly forwards already-encrypted traffic from one device to another.” Tailscale describes the control plane as “hub and spoke, but that doesn’t matter because it carries virtually no traffic.”
Cloudflare Access sits in the opposite position. It is a reverse proxy, and a reverse proxy terminates the connection by definition: the request is decrypted at the edge, evaluated against policy, and re-sent to the origin over the tunnel. That is what makes the clientless browser experience and per-request logging possible, and it is also the thing to be deliberate about. If your requirement is that no intermediary can process application plaintext, a proxy model is the wrong shape regardless of vendor.
The flip side is that a proxy can enforce and record things a mesh cannot see. Per-request authorization produces a decision log covering who reached which application and when.
Tailscale architecture: keys, NAT traversal and relays
Tailscale separates a control plane from a data plane. The coordination server is “essentially, a shared drop box for public keys”: nodes publish their keys and current locations and fetch their peers’. The data plane is a mesh of WireGuard tunnels, and NAT traversal (STUN and ICE techniques) connects nodes behind separate NATs without opening inbound ports.
If a direct path fails, a device tries a peer relay in your tailnet next, then Tailscale’s DERP servers, which run in 18 countries with at least three servers in most regions. Peer relays went generally available on February 18, 2026, on every plan including Personal. Both ends need Tailscale 1.86 or later, and tailscale set --relay-server-port=40000 plus a grant for the tailscale.com/cap/relay capability turns a node into one.
Cloudflare Tunnel vs Tailscale
Both avoid opening an inbound port; they differ in who can reach the service. Cloudflare Tunnel publishes it on your own hostname through Cloudflare’s edge, so any browser can reach it, gated by Access if you add a policy. Tailscale makes it reachable only to devices joined to your tailnet. For a public or client-free audience, use Tunnel; for your own machines, Tailscale.
cloudflared only dials out to Cloudflare, on port 7844 over UDP for QUIC or TCP for HTTP/2 per the firewall requirements, so the origin can drop all inbound traffic. One tunnel runs up to 25 active replicas. The nearest Tailscale equivalent of a public Tunnel hostname is Tailscale Funnel, so a fair comparison has three columns.
| Cloudflare Tunnel (public hostname) | Tailscale (inside the tailnet) | Tailscale Funnel | |
|---|---|---|---|
| Who can connect | Anyone, filtered by Access if configured | Tailnet devices the policy file allows | Anyone on the internet |
| Hostname | Your own domain on Cloudflare | MagicDNS name or tailnet IP | tailnet-name.ts.net only; no custom domains |
| Where TLS terminates | Cloudflare’s edge | End to end between nodes (WireGuard) | On your node; the Funnel relay cannot decrypt |
| Protocols and ports | HTTP/S; TCP, SSH, RDP, SMB with cloudflared on the client; no UDP | Any IP traffic | A local service on 443, 8443 or 10000 |
| Identity for visitors | Access policy at the edge | Tailnet identity plus grants | None; the app must authenticate users |
Funnel needs Tailscale 1.38.3 or later, MagicDNS, tailnet HTTPS certificates and a funnel node attribute; then tailscale funnel 3000 publishes local port 3000. Because TLS terminates on your node, the relay cannot read the traffic. The trade-offs are a fixed ts.net name, three ports, beta status (on all plans), bandwidth limits you cannot configure, and no identity check for anonymous visitors.
Tunnel’s limits sit elsewhere. Non-HTTP services on a public hostname need cloudflared access tcp or cloudflared access ssh on the client, and for long-lived TCP and SSH sessions the protocol matrix recommends Client-to-Tunnel instead. On Free, Pro and Business plans, the Tunnels FAQ says serving video and other large files over public hostname routes requires a specific paid service; private network routes are exempt.
Cloudflare Mesh: tailnet-style addressing, hub-style path
Cloudflare’s tailnet-shaped product is Cloudflare Mesh, launched April 14, 2026, when WARP Connector became the Mesh node and the WARP client became the Cloudflare One Client (what that client actually does). Every participant gets a private IP from 100.96.0.0/12, TCP, UDP and ICMP all work, nodes with CIDR routes play the subnet-router role, and it is free for up to 50 nodes and 50 users.
The Mesh concepts page is explicit that traffic “routes through the nearest Cloudflare data center, not directly between devices.” That lets Gateway network policies and posture checks cover every connection. It also keeps Cloudflare in the data path, which is exactly what Tailscale’s direct WireGuard avoids.
Running Cloudflare Tunnel and Tailscale together
Running both on one host is a coherent design: Tunnel carries the hostnames outsiders reach in a browser, the tailnet carries administrators’ SSH and database sessions, and neither needs an inbound port.
- Install
cloudflaredas a service (see the Ubuntu install guide), allow outbound port 7844 on UDP and TCP, and route only the web hostnames, each behind an Access application. - Join the host to the tailnet under a tag, with a grant that opens only the admin ports to an admin group.
- Keep admin services out of the tunnel’s ingress rules. Access and the tailnet policy file are separate policies, and a service reachable both ways is only as strict as the looser of the two.
- Remove old port forwards, then confirm from an outside network that nothing on the host answers except through those two paths.
What has to be installed
This is usually the deciding factor in practice.
| Cloudflare Access | Tailscale | |
|---|---|---|
| Browser access to an internal web app | No client needed; the hostname is public and Access authenticates at the edge | Client required on the device, or reach it through a subnet router |
| Non-HTTP protocols (SSH, RDP, databases) | Device client or protocol-aware routing | Native; it is just IP connectivity inside the tailnet |
| Contractor or unmanaged laptop | Browser plus an identity provider login is enough for web apps | Device must join the tailnet |
| Appliances that cannot run an agent | Reached through the connector on the internal network | Reached through a subnet router |
If most of what people need is a handful of internal web applications and some of those people are outside your device management, Cloudflare’s clientless path removes an entire onboarding problem. If what people need is SSH, database ports and arbitrary internal services on managed machines, Tailscale gives you that without protocol-by-protocol plumbing.
The same trade-off shows up in reverse. Cloudflare’s non-HTTP story requires the device client or protocol-aware routing, which is the part teams most often defer, leaving a legacy VPN running “just for SSH” indefinitely. That leftover path becomes the weakest link, a point covered in Zero Trust access and tunnels instead of VPN ingress.
Policy models
Cloudflare Access combines identity and device conditions in application policies, with Bypass and Service Auth evaluated before the listed Block and Allow policies. The Access policy evaluation guide explains Include, Exclude and Require, why Bypass runs first, and how an earlier decision affects later rules.
Tailscale expresses policy as a tailnet policy file: groups, tags, and grants describing which sources may reach which destinations on which ports. It is a single reviewable document, which is a genuine advantage for audit, and it is bounded by plan tier. The Personal plan allows up to 3 ACL groups, Standard up to 10, and Premium up to 300. On a small tailnet that is invisible; on a large one, group count is a design constraint you hit early.
Device posture
Cloudflare’s posture checks run through its client and are documented per operating system. The coverage is uneven in ways that matter when you write a Require rule against a mixed fleet.
| Posture check | Windows | macOS | Linux | iOS | Android / ChromeOS |
|---|---|---|---|---|---|
| OS version | yes | yes | yes | yes | yes |
| Require WARP | yes | yes | yes | yes | yes |
| Require Gateway | yes | yes | yes | yes | yes |
| Disk encryption | yes | yes | yes | no | no |
| Firewall | yes | yes | no | no | no |
| Antivirus | yes | no | no | no | no |
| Domain joined | yes | no | no | no | no |
| Client certificate | yes | yes | yes | no | no |
| Device serial number | yes | yes | yes | no | no |
| Device UUID | no | no | no | yes | yes |
| File / application check | yes | yes | yes | no | no |
| SentinelOne, Carbon Black | yes | yes | yes | no | no |
Read that table before writing a policy, not after. A Require rule on disk encryption locks out every phone. A firewall check excludes Linux. An antivirus check is Windows-only. This is exactly why posture should be logged in monitor mode before it is enforced: the people it breaks first are usually the ones who did nothing wrong.
Tailscale’s device posture story is plan-gated rather than OS-gated, which is simpler to reason about but coarser. Its pricing page lists basic device posture on every plan, including free Personal, limited to operating system and Tailscale version information. Integrations with MDM, EDR and XDR providers start at Standard, and device geolocation is likewise a paid-plan feature. So the posture question you can actually ask on the free tier is “is this node current”, not “is this endpoint managed and healthy”.
Scale limits and cost
Cloudflare publishes account limits that shape large deployments: 500 Access applications, 1,000 rules per application, 500 reusable policies, 50 domains per application, 1,000 cloudflared tunnels per account with up to 25 active replicas each, 1,000 routes per account (shared with Mesh), 50 Mesh nodes, 50 identity providers, and 50 service tokens. Zero Trust billing is seat-based: a seat is consumed by any Access authentication event, such as a login to an application or to the App Launcher, or by a user’s devices connecting through Gateway. One identity holds one seat no matter how many applications it reaches, which is worth knowing before you size a budget per application. As of October 2026, Cloudflare’s Access plans list a Free plan at $0 with a 50-user limit and Pay-as-you-go at $7 per user per month, paid annually, with no user limit. The Tunnel connection itself has been free since April 2021.
Tailscale’s plan boundaries are stated directly on its pricing page (checked October 2026). Personal is free, with unlimited user devices, up to 6 users, up to 3 ACL groups, up to 50 tagged resources to start, and 1,000 minutes per month for ephemeral resources. Standard is $8 per user per month and adds unlimited users, SCIM provisioning, up to 10 ACL groups and the posture integrations. Premium is $18 per user per month and adds up to 300 ACL groups, 10,000 ephemeral minutes per month, just-in-time access, network flow logs and log streaming.
The shapes differ. Tailscale prices per user with generous device counts, so a small team with many machines does well. Cloudflare prices per seat with high per-account object limits, so a larger organisation publishing many applications to a mixed audience does well. The widest gap is in the middle: a 20-person team has outgrown Tailscale’s 6-user Personal plan and would pay $160 a month on Standard, while the same 20 people fit inside Cloudflare’s 50-user free plan.
Which one fits
Cloudflare Access fits when the workload is mostly internal web applications, when a meaningful share of users are contractors or on unmanaged devices, when a per-request authorization log is a requirement, or when the same platform is already handling DNS and WAF for those hostnames.
Tailscale fits when the workload is arbitrary protocols between managed machines, when you want the least possible intermediary in the data path, when engineers need direct SSH and database access, or when a single reviewable policy file beats a dashboard.
Both together is a real answer and not a cop-out. Publishing customer-facing and contractor-facing web apps through Access while engineers run a tailnet for infrastructure access is a coherent split, because each tool is doing the job its architecture suits.
Whichever way you go, the origin’s inbound ports should end up closed either way. If Cloudflare is the direction, the tunnel setup walkthrough covers getting the first connector running, and the error 1033 guide covers what to check when a tunnel stops answering.
FAQ
is tailscale cheaper than cloudflare zero trust?
For teams of 7 to 50 people, no. Cloudflare’s Free plan covers up to 50 users, while Tailscale’s free Personal plan stops at 6 users and Standard costs $8 per user per month. Above 50 users the list prices are close: Cloudflare Pay-as-you-go is $7 per user per month, paid annually. Prices checked October 2026.
can cloudflare or tailscale see my traffic?
Cloudflare can, by design, for anything it proxies: Access terminates HTTPS at its edge to evaluate and log each request before forwarding it to the origin. Tailscale’s coordination server never holds private keys, and its DERP relays forward WireGuard ciphertext they cannot decrypt, so only the two endpoints see plaintext.
does tailscale work behind cgnat?
Yes. Tailscale uses NAT traversal to connect nodes without open ports, and when no direct path forms it tries a peer relay in your tailnet, then a DERP relay. Cloudflare Tunnel works behind CGNAT too, because cloudflared only dials out on port 7844, the same reason a tunnel beats port forwarding there.
do i need tailscale if i already use cloudflare tunnel?
Not for browser access to web apps, which Tunnel plus Access already covers. Add Tailscale when engineers need direct SSH, database or other non-HTTP access between managed machines. To stay on one vendor, the Cloudflare One Client or Cloudflare Mesh covers that too, but routes it through Cloudflare’s edge rather than peer to peer.