目录

创建本地管理的 Cloudflare Tunnel

需要一个第二天还在的主机名时,选本地管理的 Cloudflare Tunnelcloudflared 在本机拿凭证、读 config.yml、只出站连 Cloudflare。不选仪表盘里的远程隧道(配置不在 git 里)。不选 cloudflared tunnel --url 那种 trycloudflare.com 临时名——进程一停,名字就没了。

选 / 不选

不选
命名隧道 + 本机 config.yml 仪表盘远程管理的 ingress
cloudflared tunnel route dns 指到真实主机名 *.trycloudflare.com 写进对方后台
源站只听 127.0.0.1 为了「方便」在路由器上开端口
系统服务跑 cloudflared nohup 当守护
凭证文件权限按密钥对待 cert.pem<UUID>.json 提交进仓库

工作原理

Cloudflared 在资源和 Cloudflare 的全球网络之间建立出站连接(隧道)。隧道是将流量路由到 DNS 记录的持久对象。在同一个隧道内,可以根据需要运行任意数量的 cloudflared 进程(连接器)。这些进程将建立与 Cloudflare 的连接并将流量发送到最近的 Cloudflare 数据中心。

https://developers.cloudflare.com/assets/handshake_hufad68abf6107ffc2ef859ebe1b42b6e2_299675_1768x1102_resize_q75_box-3f75968f.jpg

先决条件

在开始之前,请确保:

1. 安装 cloudflared

Windows

  1. 在设备上下载 cloudflared。访问下载页面找到适合操作系统的正确软件包。
  2. 将可执行文件重命名为 cloudflared.exe
  3. 在 PowerShell 中,将目录更改为 Downloads 文件夹并运行 .\cloudflared.exe --version。它应该会输出 cloudflared 的版本。请注意,如果没有重命名 cloudflared.exe,它可能是 cloudflared-windows-amd64.execloudflared-windows-386.exe
PS C:\Users\Administrator\Downloads\cloudflared-stable-windows-amd64> .\cloudflared.exe --version

macOS

要下载并安装 cloudflared:

brew install cloudflared

或者,可以直接下载最新的 Darwin amd64 版本

Linux

Debian 和 Ubuntu APT

在兼容的设备上使用 apt 包管理器安装 cloudflared。

  1. 添加 Cloudflare 的软件包签名密钥:
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
  1. 将 Cloudflare 的 apt 仓库添加到 apt 仓库中:
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
  1. 更新仓库并安装 cloudflared:
sudo apt-get update && sudo apt-get install cloudflared

RHEL RPM

在兼容的设备上使用 rpm 包管理器安装 cloudflared。

  1. 添加 Cloudflare 的仓库:
curl -fsSL https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo
  1. 更新仓库并安装 cloudflared:
sudo yum update && sudo yum install cloudflared

Arch Linux

cloudflared 在 Arch Linux 的社区仓库中。在兼容的设备上使用 pacman 安装 cloudflared。

pacman -Syu cloudflared

其他

或者,可以将 cloudflared 二进制文件或 linux 软件包下载到设备并手动安装。访问下载页面找到适合操作系统的正确软件包。

从源代码构建

要从源代码构建 cloudflared 的最新版本:

git clone https://github.com/cloudflare/cloudflared.git
cd cloudflared
make cloudflared
go install github.com/cloudflare/cloudflared/cmd/cloudflared

根据安装 cloudflared 的位置,也可以将其移动到一个已知路径。

mv /root/cloudflared/cloudflared /usr/bin/cloudflared

2. 验证 cloudflared

cloudflared tunnel login

运行此命令将:

  • 打开一个浏览器窗口并提示登录 Cloudflare 帐户。登录帐户后,选择主机名。
  • 默认 cloudflared 目录中生成一个帐户证书,cert.pem 文件。

3. 创建一个隧道并为其命名

cloudflared tunnel create <NAME>

运行此命令将:

从命令的输出中,记下隧道的 UUID 和隧道凭证文件的路径。

通过运行以下命令确认隧道已成功创建:

cloudflared tunnel list

4. 创建一个配置文件

  1. .cloudflared 目录中,使用任意文本编辑器创建一个 config.yml 文件。此文件将配置隧道以将流量从给定的源站路由到所选的主机名。

  2. 将以下字段添加到文件中:

如果正在连接一个应用程序:

url: http://localhost:8000
tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

如果正在连接一个私有网络:

tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json
warp-routing:
  enabled: true
  1. 通过运行以下命令确认配置文件已成功创建:
cat config.yml

5. 开始路由流量

  1. 现在分配一个将流量指向隧道子域的 CNAME 记录:
  • 如果正在连接一个应用程序,请将服务路由到一个公共主机名
cloudflared tunnel route dns <UUID or NAME> <hostname>
  • 如果正在连接一个私有网络,请通过隧道路由一个 IP 地址或 CIDR:
cloudflared tunnel route ip add <IP/CIDR> <UUID or NAME>
  1. 确认路线已成功建立:
cloudflared tunnel route ip show

6. 运行隧道

运行隧道以将来自隧道的传入流量代理到本地源站上运行的任意数量的服务。

cloudflared tunnel run <UUID or NAME>

如果配置文件具有自定义名称或不在 .cloudflared 目录中,请添加 --config 标志并指定路径。

cloudflared tunnel --config /path/your-config-file.yml run <UUID or NAME>

Cloudflare Tunnel 可以将自身安装为 Linux 和 Windows 上的系统服务,以及 macOS 上的启动代理。有关更多信息,请参阅 作为服务运行

7. 检查隧道

隧道配置已完成!如果想获取刚创建的隧道的相关信息,可以运行:

cloudflared tunnel info <UUID or NAME>

现在可以使用 Cloudflare DNS 将流量路由到隧道,或使用 Cloudflare Access 确定谁可以访问隧道

实用的命令

使用这些命令通过 CLI 管理本地隧道。

管理隧道

命令 描述
cloudflared tunnel login 会提示一个浏览器窗口,可以在其中验证隧道到 Cloudflare 帐户。
cloudflared tunnel list 显示所有活动隧道、其创建的时间和相关连接。使用 -d 标志包含已删除的隧道。
cloudflared tunnel create <NAME or UUID> 创建隧道,将其注册到 Cloudflare edge 并生成凭证文件来运行此隧道。
cloudflared tunnel route 通过隧道路由通信量。
cloudflared tunnel route lb <NAME or UUID> <load balancer name> <load balancer pool> 使用指向隧道的原始池创建负载均衡器。
cloudflared tunnel route ip add <IP/CIDR> <NAME or UUID> 将任何网络路由空间(表示为 CIDR)添加到路由表。只要使用 Cloudflare WARP 并注册到运行此处选择的隧道的同一帐户,该网络空间就可供从用户的机器访问的请求访问。此外,这些请求将代理到指定的隧道,并访问给定 CIDR 中的 IP,只要从隧道可以访问该 IP。要将 IP 路由分配给特定 虚拟网络,请使用 --vnet 选项。
cloudflared tunnel route ip show (or list) 显示组织的专用路由表。可以使用其他标志来过滤结果。
cloudflared tunnel route ip delete 从路由表中删除给定 CIDR 的行。WARP 客户端将无法再访问网络的该部分。
cloudflared tunnel route ip get <IP/CIDR> 检查路由表的哪一行将用于代理给定的 IP。这有助于检查和验证配置。
cloudflared tunnel route dns 创建指向隧道的 DNS CNAME 记录主机名。
cloudflared tunnel --config path/config.yaml run <NAME or UUID> 运行隧道,在服务器和 Cloudflare 边缘之间创建高可用连接。可以提供隧道的名称或 UUID,使其作为最后一个命令行参数运行或使用 tunnel: <NAME> 在配置文件中运行。
cloudflared tunnel info <NAME or UUID> 显示给定隧道(由名称或 UUID 标识)的活动连接器的详细信息。
cloudflared tunnel cleanup <NAME or UUID> 删除具有给定 UUID 或名称的隧道的连接。这在尝试在 cloudflared 未正常关闭后删除或运行隧道时收到错误(例如,如果发出 kill 命令)时非常有用。
cloudflared tunnel cleanup --connector-id <CONNECTOR-ID> <NAME or UUID> 断开并删除具有给定连接器 ID 的 cloudflared 副本。可以通过运行 cloudflared tunnel info <NAME or UUID> 查看隧道的全部副本。
cloudflared tunnel delete <NAME or UUID> 删除具有给定名称或 UUID 的隧道。如果隧道有活动连接,则无法删除隧道。要无条件删除隧道,请使用 -f 标志。
cloudflared tunnel vnet add <NAME or UUID> 创建可以分配 IP 路由的虚拟网络。要将此虚拟网络设为零信任组织的默认设置,请使用 -d 标志。
cloudflared tunnel vnet delete <NAME or UUID> 删除具有给定名称或 UUID 的虚拟网络。在可以删除虚拟网络之前,必须首先删除分配给虚拟网络的所有 IP 路由。
cloudflared tunnel vnet list 显示所有活动虚拟网络、默认虚拟网络及其创建时间。
cloudflared tail <UUID> 开始会话,以从特定隧道实时直播日志。有关详细信息,请参阅 隧道日志

管理 cloudflared

Command Description
cloudflared update 在官方下载服务器上查找新版本。如果存在新版本,它将更新代理二进制文件并退出。否则,不执行任何操作。此命令仅在 cloudflared 从 GitHub 二进制文件或源代码安装时有效。有关更多信息,请参阅 更新说明
cloudflared version 打印 cloudflared 版本号和构建日期。
cloudflared help 显示命令列表或 cloudflared 的帮助。

失败怎么看见

缺 catch-all 时(ingress 只有 hostname、没有最后一条 http_status:404),cloudflared 会拒绝启动。源站应只听 127.0.0.1。有公网 IP 且只缺 TLS 时走 Caddy,不必再套一层隧道。cert.pem<UUID>.json 按密钥对待:~/.cloudflared 700,文件 600,不要进 git。临时 trycloudflare.com 只能写在备忘,不能写进对方后台。同一条命名隧道不要在两台机器上同时 run,先看 cloudflared tunnel info

参考资料