本文介绍使用 Cloudflare Tunnel(原 Argo Tunnel)把系统安全地暴露到公网的方案,此方案无需所谓的公网 IP,也无需第三方工具,免费高效。
准备工作
哪些场景特别适合
- • Docker / 本地 FastAPI / Web 管理后台
尤其适合:“系统已经跑起来了,但不想折腾公网、防火墙、安全组” 的情况。
前提
- • 不是所有协议都适合(HTTP / HTTPS / TCP 最友好)
优势(常见方案比对)
端口映射 / 公网 IP
这是最传统、最直觉的方式:
适合:
👉 对网络熟悉、对安全有完整防护体系的正式生产环境。
第三方内网穿透工具(frp / ngrok / 花生壳等)
这类工具的思路是:
你跑一个客户端,它帮你转发流量。
适合:
👉 临时调试、演示、短期使用。
Cloudflare Tunnel(本文主角)
Cloudflare Tunnel 的逻辑和前面都不同:
这意味着:
优势非常集中:
一句话总结它的定位:
这是一个“反向暴露服务”的工程级方案。
准备
一个 Cloudflare 账号 + 一个域名
- 1. 登录
https://www.cloudflare.com/zh-cn/注册一个账号,并生成一个用户 API 令牌
部署
Windows
1. 安装 cloudflared
两种方式选一种即可:
choco install cloudflared -y
cloudflared --version
winget install Cloudflare.cloudflared
cloudflared --version
2. 登录授权(会弹浏览器)
cloudflared tunnel login
3. 创建 Tunnel
cloudflared tunnel create my-tunnel
4. 写配置文件
建议放到默认目录(没有就建):
- • 配置目录:
C:\Users\<你的用户名>\.cloudflared\
创建/编辑:
notepad $env:USERPROFILE\.cloudflared\config.yml
填入(把 UUID 换成你创建 tunnel 后输出的那串):
tunnel: <TUNNEL-UUID>
credentials-file: C:\Users\<你的用户名>\.cloudflared\<TUNNEL-UUID>.json
ingress:
- hostname: app.example.com
service: http://127.0.0.1:8080
- service: http_status:404
5. 创建 DNS 路由(把子域名绑定到 tunnel)
cloudflared tunnel route dns my-tunnel app.example.com
6. 运行
cloudflared tunnel run my-tunnel
运行后访问:https://app.example.com
Linux(Ubuntu/Debian 为例)
1. 安装 cloudflared
(如果你已用二进制安装也没问题,这里给常见方式)
# Debian/Ubuntu 常见安装方式之一(使用官方仓库时因发行版不同略有差异)
# 如果你不想折腾仓库,直接用 cloudflared 二进制也行。
如果你手里已有 cloudflared 二进制(最省心),放到 PATH:
sudo mv cloudflared /usr/local/bin/
sudo chmod +x /usr/local/bin/cloudflared
cloudflared --version
2. 登录授权(会给你一个 URL)
cloudflared tunnel login
3. 创建 Tunnel
cloudflared tunnel create my-tunnel
4. 写配置文件
Linux 推荐路径:
/etc/cloudflared/config.yml
sudo mkdir -p /etc/cloudflared
sudo nano /etc/cloudflared/config.yml
内容:
tunnel: <TUNNEL-UUID>
credentials-file: /root/.cloudflared/<TUNNEL-UUID>.json
ingress:
- hostname: app.example.com
service: http://127.0.0.1:8080
- service: http_status:404
注意:credentials-file 的实际路径取决于你用哪个用户执行 tunnel login/create(通常在 ~/.cloudflared/ 下)。你也可以把 json 拷贝到 /etc/cloudflared/,然后改路径即可。
5. 创建 DNS 路由
cloudflared tunnel route dns my-tunnel app.example.com
6. 前台运行
cloudflared tunnel run my-tunnel
7. (可选)设置为 systemd 常驻服务
sudo cloudflared service install
sudo systemctl enable --now cloudflared
sudo systemctl status cloudflared
macOS(Homebrew)
1. 安装
brew install cloudflare/cloudflare/cloudflared
cloudflared --version
2. 登录授权
cloudflared tunnel login
3. 创建 Tunnel
cloudflared tunnel create my-tunnel
4. 写配置文件
macOS 默认在:
~/.cloudflared/config.yml
nano ~/.cloudflared/config.yml
内容:
tunnel: <TUNNEL-UUID>
credentials-file: /Users/<你的用户名>/.cloudflared/<TUNNEL-UUID>.json
ingress:
- hostname: app.example.com
service: http://127.0.0.1:8080
- service: http_status:404
5. 创建 DNS 路由
cloudflared tunnel route dns my-tunnel app.example.com
6. 运行
cloudflared tunnel run my-tunnel
Docker(推荐做法:Token 方式,无需配置文件)
1. 创建 tunnel:
cloudflared tunnel login
cloudflared tunnel create my-tunnel
cloudflared tunnel route dns my-tunnel app.example.com
2. 获取 token(Cloudflare 会给一个很长的 token):
cloudflared tunnel token my-tunnel
3. Docker 运行(把 <TOKEN> 换掉;把服务地址换成你的容器名或宿主地址):
如果你的业务服务在同一个 docker network 里,假设服务容器名叫 myapp,端口 8080:
docker network create cfnet
docker run -d --name myapp --network cfnet -p 8080:8080 your-app-image
docker run -d --name cloudflared --network cfnet \
cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <TOKEN>
注意:Token 方式不需要你在容器里写 config.yml。子域名的 ingress 规则一般在 Cloudflare Zero Trust 的 Tunnel 配置里完成(更直观)。
多子域名/多服务怎么写
如果你想一条 tunnel 暴露多个服务(例如后台+API+监控),配置文件 ingress 写成这样:
ingress:
- hostname: app.example.com
service: http://127.0.0.1:8080
- hostname: api.example.com
service: http://127.0.0.1:9000
- hostname: grafana.example.com
service: http://127.0.0.1:3000
- service: http_status:404
然后分别做 DNS 路由:
cloudflared tunnel route dns my-tunnel app.example.com
cloudflared tunnel route dns my-tunnel api.example.com
cloudflared tunnel route dns my-tunnel grafana.example.com
阅读原文:原文链接
该文章在 2026/2/11 11:15:27 编辑过