所有页面
本页内容

通过 Cloudflare Tunnel 访问中继

Cloudflare Tunnel 无需你自己的服务器、也无需在路由器上开放端口,就能为你的中继提供一个公开的 HTTPS 地址。OAR 可以替你运行 Cloudflare 的 cloudflared 程序:它随中继一起启动它,在它断开时重启它,并在状态点中显示它的状态。当你在 Cloudflare 上有域名、想从手机或另一个网络访问中继,或者你需要 HTTPS 来把页面安装为应用和推送通知时,选择它。

cloudflared 向外连接到 Cloudflare。中继继续只监听本机(localhostOnly 保持 true),而 Cloudflare 会把针对你主机名的请求沿着该连接带到中继的端口。

你需要什么 #

  • 一个带 Zero Trust 的 Cloudflare 账户,以及其上一个用于公开主机名的域名(区域)。
  • 在运行中继的机器上安装 cloudflared。OAR 不包含它,也不安装它。
  • 你在 Cloudflare 中创建的隧道。OAR 从隧道的令牌运行它。

中继运行 cloudflaredTunnel.binary 指定的程序,否则运行它在 PATH 上找到的 cloudflared。用以下方式安装它:

系统 安装
Windows winget install --id Cloudflare.cloudflared
macOS brew install cloudflared
Linux Cloudflare 的软件包仓库(Debian、Ubuntu、RHEL):pkg.cloudflare.com

在 Windows 上,.cmd 或 .bat 启动器不起作用。OAR 会启动 .exe 或 .com 文件。

一种隧道

OAR 支持从令牌运行的隧道,即 Cloudflare 所称的远程托管隧道。没有针对凭据文件或隧道名称的设置,也没有针对带随机地址的快速隧道的设置。如果你自己运行这样的隧道,请在 OAR 之外启动 cloudflared。这样 OAR 对它一无所知。

设置 #

  1. 在你的 Cloudflare Zero Trust 账户中创建一个隧道。复制它的令牌。
  2. 在你的区域上为该隧道设置一个公开主机名,例如 relay.example.com,并把它指向 http://localhost:3333。如果你更改了 config.json 中的 port,请使用那个端口。这个路由在 Cloudflare 中,而不是在你的机器上。
  3. 把 cloudflaredTunnel 块连同令牌添加到 config.json(参见配置键)。
  4. 用 oar restart 重启中继。

在浏览器中打开 https://relay.example.com/。你照常用访问令牌登录。

配置块 #

{
  "cloudflaredTunnel": {
    "mode": "managed",
    "required": false,
    "token": "<tunnel token>",
    "binary": "cloudflared",
    "extraArgs": []
  }
}
键 类型 默认值 它的作用
mode "disabled" 或 "managed" "disabled" managed 让中继运行 cloudflared。
token 字符串 无 隧道的令牌。managed 时必填;没有它,隧道保持关闭,日志会说明原因。
required 布尔值 false 当隧道未连接时,中继暂停从队列取消息。参见必连隧道。
binary 字符串 cloudflared 程序:绝对路径,或在 PATH 上查找的名称。路径必须指向一个可执行文件。带文件夹的相对路径从中继的程序文件夹算起,因此请使用绝对路径。
extraArgs 字符串数组 [] 在 cloudflared tunnel run --token <token> 之后添加的参数。空条目会被丢弃。

旧形式 "enabled": true 对于 mode: "managed" 仍然有效。三个环境变量会覆盖该文件:COPILOT_CLOUDFLARED_MODE、COPILOT_CLOUDFLARED_TOKEN 和 COPILOT_CLOUDFLARED_BINARY。config.json 参考把这些键与其他隧道设置列在一起,而环境变量页面列出了这些变量。

中继把令牌作为命令行参数交给 cloudflared(cloudflared tunnel run --token <token>),而不是通过环境。因此在有其他用户的机器上,令牌可能出现在运行中的进程列表中。中继的日志会把它显示为 <redacted>。

它的行为 #

  • 启动与停止。 中继在启动时启动 cloudflared,并在关闭时停止它(发送终止信号)。
  • 已连接。 当 cloudflared 报告已注册的连接时,隧道算作已连接;若没有这样的报告,则在它运行满五秒时算作已连接。
  • 断开。 当 cloudflared 退出时,中继会依次等待大约 5、10、20、40 秒,之后每次 60 秒,再重新启动它,每次等待最多再加 20%。一次连接持续超过 30 秒后,这个等待序列会从头开始。
  • 令牌错误或隧道已删除。 如果 cloudflared 连续三次在 10 秒内退出,中继会报告错误 auth-or-config,并且此后大约每分钟只重试一次。
  • 没有 cloudflared。 中继照常启动,隧道保持关闭。它每分钟再查找一次,并在程序就位后启动隧道。如果你把它安装到一个不在中继 PATH 上的文件夹,请重启中继。

必连隧道 #

当 required: true 时,隧道未连接期间中继不从队列取消息。这包括它首次连接之前的时间,以及缺少 cloudflared 或令牌的情况。如果中继只有在你能从外部访问它时才有用,就使用这个选项。消息在队列中等待,并在隧道连接后运行(参见轮次与队列)。

查看状态 #

位置 它显示什么
状态点 隧道连接期间为琥珀色,提示 Web relay reachable via Cloudflare Tunnel(可通过 Cloudflare Tunnel 访问网页中继)。已设置但未连接时为绿色:提示显示 Web relay reachable; Cloudflare tunnel disconnected ()(网页中继可访问;Cloudflare 隧道已断开,),或当缺少 cloudflared 时为 Cloudflare tunnel off: (Cloudflare 隧道已关闭:)。中继仍然响应。参见菜单和外观。
oar status 隧道开启时有一行 Tunnel::running、not connected、not connected (<reason>) 或 off: <reason>。中继停止时,它显示与 oar doctor 相同的措辞。参见 oar status。
oar doctor disabled、managed (cloudflared: <path>) 或 managed, cannot start: <reason>。它只读取配置,不改变任何东西。参见 oar doctor。
日志 以 [cloudflared-tunnel] 开头的行:命令(令牌显示为 <redacted>)、Tunnel connected、退出和重连延迟,以及 cloudflared 自己的输出。

中继不知道你的公开主机名,因为路由在 Cloudflare 中,所以这些都不显示它。

区分隧道流量 #

Cloudflare 会向它转发的每个请求添加一个 cf-ray 请求头。中继用它区分通过隧道来的请求与在本机上发出的请求。要把你自己的边缘所加的请求头也这样处理,把它们列在 tunnelMarkerHeaders 中。publicHostnames 列出到达中继的主机名,而 trustProxy 指定中继在转发地址上信任哪些代理。默认值 "loopback" 适合同一台机器上的 cloudflared。这三个都在 config.json 参考中。

给预览的第二个主机名 #

预览需要自己的主机名,这样被预览的应用就绝不会与中继共享登录 cookie。把它作为第二个公开主机名添加到同一个隧道,指向预览监听器(默认 http://127.0.0.1:3334)。预览页面有入口示例和 previews 块。把中继的主机名放进 publicHostnames。

中继前面的 Cloudflare Access #

中继主机名上的 Cloudflare Access 应用适用于每个访客,包括已分享对话的查看者。如果不设例外,他们会被要求登录,链接也就无法使用。让 /shared/* 和 /api/shared/* 无需登录即可通过。

不要为 /api/shared/* 添加 Cloudflare 缓存规则。分享页面会重新加载该地址以跟随对话,而缓存的响应会一直显示旧状态。中继给每个 API 响应加上 Cache-Control: no-store,并给每个响应加上设为 no-store 的 CDN-Cache-Control 和 Cloudflare-CDN-Cache-Control。Cloudflare 会优先遵守这两个,而不是你区域中的缓存规则。

安全 #

隧道会把中继放到公共互联网上。访问令牌是把别人挡在外面的东西。参见访问令牌与谁能访问中继和 OAR 暴露什么。

中继的会话 worker 通过只在本机运行的套接字连接。因为公开隧道会转发每条路径,所以中继会对那些路径上携带 cf-ray 或你的某个 tunnelMarkerHeaders 的请求回应 403,日志会用 [tunnel-guard] 注明。通过隧道、无需登录到达的分享链接不受影响。

疑难解答 #

你看到的 该怎么做
提示显示 Cloudflare tunnel off: cloudflared is not installed(Cloudflare 隧道已关闭:未安装 cloudflared),后面附有安装方法;或 oar doctor 显示 cloudflared is not installed 安装 cloudflared(参见你需要什么)。隧道会在一分钟内启动。
cloudflared was not found as configured (<path>) cloudflaredTunnel.binary 指向不存在的东西。修正路径,或清除该键以使用 PATH 上的 cloudflared。
cloudflaredTunnel.token is required when cloudflaredTunnel.mode is "managed" 把令牌添加到配置,或设置 COPILOT_CLOUDFLARED_TOKEN。
Tunnel: not connected (auth-or-config) cloudflared 一直立即退出。检查令牌以及隧道是否仍存在于 Cloudflare 中。日志中有 cloudflared 自己的消息。
Tunnel: not connected (exit:<code>) cloudflared 以该退出代码结束。中继正在重试;阅读日志。
尽管你通过隧道打开了中继,状态点仍保持绿色 从中继这一侧看,隧道并未连接。阅读提示和 oar status。
消息不运行且队列暂停 required 为 true 且隧道未连接。修复隧道,或把 required 设为 false。
分享链接要求查看者登录 Cloudflare Access 挡在中间。放行 /shared/* 和 /api/shared/*。
分享页面显示旧状态 某条缓存规则覆盖了 /api/shared/*。移除它。
会话 worker 路径上出现 403 预期行为:这些路径对隧道流量关闭。
已安装 cloudflared,但隧道不启动 中继可能在其 PATH 上看不到它。把 binary 设为完整路径并运行 oar restart。