跳转到内容
本站为社区维护的非官方中文翻译,与 Cloudflare, Inc. 无关联。本站不提供账户登录,请勿在任何非官方站点输入您的 Cloudflare 账户信息。官方文档:developers.cloudflare.com

路由

最后更新 查看 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)。

已发布应用程序限制

单个远程管理隧道大约支持 5,000–10,000 个已发布应用程序。此限制取决于隧道配置的大小,最大为 1 MB。

隧道配置是您在仪表板中或通过 API 添加已发布应用程序时,Cloudflare 为远程管理隧道存储的入口规则和源站设置集合。每个已发布应用程序会添加一条入口规则,典型规则为 100–200 字节。包含较长主机名、路径或许多源站参数的规则会占用更多空间,并减少隧道可容纳的已发布应用程序数量。

已发布应用程序不计入账户的路由限制。路由是用于私有网络流量的 CIDR 和主机名路由,其单独限制为每个账户 50,000 条。

如果您需要发布更多应用程序,请将其分散到多个隧道中。每个账户包含 1,000 个隧道。要运行更多隧道,请参阅 Tunnels for Platforms。

支持的协议

下表列出了您可以路由到公共主机名的服务类型。非 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:8000 和 http://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 记录)。

    前往 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(负载均衡) 页面。

    前往 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. 按照以下设置创建监视器:
    • 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 设置

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

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

这篇文档对您有帮助吗?