通过 Cloudflare Tunnel 访问中继
Cloudflare Tunnel 无需你自己的服务器、也无需在路由器上开放端口,就能为你的中继提供一个公开的 HTTPS 地址。OAR 可以替你运行 Cloudflare 的 cloudflared 程序:它随中继一起启动它,在它断开时重启它,并在状态点中显示它的状态。当你在 Cloudflare 上有域名、想从手机或另一个网络访问中继,或者你需要 HTTPS 来把页面安装为应用和推送通知时,选择它。
cloudflared 向外连接到 Cloudflare。中继继续只监听本机(localhost 保持 true),而 Cloudflare 会把针对你主机名的请求沿着该连接带到中继的端口。
你需要什么 #
- 一个带 Zero Trust 的 Cloudflare 账户,以及其上一个用于公开主机名的域名(区域)。
- 在运行中继的机器上安装
cloudflared。OAR 不包含它,也不安装它。 - 你在 Cloudflare 中创建的隧道。OAR 从隧道的令牌运行它。
中继运行 cloudflared 指定的程序,否则运行它在 PATH 上找到的 cloudflared。用以下方式安装它:
| 系统 | 安装 |
|---|---|
| Windows | winget install --id Cloudflare. |
| macOS | brew install cloudflared |
| Linux | Cloudflare 的软件包仓库(Debian、Ubuntu、RHEL):pkg.cloudflare.com |
在 Windows 上,. 或 . 启动器不起作用。OAR 会启动 . 或 . 文件。
一种隧道
OAR 支持从令牌运行的隧道,即 Cloudflare 所称的远程托管隧道。没有针对凭据文件或隧道名称的设置,也没有针对带随机地址的快速隧道的设置。如果你自己运行这样的隧道,请在 OAR 之外启动 cloudflared。这样 OAR 对它一无所知。
设置 #
- 在你的 Cloudflare Zero Trust 账户中创建一个隧道。复制它的令牌。
- 在你的区域上为该隧道设置一个公开主机名,例如
relay.,并把它指向example. com http://。如果你更改了localhost: 3333 config.中的json port,请使用那个端口。这个路由在 Cloudflare 中,而不是在你的机器上。 - 把
cloudflared块连同令牌添加到Tunnel config.(参见配置键)。json - 用
oar restart重启中继。
在浏览器中打开 https://。你照常用访问令牌登录。
配置块 #
{
"cloudflaredTunnel": {
"mode": "managed",
"required": false,
"token": "<tunnel token>",
"binary": "cloudflared",
"extraArgs": []
}
}
| 键 | 类型 | 默认值 | 它的作用 |
|---|---|---|---|
mode |
"disabled" 或 "managed" |
"disabled" |
managed 让中继运行 cloudflared。 |
token |
字符串 | 无 | 隧道的令牌。managed 时必填;没有它,隧道保持关闭,日志会说明原因。 |
required |
布尔值 | false |
当隧道未连接时,中继暂停从队列取消息。参见必连隧道。 |
binary |
字符串 | cloudflared |
程序:绝对路径,或在 PATH 上查找的名称。路径必须指向一个可执行文件。带文件夹的相对路径从中继的程序文件夹算起,因此请使用绝对路径。 |
extra |
字符串数组 | [] |
在 cloudflared tunnel run --token <token> 之后添加的参数。空条目会被丢弃。 |
旧形式 "enabled": true 对于 mode: "managed" 仍然有效。三个环境变量会覆盖该文件:COPILOT_、COPILOT_ 和 COPILOT_。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 (cloudflared 时为 Cloudflare tunnel off: |
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- 开头的行:命令(令牌显示为 <redacted>)、Tunnel connected、退出和重连延迟,以及 cloudflared 自己的输出。 |
中继不知道你的公开主机名,因为路由在 Cloudflare 中,所以这些都不显示它。
区分隧道流量 #
Cloudflare 会向它转发的每个请求添加一个 cf- 请求头。中继用它区分通过隧道来的请求与在本机上发出的请求。要把你自己的边缘所加的请求头也这样处理,把它们列在 tunnel 中。public 列出到达中继的主机名,而 trust 指定中继在转发地址上信任哪些代理。默认值 "loopback" 适合同一台机器上的 cloudflared。这三个都在 config.json 参考中。
给预览的第二个主机名 #
预览需要自己的主机名,这样被预览的应用就绝不会与中继共享登录 cookie。把它作为第二个公开主机名添加到同一个隧道,指向预览监听器(默认 http://)。预览页面有入口示例和 previews 块。把中继的主机名放进 public。
中继前面的 Cloudflare Access #
中继主机名上的 Cloudflare Access 应用适用于每个访客,包括已分享对话的查看者。如果不设例外,他们会被要求登录,链接也就无法使用。让 / 和 / 无需登录即可通过。
不要为 / 添加 Cloudflare 缓存规则。分享页面会重新加载该地址以跟随对话,而缓存的响应会一直显示旧状态。中继给每个 API 响应加上 Cache-,并给每个响应加上设为 no- 的 CDN- 和 Cloudflare-。Cloudflare 会优先遵守这两个,而不是你区域中的缓存规则。
安全 #
隧道会把中继放到公共互联网上。访问令牌是把别人挡在外面的东西。参见访问令牌与谁能访问中继和 OAR 暴露什么。
中继的会话 worker 通过只在本机运行的套接字连接。因为公开隧道会转发每条路径,所以中继会对那些路径上携带 cf- 或你的某个 tunnel 的请求回应 403,日志会用 [tunnel- 注明。通过隧道、无需登录到达的分享链接不受影响。
疑难解答 #
| 你看到的 | 该怎么做 |
|---|---|
提示显示 Cloudflare tunnel off: cloudflared is not installed(Cloudflare 隧道已关闭:未安装 cloudflared),后面附有安装方法;或 oar doctor 显示 cloudflared is not installed |
安装 cloudflared(参见你需要什么)。隧道会在一分钟内启动。 |
cloudflared was not found as configured (<path>) |
cloudflared 指向不存在的东西。修正路径,或清除该键以使用 PATH 上的 cloudflared。 |
cloudflared |
把令牌添加到配置,或设置 COPILOT_。 |
Tunnel: not connected (auth- |
cloudflared 一直立即退出。检查令牌以及隧道是否仍存在于 Cloudflare 中。日志中有 cloudflared 自己的消息。 |
Tunnel: not connected (exit:<code>) |
cloudflared 以该退出代码结束。中继正在重试;阅读日志。 |
| 尽管你通过隧道打开了中继,状态点仍保持绿色 | 从中继这一侧看,隧道并未连接。阅读提示和 oar status。 |
| 消息不运行且队列暂停 | required 为 true 且隧道未连接。修复隧道,或把 required 设为 false。 |
| 分享链接要求查看者登录 | Cloudflare Access 挡在中间。放行 / 和 /。 |
| 分享页面显示旧状态 | 某条缓存规则覆盖了 /。移除它。 |
会话 worker 路径上出现 403 |
预期行为:这些路径对隧道流量关闭。 |
已安装 cloudflared,但隧道不启动 |
中继可能在其 PATH 上看不到它。把 binary 设为完整路径并运行 oar restart。 |