Content
Cloudflare Zero Trust often uses two “on-ramps” that solve different problems:
-
Cloudflare Tunnel (cloudflared) is for publishing services from your network to Cloudflare using outbound-only connections—great when you don’t want (or can’t) open inbound ports. (Cloudflare Docs)
-
Cloudflare WARP is the client on user devices that sends their traffic into Cloudflare’s network so you can apply Zero Trust policies and (optionally) reach private networks/services. (Cloudflare Docs)
Think of it like this:
-
Tunnel = inbound path (service → Cloudflare)
-
WARP = outbound/on-ramp path (user device → Cloudflare)
When combined, you get a clean model: services stay private, users connect through Cloudflare with identity/policy, and your firewall can remain “deny inbound by default”.
What Cloudflare Tunnel is best for (Inbound publishing)
Use Tunnel when you need to expose a service without opening ports
Cloudflare Tunnel runs a lightweight daemon (cloudflared) inside your environment. It creates outbound-only connections to Cloudflare—so you don’t need a publicly routable IP, and you don’t have to open inbound firewall rules just to publish a service. (Cloudflare Docs)
Typical uses:
-
Publish a web app behind NAT / home server
-
Expose a webhook endpoint during development
-
Publish SSH / RDP / internal dashboards safely (with the right Zero Trust controls)
“Published apps” vs non-HTTP services
When you route a public hostname to a Tunnel, Cloudflare can proxy traffic to your private service. For non-HTTP services (some TCP apps), Cloudflare notes you may need cloudflared on the client side for users to connect, depending on the protocol. (Cloudflare Docs)
What Cloudflare WARP is best for (User access + policy + private routing)
Use WARP when you want to control how user devices access the internet and private resources
WARP is a client that forwards DNS + network traffic from the device to Cloudflare, where your Zero Trust policies are applied. (Cloudflare Docs)
Typical uses:
-
Enforce DNS/HTTP/network policies for corporate devices (secure web gateway)
-
Provide “corporate access” to private apps or private IP ranges without a traditional VPN
-
Enable device-based controls (profiles, routing, posture checks in Zero Trust)
Private access patterns: three common architectures
Architecture A — Public app publishing (Tunnel only)
This is the simplest: you want the service reachable from the public internet (but you don’t want to open inbound ports).
Internet User
|
Cloudflare Edge
|
Cloudflare Tunnel
|
cloudflared ---> Private service (HTTP app, etc.)
Why it’s good:
-
Works behind NAT
-
Outbound-only connector from your network (Cloudflare Docs)
When it’s not ideal:
-
If the service is admin-only and shouldn’t be public at all (even behind auth), consider private routing with WARP instead.
Architecture B — Private network access for users (WARP + Private Network Routes via Tunnel)
If you want users to reach private IPs/services (like 10.0.0.0/24, databases, internal APIs) without publishing them publicly, Cloudflare supports Private networks where you install a connector and define routes. (Cloudflare Docs)
WARP client (user laptop)
|
Cloudflare Edge
|
Private network route
|
WARP Connector / cloudflared in your network
|
Private IP service (10.0.0.x)
Cloudflare describes this model as connecting private networks to Cloudflare’s global network using connectors + routes, and it can expose both HTTP and non-HTTP resources privately. (Cloudflare Docs)
Architecture C — “Together”: public app + private admin access (Tunnel + WARP)
This is a very practical split:
-
Public-facing: publish the main app via Tunnel (inbound publishing)
-
Private-only: admins/devs access internal panels (DB, Grafana, SSH, admin routes) through WARP + private routing
(1) Public users:
Internet -> Cloudflare -> Tunnel -> app.example.com
(2) Staff users:
WARP -> Cloudflare -> Private route -> internal services (10.0.0.0/24)
This keeps your “real control surfaces” off the public internet while still letting the main app be reachable.
A quick “which should I use?” checklist
Use Cloudflare Tunnel when:
-
You need to publish a service (especially HTTP) from a private network to Cloudflare
-
You want no inbound ports and outbound-only connectivity (Cloudflare Docs)
Use WARP when:
-
You need user devices to on-ramp into Cloudflare for policy enforcement
-
You want users to access private networks/services through Zero Trust routing (Cloudflare Docs)
Use both together when:
-
You want a clean separation: public app publishing + private admin/internal access
-
You’re building a Zero Trust “VPN replacement” where services stay private and users connect via WARP (Cloudflare Docs)
One more option: WARP-to-WARP private networking (device-to-device)
If you don’t have a “site network” to connect, Cloudflare also supports creating a private network between WARP devices (device-to-device). (Cloudflare Docs)
This can be useful for small teams or personal setups where both endpoints can run WARP.
If you tell me your target scenario (home server, small team, or company network) and what you’re hosting (web app, SSH, database, Grafana, etc.), I can propose a concrete architecture with:
-
what should be published (Tunnel) vs kept private (WARP routes)
-
a clean hostname scheme (public vs internal)
-
the “minimum exposure” firewall posture (outbound ports only) based on Cloudflare’s docs. (Cloudflare Docs)