跳转到内容
搜索文档

路由

最后更新 查看 MarkdownAgent 设置

Cloudflare Tunnel 将流量从 Cloudflare 网络路由到在 cloudflared 后面运行的服务。当您发布应用程序时,您会将公共主机名映射到本地服务 — 例如,将 app.example.com 映射到 http://localhost:8080 — 然后 Cloudflare 在将请求转发到您的源站之前应用 CDN 缓存、WAF 和 DDoS 保护。

为了可靠性和故障转移,来自 cloudflared 的多个出站连接分布在各个 Cloudflare 数据中心中。

已发布的应用程序

已发布应用程序是在您的隧道配置中定义的主机名到服务的映射。每个映射都告诉 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 服务地址

当服务值为 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:8000http://192.0.2.1:8000 保持原样即可。

DNS 记录

当您创建隧道时,Cloudflare 会在 <UUID>.cfargotunnel.com 生成一个子域名。您需要将 CNAME 记录指向该子域名,以将流量从您的主机名路由到隧道。

cfargotunnel.com 子域名仅为相同 Cloudflare 账户中的 DNS 记录代理流量。即使有人发现了您的隧道 UUID,他们也无法在另一个账户中创建 DNS 记录来代理其流量。

创建 DNS 记录

要为 Cloudflare Tunnel 创建 DNS 记录:

  1. 登录到 Cloudflare 仪表板并转到您域名的 DNS Records(DNS 记录)

    Go to Records ↗
  2. 选择 Add record(添加记录)

  3. 输入以下值:

    • Type(类型)CNAME
    • Name(名称):应用程序的子域名
    • Target(目标)<UUID>.cfargotunnel.com
  4. 选择 Save(保存)

为创建新 CNAME 记录而填写的字段示例。

对于本地管理的隧道,运行以下命令以创建指向您隧道子域名的 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 应用程序创建负载均衡器:

  1. 在 Cloudflare 仪表板中,转到 **Load Balancing(负载均衡)**页面。

    Go to Load Balancing ↗
  2. 选择 Create load balancer(创建负载均衡器),然后选择 Public load balancer(公共负载均衡器)

  3. 在 **Select website(选择网站)**下,选择您已发布应用程序路由的域名。

  4. 在 **Hostname(主机名)**页面上,输入负载均衡器的主机名(例如,lb.example.com)。

  5. 在 **Pools(池)**页面上,选择 **Create a pool(创建池)**并输入描述性名称。

  6. 添加具有以下值的 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(如果只有一个端点)
  7. 选择 Fallback pool(回退池)。有关路由选项,请参阅流量分流策略

  8. (推荐)在 **Monitors(监视器)**页面上,向端点附加监视器。对于 HTTP 或 HTTPS 应用程序,请创建一个 HTTPS 监视器:

    • Type(类型)HTTPS
    • Path(路径)/
    • Port(端口)443
    • Expected Code(s)(预期代码)200
    • Header Name(标头名称)Host
    • Value(值)app.example.com
  9. 保存并部署负载均衡器。

要进行测试,请使用负载均衡器主机名(lb.example.com)访问您的应用程序。

监控 TCP 隧道源站

Tunnel 端点不支持 TCP 监视器。相反,您应该在 cloudflared 主机上创建健康检查端点,并使用 HTTPS 监视器。例如,您可以使用 cloudflared 返回固定的 HTTP 状态响应:

  1. 为健康检查添加已发布应用程序路由
    • Hostname(主机名)health-check.example.com
    • Service Type(服务类型)HTTP_STATUS
    • HTTP Status Code(HTTP 状态码)200
  2. 按照以下设置创建监视器
    • TypeHTTPS
    • Path/
    • Port443
    • Expected Code(s)(预期状态码)200
    • Header Name(标头名称)Host
    • Value(值)health-check.example.com

此监视器验证 cloudflared 是否可达。它不会检查上游服务是否正在接受请求。

本地连接首选项

如果您发现不同位置的端点之间存在流量不均衡,您可能需要调整负载均衡器配置。

Cloudflare 使用 Anycast 路由将最终用户请求定向到最近的数据中心。cloudflared 更倾向于使用同一数据中心内的连接来提供服务,这可能会影响流量在端点之间的分配方式。

如果您在同一个 Tunnel UUID 上运行 cloudflared 副本,请考虑切换到独立的 Tunnel,以便对流量分流进行更细粒度的控制。

Cloudflare 设置

已发布的应用程序将继承其主机名的 Cloudflare 设置,包括缓存规则WAF 规则和其他 Rules 配置。您可以在 Cloudflare 仪表板中为每个主机名更改这些设置。

如果您使用负载均衡器,设置将应用于负载均衡器主机名。

这篇文档对您有帮助吗?