玩客云 OpenWrt 安装 cloudflared(Cloudflare Tunnel)

玩客云 OpenWrt 安装 cloudflared(Cloudflare Tunnel)并开机自启全流程

面向:已在玩客云刷入 OpenWrt 的用户。包含安装、配置(详细到 config.yml)、两种启动方式(凭据文件/令牌)、开机自启、验证与排错。无需端口映射,cloudflared 只发起出站连接。


0. 重要说明

  • 不要泄露令牌或凭据文件:任何能“直接跑起来”的命令里都包含敏感信息,别贴到公开页面。
  • 时间要正确:TLS 依赖系统时间。若设备时间错误,连接会失败。
  • 推荐方式:使用“命名隧道 + 凭据文件 + config.yml”。若你只有一个“令牌”,也提供了令牌启动方案。

1. 基础准备

  • SSH 到玩客云:
    SH
    1
    ssh root@路由器IP
  • 更新根证书(推荐)
    SH
    1
    2
    opkg update
    opkg install ca-bundle ca-certificates
  • 确认时间正确(若不正确先联网同步 NTP):
    SH
    1
    date

2. 安装 cloudflared

2.1 检测架构(选择合适二进制)

SH
1
2
3
4
5
uname -m
# 常见输出举例:
# aarch64 -> 用 cloudflared-linux-arm64
# armv7l -> 用 cloudflared-linux-arm
# mips/mipsel -> 官方未直供,需自编译或换设备

2.2 下载与安装

以 ARM 为例(请按上面检测结果替换 URL 中的后缀):

SH
1
2
3
4
5
6
7
8
9
cd /usr/local/bin
# 根据 uname -m 选择其一:
# aarch64
# wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64 -O cloudflared
# armv7/arm
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm -O cloudflared

chmod +x /usr/local/bin/cloudflared
/usr/local/bin/cloudflared --version

3. 配置方式一:命名隧道(推荐,使用凭据文件 + config.yml)

3.1 在电脑端准备(建议)

在你的电脑上(非路由器)先登录并创建隧道,然后把凭据文件拷到路由器:

SH
1
2
3
4
5
6
7
8
# 在电脑上(已安装 cloudflared)
cloudflared login
cloudflared tunnel create my-tunnel
cloudflared tunnel list
cloudflared tunnel route dns my-tunnel sub.example.com
# 记录输出的 <tunnel-id>,凭据文件通常位于:
# Linux/macOS: ~/.cloudflared/<tunnel-id>.json
# Windows: %USERPROFILE%\.cloudflared\<tunnel-id>.json

将该 <tunnel-id>.json 通过 scp 上传到路由器:

SH
1
scp ~/.cloudflared/<tunnel-id>.json root@路由器IP:/root/.cloudflared/

若你已在 Cloudflare Zero Trust 控制台创建了隧道并下载了凭据文件,直接上传到路由器即可。

3.2 在路由器上创建配置目录

SH
1
mkdir -p /root/.cloudflared

3.3 放置凭据文件并设权限

SH
1
2
# 假设文件名为 <tunnel-id>.json
chmod 600 /root/.cloudflared/<tunnel-id>.json

3.4 编写 config.yml(详细示例)

新建 /root/.cloudflared/config.yml:

YAML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 必填:命名隧道
tunnel: <你的-tunnel-name> # 例:my-tunnel(名字,可读性)
credentials-file: /root/.cloudflared/<tunnel-id>.json

# 可选:日志与级别(推荐开启以便排错)
# logfile: /root/.cloudflared/cloudflared.log
# loglevel: info # 可选:debug, info, warn, error

# 可选:metrics(仅本机查看)
# metrics: 127.0.0.1:53192

# 将域名流量路由到你本地服务
ingress:
# 示例1:把 https://sub.example.com 转发到 OpenWrt LuCI(本机80端口)
- hostname: sub.example.com
service: http://127.0.0.1:80

# 示例2:把 ssh.example.com 转发到本机 SSH(22端口)
- hostname: ssh.example.com
service: ssh://127.0.0.1:22

# 示例3:把 nas.example.com 转发到内网 NAS(示例:192.168.1.100:5000)
- hostname: nas.example.com
service: http://192.168.1.100:5000

# 兜底(未匹配的请求返回 404)
- service: http_status:404

# 可选:若内网服务使用自签名证书,可这么写(按需开启)
# originRequest:
# noTLSVerify: true

3.5 确保 DNS 已指到 Cloudflare(重要)

  • 已在 3.1 用 cloudflared 绑定 DNS:无须额外操作。
  • 在 Zero Trust/控制台手动绑定:为每个 hostname 添加 CNAME 到云隧道提供的目标(通常形如 xxx.cfargotunnel.com)。

4. 配置方式二:仅用令牌启动(无需 config.yml)

若你只有一个形如 --token eyJ... 的令牌,可直接运行,无需凭据文件与 config.yml。此方式简单但难以多主机名路由。

示例命令(仅参考,实际请换成你的 token):

SH
1
/usr/local/bin/cloudflared tunnel run --no-autoupdate --token <你的令牌>

5. 创建 OpenWrt 自启脚本(procd)——两种版本二选一

5.1 推荐版(配合 config.yml 的命名隧道)

新建 /etc/init.d/cloudflared:

SH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1

start_service() {
procd_open_instance cloudflared
procd_set_param command /usr/local/bin/cloudflared \
--no-autoupdate \
--config /root/.cloudflared/config.yml \
tunnel run <你的-tunnel-name>
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}

5.2 令牌版(不使用 config.yml)

若你只想用 token:

SH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1

start_service() {
procd_open_instance cloudflared
procd_set_param command /usr/local/bin/cloudflared \
--no-autoupdate \
tunnel run --token <你的令牌>
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}

设置执行权限并启用自启:

SH
1
2
3
chmod +x /etc/init.d/cloudflared
/etc/init.d/cloudflared enable
/etc/init.d/cloudflared start

验证已加入开机链:

SH
1
2
ls -l /etc/rc.d/*cloudflared
# 看到 S99cloudflared -> ../init.d/cloudflared 即成功

6. 可选:与另一个程序一起自启(双实例)

若你还要同时启动 /root/lan-to-go/zuyu-share-openwrt-armv7,可把它并入同一个 procd 脚本:

/etc/init.d/cloudflared(在 start_service 中增加第二个实例):

SH
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1

start_service() {
# 实例1:cloudflared
procd_open_instance cloudflared
procd_set_param command /usr/local/bin/cloudflared \
--no-autoupdate \
--config /root/.cloudflared/config.yml \
tunnel run <你的-tunnel-name>
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance

# 实例2:zuyu-share-openwrt-armv7
procd_open_instance lan_to_go
# 用 sh -c 切目录后 exec 真正进程,便于 procd 正确跟踪
procd_set_param command /bin/sh -c 'cd /root/lan-to-go && exec ./zuyu-share-openwrt-armv7'
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}

(若仅需 cloudflared,就不用添加第二个实例。)


7. 验证与排错

7.1 运行状态

SH
1
2
3
ps | grep cloudflared
/etc/init.d/cloudflared status
logread -f

7.2 常见问题排查

  • 看日志:config.yml 配错最直观。
  • 时间不对:执行 date,必要时联网同步 NTP。
  • 凭据文件权限chmod 600 /root/.cloudflared/<tunnel-id>.json
  • 路径错误:确认 /usr/local/bin/cloudflared/root/.cloudflared/config.yml 与 JSON 路径无误。
  • DNS 未就绪:首次开机若 WAN 拨号慢,procd 会重启实例,稍等片刻。
  • 域名未解析到隧道:核对 CNAME 是否指向 Cloudflare 隧道域名(或已用 cloudflared tunnel route dns 绑定)。
  • 架构不匹配uname -m 与下载的二进制要对应。

8. 常用命令

SH
1
2
3
4
5
6
7
8
# 启动/停止/重启/状态
/etc/init.d/cloudflared start
/etc/init.d/cloudflared stop
/etc/init.d/cloudflared restart
/etc/init.d/cloudflared status

# 实时日志
logread -f

9. 小结

  • 推荐使用“命名隧道 + 凭据文件 + config.yml”,结构清晰、易扩展多个域名/服务。
  • 令牌方式快捷,但不利于复杂路由与多人协作管理。
  • 使用 OpenWrt 的 procd 管理,具备自启与崩溃重启能力,更稳。