21 min read

Cloudflare Tunnel Alternative: When You Need TCP, UDP, or No Domain

But it has a specific set of hard limitations that regularly send users looking for alternatives: there is no public UDP support, file uploads are capped at 100MB, a custom domain is required for persistent URLs, and the Terms of Service create real ambiguity for high-bandwidth use cases like Jellyfin video streaming and Nextcloud file sharing.

Cloudflare Tunnel · Tunnel Alternatives · Self-Hosting · 2026

Cloudflare Tunnel Alternative: When You Need TCP, UDP, or No Domain

Cloudflare Tunnel is genuinely excellent for what it does: exposing HTTP and HTTPS services to the internet for free, with DDoS protection and no port forwarding required. Millions of self-hosters use it. But it has a specific set of hard limitations that regularly send users looking for alternatives: there is no public UDP support, file uploads are capped at 100MB, a custom domain is required for persistent URLs, and the Terms of Service create real ambiguity for high-bandwidth use cases like Jellyfin video streaming and Nextcloud file sharing. This guide is written for people who are already using Cloudflare Tunnel and have hit one of these walls. It explains exactly what each limitation is, why it exists, which services are most affected, and what alternatives solve the problem without sacrificing what makes Cloudflare Tunnel attractive in the first place.

🔧 UDP · TCP · No Domain Needed 🏠 Self-Hosting · WireGuard · Game Servers 📁 Nextcloud · Jellyfin · Vaultwarden

What Cloudflare Tunnel Does Well

Before covering the limitations, it is worth being direct about where Cloudflare Tunnel excels. It is completely free. There are no bandwidth costs, no per-tunnel fees, and no hidden charges for the core HTTP/HTTPS tunneling functionality. It routes traffic through Cloudflare's global network, which means every tunneled service automatically gets DDoS mitigation, hides your home IP address from visitors, and benefits from Cloudflare's CDN caching for static assets.

The setup is straightforward: install the cloudflared daemon, connect it to your Cloudflare account, and create a public hostname mapping. For developers exposing a web app or API during testing, or for home server operators running a single HTTP service with a domain already on Cloudflare, it covers the requirements completely.

The limitations only surface when your requirements go beyond HTTP, when you need a persistent URL without owning a domain, when you want to expose services like WireGuard or game servers that use UDP, or when file sizes routinely exceed 100MB. Those are the scenarios this guide addresses.

The Five Limitations That Send Users Looking for Alternatives

1. No Public UDP Support

Cloudflare Tunnel's public hostname feature only proxies HTTP and HTTPS traffic. UDP is not available for public-facing services. This is confirmed by Cloudflare's own community staff and documented in the cloudflared GitHub repository, where a feature request for public UDP support (issue #964) has been open since 2022 with no resolution.

The nuance here matters: Cloudflare does support UDP in its Zero Trust private network mode, but only when every connecting client also has the Cloudflare WARP client installed and logged into your Zero Trust organization. For any service where you want anonymous public users to connect (a WireGuard server, a game server, a TURN server), this is not feasible. You cannot ask users to install WARP just to connect to your Minecraft server.

Cloudflare Spectrum offers UDP, but it is an Enterprise-only paid product

Cloudflare Spectrum does support arbitrary TCP and UDP proxying and is sometimes suggested as a workaround for the UDP limitation. However, Spectrum is only available on Pro plans and above, and UDP support within Spectrum requires an Enterprise contract. It is not part of the free Cloudflare Tunnel product. For home server operators on the free tier, UDP support from Cloudflare is not available.

Services that require public UDP and therefore cannot use Cloudflare Tunnel's public hostnames:

ServiceProtocolWhy UDP is required
WireGuard VPNUDP 51820WireGuard exclusively uses UDP by design. It cannot run over TCP.
Minecraft BedrockUDP 19132Bedrock edition uses UDP for game traffic. Java edition uses TCP and works with CF Tunnel.
CS2 / Rust / Valheim game serversUDP (various ports)Game server query and game traffic use UDP.
Mumble (VoIP)UDP 64738Low-latency audio requires UDP. TCP fallback exists but audio quality degrades severely.
RTSP video streamsUDPReal-time video streaming protocols use UDP for low latency.
SIP / VoIPUDP 5060Session Initiation Protocol is UDP-based.

2. The 100MB Upload Limit

Cloudflare's free and Pro plans enforce a 100MB maximum request body size. This limit applies to all traffic proxied through Cloudflare's network, including Cloudflare Tunnel. When a user attempts to upload a file larger than 100MB through a tunneled service, Cloudflare returns an HTTP 413 (Request Entity Too Large) error before the file reaches your server.

This is not a bug or a misconfiguration. It is an intentional infrastructure limit documented in Cloudflare's connection limits reference, and it reflects the fact that Cloudflare's network was built primarily for web page delivery, not large file transfers.

The 100MB limit creates real problems for several popular self-hosted services:

☁️ Nextcloud Nextcloud allows uploading files of any size (limited only by your disk). Uploading a 500MB video or a 2GB backup archive fails with HTTP 413 through a Cloudflare Tunnel. The Immich photo backup app, which has the same issue, is one of the most commonly reported cases in Cloudflare community forums.
📸 Immich / Photo Backup Immich backs up phone photos to a self-hosted server. Modern smartphone photos are routinely 10 to 50MB each in RAW or ProRAW format, but video clips and burst shots can easily exceed 100MB. The backup process breaks silently.
🔐 Vaultwarden File Attachments Vaultwarden (self-hosted Bitwarden) supports file attachments in vault items. Attachments over 100MB fail to upload through CF Tunnel. Most users never hit this with password databases, but it matters for anyone using the vault to store documents.
📁 Seafile / File Sharing Any self-hosted file sharing service designed to handle large files runs into this limit. The 100MB cap makes Cloudflare Tunnel unsuitable as the primary access method for file servers.

The local DNS workaround and why it is not always practical

The most commonly cited workaround for the 100MB limit is to use local DNS: configure a DNS entry on your router or Pi-hole that resolves your service's domain directly to the local IP instead of Cloudflare's servers, so that uploads from inside your home network bypass the tunnel entirely. This works for local uploads but does nothing for uploads from outside your home network. If you are backing up your phone to Nextcloud while connected to mobile data, the traffic still routes through Cloudflare and hits the 100MB limit. The tunnel is still required for external access.

3. A Custom Domain Is Required for Persistent URLs

Cloudflare Tunnel requires a domain registered with Cloudflare DNS to create a persistent public hostname. Without a custom domain, the only option is Cloudflare's Try Cloudflare (Quick Tunnels), which generates a random subdomain on trycloudflare.com that changes on every restart and is explicitly documented as not suitable for production use.

This creates a real barrier for users who want to expose a home service without spending money on a domain or without going through the DNS configuration process. It also creates a dependency: if you let your domain registration lapse, your tunnels stop working immediately.

RequirementCloudflare TunnelLocaltonet
Persistent public URLRequires a domain on Cloudflare DNSIncluded: subdomain on localto.net provided free, custom domain optional
HTTPS certificateManaged by Cloudflare (requires domain)Provided automatically for HTTP tunnels
URL stability on restartStable (with domain configured)Stable (custom subdomain persists)
Works without any domain purchaseOnly with random trycloudflare.com URLs that change on restartYes, permanently stable subdomain included

4. Terms of Service Grey Area for High-Bandwidth Use Cases

Cloudflare's CDN Terms of Service have historically restricted using its network for serving video and large file content that is not hosted on Cloudflare's own storage products (R2, Stream, Images). The ToS were updated in late 2025 to remove the old HTML vs non-HTML restriction from the general agreement, but the CDN-specific terms still restrict serving video and large files hosted outside of Cloudflare unless you use Cloudflare's paid storage products.

In practice, Cloudflare Tunnel routes all public HTTP traffic through Cloudflare's CDN layer. This creates a grey area for several common self-hosting use cases:

Jellyfin and Plex video streaming through CF Tunnel

Streaming your personal video library through a Cloudflare Tunnel is technically possible and works initially. The ToS question is whether this counts as "serving video content" through Cloudflare's CDN. Cloudflare community staff give inconsistent answers on this point: some say private streaming to personal devices is fine, others cite the CDN terms as prohibitive. Multiple community threads from 2025 show users receiving account warnings after heavy video streaming traffic through tunnels.

The practical reality is that Cloudflare is unlikely to terminate personal accounts for occasional private Jellyfin or Plex streaming. But "unlikely to act" is different from "permitted." For a media server that is a core part of your home infrastructure, building on a ToS grey area introduces risk that does not exist with a dedicated tunnel service that explicitly supports this use case.

Nextcloud and file sharing through CF Tunnel

File sharing (as opposed to file syncing to your own devices) falls under the CDN ToS restriction on file distribution. Sharing a Nextcloud link with a friend so they can download a 2GB file would technically violate the terms. Again, enforcement is inconsistent and personal-scale use rarely triggers action, but it is a legitimate consideration for anyone building a reliable self-hosted infrastructure.

5. Single Point of Failure on Cloudflare Infrastructure

All Cloudflare Tunnel traffic routes through Cloudflare's global network. When Cloudflare experiences an outage, every service behind every Cloudflare Tunnel goes down simultaneously. Cloudflare has had several notable outages: in June 2022 a routing configuration error took down 19 of its data centers, affecting a significant portion of internet traffic globally. In August 2023, a Cloudflare Access outage disrupted tunnels using Zero Trust authentication. In November 2023, a BGP hijacking incident briefly disrupted Cloudflare's network.

For home server operators running personal tools, a temporary Cloudflare outage is an inconvenience. For anyone whose self-hosted services support a small business, clients, or family members depending on reliable access, the single-point-of-failure nature of any single cloud tunnel provider is a legitimate architectural concern.

When Cloudflare Tunnel Is Still the Right Choice

Despite the limitations, Cloudflare Tunnel remains the best option for a specific set of use cases. If your situation matches the following, you do not need an alternative:

Cloudflare Tunnel is ideal when you:
  • Only expose HTTP/HTTPS web services (no UDP, no raw TCP)
  • Already have a domain registered with Cloudflare
  • Never upload files larger than 100MB through the tunnel
  • Primarily use the tunnel for web app access rather than media streaming
  • Want built-in DDoS protection without any additional configuration
  • Need Zero Trust access control (Cloudflare Access) for team access
  • Have a zero budget and the free tier restrictions are acceptable
You need an alternative when you:
  • Need to expose WireGuard, a game server, or any UDP-based service publicly
  • Upload files larger than 100MB through the tunnel (Nextcloud, Immich, backups)
  • Do not own a domain and need a persistent public URL
  • Stream video from Jellyfin or Plex to external devices regularly
  • Need raw TCP tunnels for non-HTTP protocols (database access, custom protocols)
  • Want a tunnel for services that mix HTTP and UDP (e.g., a game server with a web admin panel)

What to Look for in a Cloudflare Tunnel Alternative

The right alternative depends entirely on which Cloudflare Tunnel limitation you are hitting. There is no universal "best" replacement because different limitations call for different solutions. Here are the criteria that matter:

Your Limitation What You Need What to Verify Before Choosing
No public UDP support A tunnel service with native public UDP tunnels Confirm UDP is available for public endpoints (not just private networks requiring a client). Check whether UDP is available on the free tier or only on paid plans.
100MB upload limit A tunnel with no request body size limit Confirm there is no upload size cap in the tunnel service's documentation or terms. Test with a large file before committing to it as your primary solution.
Domain requirement A service that provides a stable subdomain without a custom domain Verify that the provided subdomain is persistent (does not change on restart) and that HTTPS is included automatically.
ToS concerns for video/files A service that explicitly permits media streaming and file transfer Read the terms of service. Look for explicit permission or the absence of content-type restrictions. Dedicated tunnel services built for self-hosting are typically unrestricted.
Single point of failure Multi-region or distributed infrastructure Check whether the service has multiple server regions and what happens to tunnels during a single data center outage.

How Localtonet Addresses Each Cloudflare Tunnel Limitation

Localtonet is a hosted tunnel service built specifically for self-hosting use cases. It was designed to cover the protocol gaps and use case restrictions that Cloudflare Tunnel cannot address. Here is how it maps to each of the five limitations:

UDP support: Native public UDP tunnels

Solves UDP limitation

Localtonet supports native UDP tunnels for public endpoints with no client software required on the connecting device. A WireGuard server behind CGNAT gets a public address:port endpoint that any standard WireGuard client can connect to. A Minecraft Bedrock server, a CS2 server, or a Valheim server each gets a public UDP endpoint. The connection works identically to a server with a real public IP, from the client's perspective.

# Create a UDP tunnel for WireGuard (port 51820):
# In the Localtonet dashboard: Tunnel > UDP/TCP
# Protocol: UDP, IP: 127.0.0.1, Port: 51820
# Result: public endpoint at tunnel.localto.net:XXXXX
# Use this endpoint in WireGuard client configs instead of home IP

No upload size limit

Solves 100MB limitation

Localtonet HTTP tunnels impose no request body size limit. Uploading a 10GB file to Nextcloud through a Localtonet tunnel works without modification. The only limits are your connection speed and your server's disk space. This is the most common reason Nextcloud and Immich users switch from Cloudflare Tunnel.

No domain required

Solves domain requirement

Every Localtonet HTTP tunnel gets a stable subdomain on localto.net (e.g. https://myservice.localto.net) that persists across restarts without any domain purchase. HTTPS is provided automatically. If you want a custom domain, you can configure one, but it is not required for a permanent public URL.

No content-type ToS restrictions

Solves ToS grey area

Localtonet's terms of service do not restrict content types. Streaming video from Jellyfin or Plex, sharing large files through Nextcloud, or running any other legitimate self-hosted service is explicitly permitted. There is no CDN layer with content restrictions, because Localtonet is a dedicated tunnel service rather than a CDN repurposed for tunneling.

Multi-region infrastructure

Reduces single-point-of-failure risk

Localtonet operates 16+ server locations globally. Tunnels can be connected through different regions, reducing the risk of a single infrastructure outage taking down all your services simultaneously.

Migrating from Cloudflare Tunnel to Localtonet

If you are running services behind Cloudflare Tunnel today and want to switch some or all of them to Localtonet, the process is straightforward. You do not need to take down existing Cloudflare Tunnel connections during testing: run both in parallel, verify the Localtonet tunnel works for each service, then update your DNS or share the new URL.

1

Install Localtonet on your server

# Linux (Ubuntu, Debian, Raspberry Pi OS):
curl -fsSL https://localtonet.com/install.sh | sh

# Verify:
localtonet --version
2

Authenticate

Register at localtonet.com, go to Dashboard → My Tokens, and authenticate:

localtonet --authtoken YOUR_TOKEN_HERE
3

Create tunnels to match your existing CF Tunnel services

For each service you want to migrate, create a corresponding Localtonet tunnel. The mapping is direct:

CF Tunnel typeLocaltonet equivalentDashboard path
HTTP/HTTPS public hostnameHTTP tunnellocaltonet.com/tunnel/http
TCP applicationTCP tunnellocaltonet.com/tunnel/udptcp
(Not available publicly in CF)UDP tunnellocaltonet.com/tunnel/udptcp
4

Test each service through the Localtonet URL

Before updating any DNS records or sharing new URLs, verify each service works correctly through the Localtonet tunnel. For Nextcloud, test uploading a file larger than 100MB. For WireGuard, test connecting a client using the new endpoint.

5

Update DNS or share new URLs

If you use a custom domain: update the DNS record to point to the Localtonet endpoint. If you share direct URLs: distribute the new https://yourservice.localto.net URL to users. CF Tunnel can remain running during this transition so no downtime occurs.

6

Run Localtonet as a system service

sudo localtonet --install-service --authtoken YOUR_TOKEN_HERE
sudo localtonet --start-service --authtoken YOUR_TOKEN_HERE

The tunnel starts automatically on every reboot.

Cloudflare Tunnel vs Localtonet: Side-by-Side

Feature Cloudflare Tunnel Localtonet
HTTP/HTTPS tunnels Yes Yes
Raw TCP tunnels Limited (via private network with WARP client on connecting device) Yes, public (no client required on connecting device)
Public UDP tunnels No (only via private WARP network, requires client installation) Yes, fully public
Upload size limit 100MB maximum (enforced by Cloudflare proxy layer) No limit
Domain requirement for persistent URL Yes (domain on Cloudflare DNS required) No (localto.net subdomain provided)
HTTPS automatic Yes (requires domain) Yes (included with HTTP tunnels)
DDoS protection Yes (Cloudflare network) Infrastructure-level protection
Hides home IP Yes Yes
Works behind CGNAT Yes Yes
WireGuard VPN server exposure Not possible (no public UDP) Yes (UDP tunnel)
Minecraft Bedrock / game servers Not possible publicly (requires WARP on every client) Yes (UDP tunnel)
Jellyfin / Plex streaming Technically works, ToS grey area for high bandwidth use Yes, explicitly permitted
Nextcloud large file upload Fails for files over 100MB Works without limits
Price Free (HTTP/HTTPS only) Free tier + $2/tunnel/month (paid tunnels)
Infrastructure redundancy Single provider (Cloudflare), global outages affect all tunnels 16+ server locations

Service-Specific: Common Migrations

Nextcloud: Removing the 100MB upload limit

Nextcloud

If you run Nextcloud behind Cloudflare Tunnel, the 100MB limit blocks any file upload larger than 100MB with an HTTP 413 error, regardless of what you have configured in Nextcloud's php.ini settings. Creating a Localtonet HTTP tunnel pointing to your Nextcloud port removes this restriction entirely. Update the trusted_domains and overwriteprotocol settings in Nextcloud's config.php to use the new Localtonet URL:

docker exec --user www-data nextcloud-app php occ config:system:set trusted_domains 1 --value="mycloud.localto.net"
docker exec --user www-data nextcloud-app php occ config:system:set overwritehost --value="mycloud.localto.net"
docker exec --user www-data nextcloud-app php occ config:system:set overwriteprotocol --value="https"

WireGuard: Getting a public UDP endpoint

WireGuard

WireGuard uses UDP exclusively and Cloudflare Tunnel cannot expose it publicly. Create a Localtonet UDP tunnel pointing to your WireGuard port (default UDP 51820). The Localtonet dashboard shows the public endpoint address and port. Update the Endpoint line in every WireGuard client configuration file to use the Localtonet address:

# In each WireGuard client config, change:
# Endpoint = home.ip.address:51820
# To:
Endpoint = tunnel.localto.net:ASSIGNED_PORT

Regenerate QR codes for mobile clients after this change. The tunnel carries WireGuard's encrypted UDP packets transparently.

Jellyfin: Streaming without ToS concerns

Jellyfin

Jellyfin is an HTTP-based service that works with Cloudflare Tunnel technically, but heavy streaming use falls into the ToS grey area. A Localtonet HTTP tunnel to your Jellyfin port (default 8096) provides the same HTTPS access with no content restrictions. Set the Jellyfin public URL in Dashboard → Networking → External domain to your Localtonet URL so that clients generate correct streaming links.

Frequently Asked Questions

Can I use Cloudflare Tunnel for WireGuard?

No, not in a way that works with standard WireGuard clients. Cloudflare Tunnel does not support public UDP endpoints. WireGuard exclusively uses UDP and cannot run over TCP. The only Cloudflare path to reach a WireGuard-like connection is through Cloudflare WARP (which itself uses a WireGuard-based protocol internally), but that requires every client to install the WARP application and authenticate with your Zero Trust organization. Standard WireGuard clients cannot connect through a Cloudflare Tunnel. For exposing a WireGuard server publicly without port forwarding, a UDP tunnel service like Localtonet is required.

Is there a way to increase the Cloudflare Tunnel upload limit beyond 100MB?

Yes, on paid Cloudflare plans. The 100MB limit applies to the free plan. The Pro plan increases it to 100MB (same), Business to 200MB, and Enterprise to 500MB. There is also an option to increase the limit further on Enterprise via a custom configuration. For the free plan, there is no way to exceed 100MB through the Cloudflare proxy layer. The local DNS workaround (routing internal traffic directly to the server's local IP, bypassing the tunnel) only helps for uploads from inside your home network, not from external devices.

Does Cloudflare Tunnel work without a domain?

Only with Quick Tunnels (trycloudflare.com). Running cloudflared tunnel --url http://localhost:3000 gives you a random subdomain on trycloudflare.com, but this URL changes every time you restart the tunnel. It is explicitly documented by Cloudflare as intended only for temporary testing and development, not production use. For a persistent public URL, a domain registered with Cloudflare DNS is required. Localtonet provides a stable persistent subdomain on localto.net without requiring a custom domain purchase.

Can I use both Cloudflare Tunnel and Localtonet at the same time?

Yes. They are independent and do not conflict. A common setup is to keep Cloudflare Tunnel for HTTP services where its DDoS protection and CDN features are valuable (for example, a web app or API), while using Localtonet for services that require UDP (WireGuard), have no upload size limits (Nextcloud), or do not have a domain (a quick local service you want to share). Both daemons run simultaneously on the same machine without interference.

Is Jellyfin streaming through Cloudflare Tunnel against the Terms of Service?

This is genuinely contested territory, and Cloudflare community staff have given conflicting answers. The CDN Service-Specific Terms restrict using the CDN to serve video and large files hosted outside Cloudflare's own storage products (R2, Stream, Images). Since Cloudflare Tunnel routes public traffic through the CDN layer, high-bandwidth video streaming technically falls under this restriction. Cloudflare rarely enforces this against small personal deployments, but enforcement is at their discretion. Users who want certainty should use a tunnel service whose terms explicitly permit media streaming, such as Localtonet.

Need UDP, No Upload Limits, or No Domain?

Localtonet covers the use cases where Cloudflare Tunnel stops: public UDP for WireGuard and game servers, no 100MB upload cap for Nextcloud and Immich, and a stable HTTPS URL without buying a domain. Works behind CGNAT. Free to start.

Try Localtonet Free →

Localtonet is a secure multi-protocol tunneling and proxy platform designed to expose localhost, devices, private services, and AI agents to the public internet supporting HTTP/HTTPS tunnels, TCP/UDP forwarding, mobile proxy infrastructure, file server publishing, latency-optimized game connectivity, and developer-ready AI agent endpoint exposure from a single unified control plane.

support