Cloudflare Tunnel:零成本给 localhost 一个公网身份

作者:烁皓 (@eternityspring)
发布时间:2026 年 5 月 17 日 下午 12:27
原文链接:https://x.com/eternityspring/status/2055867694298419451
如果你在本地跑了一个服务,需要分享给客户或者其他人,亦或是项目需要对接支付回调,用 Cloudflare Tunnel 是目前最省事的方案。免费、不需要公网 IP、自带 HTTPS。
1. 安装 cloudflared
先装官方客户端:
macOS
brew install cloudflaredLinux
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb2. 临时公网(先试水,最快上手)
假设本地服务跑在 http://localhost:3000,一行命令:
cloudflared tunnel --url http://localhost:3000输出会给你一个临时域名:
https://xxxxx.trycloudflare.com打开就能访问,整个过程 30 秒。
缺点:域名每次重启会变,只适合临时演示和调试。要长期用,看下一节。
3. 长期稳定域名(正式玩法)
前置条件:你有一个域名,并已经托管在 Cloudflare(即 DNS 用 Cloudflare 解析)。
3.1 登录 Cloudflare
cloudflared tunnel login会自动打开浏览器,让你选择要授权的域名:

授权 Cloudflare Tunnel
选好之后回到终端,会提示授权完成。
3.2 创建 Tunnel
给隧道起个名字(比如 TimeSugar):
cloudflared tunnel create TimeSugar终端会输出 Tunnel ID 和凭证文件路径:

创建 Tunnel
凭证文件长这样:~/.cloudflared/{tunnel-id}.json,别泄露,等同于隧道的钥匙。
3.3 绑定域名
把这个 Tunnel 关联到你想用的域名:
cloudflared tunnel route dns TimeSugar al.timesugar.com这条命令会自动在 Cloudflare 上创建对应的 CNAME 记录,不用手动去后台点:

绑定域名
3.4 配置 YAML
创建配置文件:
touch ~/.cloudflared/config.yml写入内容(注意把 tunnel、credentials-file、hostname 换成自己的):
tunnel: TimeSugar
credentials-file: /Users/wesley/.cloudflared/xxxxx.json
ingress:
- hostname: al.timesugar.com
service: http://localhost:3008
- service: http_status:404
config.yml 配置
service: http://localhost:3008 对应的是本地服务。
最后那条 http_status:404 是兜底:任何没匹配上的请求统一返回 404。
3.5 启动
cloudflared tunnel run TimeSugar终端会打出连接日志,看到 Initial protocol quic 和几条 INF 就说明已经连上 Cloudflare 边缘节点:

启动 Tunnel
现在 https://al[.]timesugar.com 已经映射到本地 localhost:3008。HTTPS 证书 Cloudflare 自动签发,不用管。
4. 开机自动运行(可选)
macOS 运行:
brew services start cloudflaredLinux 运行:
sudo systemctl enable cloudflared
sudo systemctl start cloudflared5. 常见踩坑
Q1: 报错 Blocked request. This host is not allowed.
本地服务(比如 Vite、Next.js dev server)默认禁止未知 Host。两种解法:
- Vite:
vite.config.js里加server.allowedHosts: ['al.timesugar.com'] - Next.js:用
next dev -H 0.0.0.0或者改next.config.js
Q2: 浏览器报 ERR_CONNECTION_REFUSED
本地服务根本没启动。先确认 curl http://localhost:3008 能通再来跑 tunnel。
Q3: localhost 能访问,公网打不开
服务只监听了 127.0.0.1,没监听 0.0.0.0。常见于 Python 的 flask run 默认只绑回环,加 --host 0.0.0.0 即可。
Q4: Unable to reach the origin service / connection refused
本机防火墙没放开端口。macOS 检查“系统设置 → 网络 → 防火墙”;Linux 用 ufw allow 3008 或检查 iptables。
一句话总结
trycloudflare.com 临时域名适合调试,tunnel create + config.yml + tunnel run 三件套适合长期。整个过程不用买 VPS、不用公网 IP,免费用到底。
如果觉得本文有帮助,就动动给「烁皓」点个关注,不迷路!