# Cloudflare Tunnel:零成本给 localhost 一个公网身份
**作者**: 烁皓
**日期**: 2026-05-17T04:27:09.000Z
**来源**: [https://x.com/eternityspring/status/2055867694298419451](https://x.com/eternityspring/status/2055867694298419451)
---

如果你在本地跑了一个服务,需要分享给客户或者其他人,亦或是项目需要对接支付回调,用 Cloudflare Tunnel 是目前最省事的方案。免费、不需要公网 IP、自带 HTTPS。
## 1. 安装 cloudflared
先装官方客户端:
macOS
```
brew install cloudflared
```
Linu
> wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
> sudo dpkg -i cloudflared-linux-amd64.deb
# 2. 临时公网(先试水,最快上手)
假设本地服务跑在 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 cloudflared
```
Linux 运行:
```
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
```
## 5. 常见踩坑
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,免费用到底。
如果觉得本文有帮助,就动动给「烁皓」点个关注,不迷路!
## 相关链接
- [@eternityspring](https://x.com/eternityspring)
- [6.4K](https://x.com/eternityspring/status/2055867694298419451/analytics)
- [https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb](https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb)
- [timesugar.com](https://timesugar.com/)
- [al.timesugar.com](https://al.timesugar.com/)
- [trycloudflare.com](https://trycloudflare.com/)
- [Upgrade to Premium](https://x.com/i/premium_sign_up)
- [12:27 PM · May 17, 2026](https://x.com/eternityspring/status/2055867694298419451)
- [6,430 Views](https://x.com/eternityspring/status/2055867694298419451/analytics)
---
*导出时间: 2026/5/17 18:55:02*