Cloudflare Tunnel(早期叫 Argo Tunnel)通过反向连接到 Cloudflare 边缘网络,把本地服务暴露到公网,全程不需要公网 IP,也不需要在路由器上做端口映射。把这一套搬到 Android 设备上,旧手机就能立刻变成自带 HTTPS 与 Zero Trust 访问控制的轻量级内网入口。
本文给出两种在 Android 上跑 cloudflared 的方案,并补上后台保活与排错要点。
两种方案怎么选
| 方案 | 适用场景 | 复杂度 | 资源占用 |
|---|---|---|---|
| Termux + Token(推荐) | 单纯把本地端口透出去 | 低 | 低 |
| proot Debian + cert 登录 | 同时需要在 Debian 里跑其他服务 | 中 | 中 |
如果只是想暴露 Termux 里某个端口(如 SSH、Web 服务),直接用 Token 方案;如果机器上已经跑了 proot Debian 做开发环境,第二种方案能让 cloudflared 与其他工具共用同一套 rootfs。
准备工作
-
一个已托管在 Cloudflare 的域名(DNS 服务器要切到 Cloudflare)
-
从 GitHub Releases 安装 Termux(不要装 Google Play 版,已停更)
-
首次启动后更新软件源:
Terminal window pkg update && pkg upgrade
方案 A:Termux + Token(推荐)
1. 安装 cloudflared
Termux 官方源已经收录了 cloudflared:
pkg install cloudflaredcloudflared --version # 验证安装成功2. 在 Cloudflare 控制台创建隧道
- Networks → Tunnels → Create a tunnel,选
Cloudflared连接器 - 给隧道起个名字,下一步会显示安装命令,整段命令末尾的 token 字符串复制下来
- Public Hostname 选项卡里把要暴露的子域名指向
http://localhost:<本地端口>,例如把home.example.com指向http://localhost:8080 - 保存后回到 Termux
3. 启动隧道
cloudflared tunnel --edge-ip-version auto --protocol http2 run --token <粘贴你的 Token>几秒后会看到 Registered tunnel connection 之类日志,控制台里隧道状态变绿色 HEALTHY,浏览器访问对应子域名即可。
--protocol http2是给 QUIC 在国内网络下不稳定时的备选;网络条件好的可去掉走默认 QUIC。
方案 B:proot Debian + cert 登录
1. 安装 proot Debian
pkg install proot-distroproot-distro install debianproot-distro login debian进入容器后再装基础工具:
apt update && apt install -y wget curl2. 安装 cloudflared
Termux + proot 的设备多数是 ARM64:
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.debdpkg -i cloudflared-linux-arm64.deb3. 登录并创建隧道
cloudflared tunnel login # 复制日志中的 URL 在系统浏览器打开授权cloudflared tunnel create my-tunnelcloudflared tunnel list # 记下 UUID4. 写隧道配置
在 ~/.cloudflared/config.yml 写入(注意目录是 .cloudflared,多一个 d):
tunnel: <Tunnel-UUID>credentials-file: /root/.cloudflared/<Tunnel-UUID>.json
ingress: - hostname: home.example.com service: http://localhost:8080 - service: http_status:404 # 兜底必须,否则 cloudflared 会拒启5. 绑定 DNS 并启动
cloudflared tunnel route dns my-tunnel home.example.comcloudflared tunnel run my-tunnel需要管理多条隧道时为每条隧道单独写一份 yaml,启动时用 --config /path/to/config.yml 指定。
让隧道在后台持续运行
Android 会激进回收后台进程,直接 & 放后台几分钟就会被杀。两步保命:
-
持有唤醒锁,阻止系统休眠 Termux:
Terminal window termux-wake-lock关闭时执行
termux-wake-unlock。 -
用 termux-services 托管 让进程崩溃后自动重启:
Terminal window pkg install termux-services# 重启 Termux 加载 sv 环境mkdir -p $PREFIX/var/service/cloudflared/logcat > $PREFIX/var/service/cloudflared/run <<'EOF'#!/data/data/com.termux/files/usr/bin/shexec cloudflared tunnel --protocol http2 run --token YOUR_TOKEN 2>&1EOFchmod +x $PREFIX/var/service/cloudflared/runsv-enable cloudflaredsv up cloudflaredsv status cloudflared # 看到 run: cloudflared 即正常日志在
$PREFIX/var/service/cloudflared/log/main/current。
把 Termux 加入手机厂商的「电池白名单 / 自启动白名单 / 受保护应用」,配合上面两步,长时间稳定运行基本没问题。
常见问题
failed to dial to edge: x509: certificate signed by unknown authority
proot Debian 默认证书库不全,执行 apt install -y ca-certificates && update-ca-certificates。
隧道一直 DOWN,但 cloudflared 日志显示已连接
仪表板缓存延迟,等 30 秒;仍异常则检查 Public Hostname 中是否填了正确的 service URL,并确认本地端口确实在监听(ss -ltnp)。
手机熄屏几分钟后断流
没拿唤醒锁,或者厂商系统强杀。先确认 termux-wake-lock 生效(通知栏会有持续提示),再去系统设置里给 Termux 解除后台限制。
QUIC 协议无法建联
显式加 --protocol http2,部分国内 ISP 对 UDP/443 有干扰。