Cloudflare Tunnel 将流量从 Cloudflare 网络路由到在 cloudflared 后面运行的服务。当您发布应用程序时,您会将公共主机名映射到本地服务 — 例如,将 app.example.com 映射到 http://localhost:8080 — 然后 Cloudflare 在将请求转发到您的源站之前应用 CDN 缓存、WAF 和 DDoS 保护。
已发布应用程序是在您的隧道配置中定义的主机名到服务的映射。每个映射都告诉 cloudflared 哪个本地服务应该接收给定公共主机名的流量。
您可以在单个隧道上发布多个应用程序。对于每个应用程序,指定:
- 公共主机名 — 用户访问的域或子域(例如
app.example.com)。 - 服务 — 应用程序运行的本地地址或套接字(例如
http://localhost:8080)。
当您通过仪表板添加路由时,Cloudflare 会自动创建一条 DNS 记录,将主机名指向您的隧道子域(<UUID>.cfargotunnel.com)。
下表列出了您可以路由到公共主机名的服务类型。非 HTTP 服务需要在客户端安装 cloudflared,最终用户才能进行连接。
| 服务类型 | 描述 | service 示例值 |
|---|---|---|
| HTTP | 通过 HTTP 将传入的 HTTPS 请求代理到您的本地 Web 服务。 | http://localhost:8000 |
| HTTPS | 直接将传入的 HTTPS 请求代理到您的本地 Web 服务。您可以为自签名证书禁用 TLS 验证。 | https://localhost:8000 |
| UNIX | 与 HTTP 相同,但使用 Unix 套接字(socket)。 | unix:/home/production/echo.sock |
| UNIX + TLS | 与 HTTPS 相同,但使用 Unix 套接字(socket)。 | unix+tls:/home/production/echo.sock |
| TCP | 通过 WebSocket 连接流传输 TCP。最终用户运行 cloudflared access tcp 来进行连接。对于长连接,请改用客户端到隧道(Client-to-Tunnel)。 |
tcp://localhost:2222 |
| SSH | 通过 WebSocket 连接流传输 SSH。最终用户运行 cloudflared access ssh 来进行连接。对于长连接,请改用客户端到隧道(Client-to-Tunnel)。 |
ssh://localhost:22 |
| RDP | 通过 WebSocket 连接流传输 RDP。有关更多信息,请参阅使用客户端 cloudflared 连接到 RDP。 | rdp://localhost:3389 |
| SMB | 通过 WebSocket 连接流传输 SMB。有关更多信息,请参阅使用客户端 cloudflared 连接到 SMB。 | smb://localhost:445 |
| HTTP_STATUS | 使用固定的 HTTP 状态码响应所有请求。 | http_status:404 |
| BASTION | 允许 cloudflared 用作堡垒机(jump host),从而提供对任何本地地址的访问。 |
bastion |
| HELLO_WORLD | 用于验证您的 Cloudflare Tunnel 连接的测试服务器(仅适用于本地管理的隧道)。 | hello_world |
当服务值为 IPv6 字面量时,请按照 RFC 3986 ↗ 的定义将地址用方括号括起来。方括号是必需的,以防止地址中的 : 字符与端口分隔符混淆。
| 服务类型 | service 示例值 |
|---|---|
| HTTP | http://[2001:db8::1]:8000 |
| HTTPS | https://[2001:db8::1]:443 |
| TCP | tcp://[2001:db8::1]:2222 |
| SSH | ssh://[2001:db8::1]:22 |
| RDP | rdp://[2001:db8::1]:3389 |
主机名和 IPv4 地址不需要括号——http://localhost:8000 和 http://192.0.2.1:8000 保持原样即可。
当您创建隧道时,Cloudflare 会在 <UUID>.cfargotunnel.com 生成一个子域名。您需要将 CNAME 记录指向该子域名,以将流量从您的主机名路由到隧道。
该 cfargotunnel.com 子域名仅为相同 Cloudflare 账户中的 DNS 记录代理流量。即使有人发现了您的隧道 UUID,他们也无法在另一个账户中创建 DNS 记录来代理其流量。
要为 Cloudflare Tunnel 创建 DNS 记录:
-
登录到 Cloudflare 仪表板 ↗并转到您域名的 DNS Records(DNS 记录)。
Go to Records ↗ -
选择 Add record(添加记录)。
-
输入以下值:
- Type(类型):CNAME
- Name(名称):应用程序的子域名
- Target(目标):
<UUID>.cfargotunnel.com
-
选择 Save(保存)。

对于本地管理的隧道,运行以下命令以创建指向您隧道子域名的 CNAME 记录:
cloudflared tunnel route dns <UUID or NAME> www.app.com这将创建 CNAME 记录,但在隧道运行之前不会代理流量。
DNS 记录和隧道是独立的。您可以创建指向未运行隧道的 DNS 记录。如果隧道停止,DNS 记录不会被删除 — 访问者将看到 1016 错误。
您还可以创建多个指向相同隧道子域名的 DNS 记录。如果您将来自多个主机名的流量路由到多个服务,请为每个主机名创建一个 CNAME 条目。所有条目都共享相同的目标。
使用公共负载平衡器在运行已发布应用程序的服务器之间分配流量。这提供了跨区域的基于运行状况检查的故障转移和智能流量调度。
graph LR
accTitle: Load balancing traffic to applications behind Cloudflare Tunnel
A[Internet] --> C{Cloudflare <br> Load Balancer}
C -- Tunnel 1 --> cf1
C -- Tunnel 2 --> cf2
subgraph F[Data center 2]
cf2[cloudflared]
S3[App server]
S4[App server]
cf2-->S3
cf2-->S4
end
subgraph E[Data center 1]
cf1[cloudflared]
S1[App server]
S2[App server]
cf1-->S1
cf1-->S2
end
在同一隧道 UUID 上运行多个 cloudflared 副本提供基本冗余 — 如果一台主机出现故障,其他副本将继续处理流量。但是,负载平衡器将具有相同隧道 UUID 的所有副本视为单个端点。
对于精细化流量调度和会话亲和性,使用不同的隧道 UUID 连接每台主机,以便负载平衡器可以独立寻址它们。
要为已发布的 Cloudflare Tunnel 应用程序创建负载均衡器:
-
在 Cloudflare 仪表板中,转到 **Load Balancing(负载均衡)**页面。
Go to Load Balancing ↗ -
选择 Create load balancer(创建负载均衡器),然后选择 Public load balancer(公共负载均衡器)。
-
在 **Select website(选择网站)**下,选择您已发布应用程序路由的域名。
-
在 **Hostname(主机名)**页面上,输入负载均衡器的主机名(例如,
lb.example.com)。 -
在 **Pools(池)**页面上,选择 **Create a pool(创建池)**并输入描述性名称。
-
添加具有以下值的 Tunnel 端点:
- Endpoint Name(端点名称):运行应用程序的服务器名称
- Endpoint Address(端点地址):
<UUID>.cfargotunnel.com(在 the [Cloudflare dashboard](https://dash.cloudflare.com/) under **Networking(网络)** > **Tunnels(隧道)** 中查找 Tunnel ID) - Header value(标头值):您已发布应用程序路由的主机名(例如,
app.example.com) - Weight(权重):
1(如果只有一个端点)
-
选择 Fallback pool(回退池)。有关路由选项,请参阅流量分流策略。
-
(推荐)在 **Monitors(监视器)**页面上,向端点附加监视器。对于 HTTP 或 HTTPS 应用程序,请创建一个 HTTPS 监视器:
- Type(类型):HTTPS
- Path(路径):
/ - Port(端口):
443 - Expected Code(s)(预期代码):
200 - Header Name(标头名称):
Host - Value(值):
app.example.com
-
保存并部署负载均衡器。
要进行测试,请使用负载均衡器主机名(lb.example.com)访问您的应用程序。
监控 TCP 隧道源站
Tunnel 端点不支持 TCP 监视器。相反,您应该在 cloudflared 主机上创建健康检查端点,并使用 HTTPS 监视器。例如,您可以使用 cloudflared 返回固定的 HTTP 状态响应:
- 为健康检查添加已发布应用程序路由:
- Hostname(主机名):
health-check.example.com - Service Type(服务类型):HTTP_STATUS
- HTTP Status Code(HTTP 状态码):
200
- Hostname(主机名):
- 按照以下设置创建监视器:
- Type:HTTPS
- Path:
/ - Port:
443 - Expected Code(s)(预期状态码):
200 - Header Name(标头名称):
Host - Value(值):
health-check.example.com
此监视器验证 cloudflared 是否可达。它不会检查上游服务是否正在接受请求。
本地连接首选项
如果您发现不同位置的端点之间存在流量不均衡,您可能需要调整负载均衡器配置。
Cloudflare 使用 Anycast 路由 ↗将最终用户请求定向到最近的数据中心。cloudflared 更倾向于使用同一数据中心内的连接来提供服务,这可能会影响流量在端点之间的分配方式。
如果您在同一个 Tunnel UUID 上运行 cloudflared 副本,请考虑切换到独立的 Tunnel,以便对流量分流进行更细粒度的控制。
已发布的应用程序将继承其主机名的 Cloudflare 设置,包括缓存规则、WAF 规则和其他 Rules 配置。您可以在 Cloudflare 仪表板 ↗中为每个主机名更改这些设置。
如果您使用负载均衡器,设置将应用于负载均衡器主机名。