Go Back

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

最后编辑: 2026-05-23 23:30
封面图

作者:烁皓 (@eternityspring)
发布时间:2026 年 5 月 17 日 下午 12:27
原文链接:https://x.com/eternityspring/status/2055867694298419451

如果你在本地跑了一个服务,需要分享给客户或者其他人,亦或是项目需要对接支付回调,用 Cloudflare Tunnel 是目前最省事的方案。免费、不需要公网 IP、自带 HTTPS。

1. 安装 cloudflared

先装官方客户端:

macOS

bash
brew install cloudflared

Linux

bash
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

2. 临时公网(先试水,最快上手)

假设本地服务跑在 http://localhost:3000,一行命令:

bash
cloudflared tunnel --url http://localhost:3000

输出会给你一个临时域名:

text
https://xxxxx.trycloudflare.com

打开就能访问,整个过程 30 秒。

缺点:域名每次重启会变,只适合临时演示和调试。要长期用,看下一节。

3. 长期稳定域名(正式玩法)

前置条件:你有一个域名,并已经托管在 Cloudflare(即 DNS 用 Cloudflare 解析)。

3.1 登录 Cloudflare

bash
cloudflared tunnel login

会自动打开浏览器,让你选择要授权的域名:

授权 Cloudflare Tunnel

授权 Cloudflare Tunnel

选好之后回到终端,会提示授权完成。

3.2 创建 Tunnel

给隧道起个名字(比如 TimeSugar):

bash
cloudflared tunnel create TimeSugar

终端会输出 Tunnel ID 和凭证文件路径:

创建 Tunnel

创建 Tunnel

凭证文件长这样:~/.cloudflared/{tunnel-id}.json,别泄露,等同于隧道的钥匙。

3.3 绑定域名

把这个 Tunnel 关联到你想用的域名:

bash
cloudflared tunnel route dns TimeSugar al.timesugar.com

这条命令会自动在 Cloudflare 上创建对应的 CNAME 记录,不用手动去后台点:

绑定域名

绑定域名

3.4 配置 YAML

创建配置文件:

bash
touch ~/.cloudflared/config.yml

写入内容(注意把 tunnel、credentials-file、hostname 换成自己的):

yaml
tunnel: TimeSugar
credentials-file: /Users/wesley/.cloudflared/xxxxx.json

ingress:
  - hostname: al.timesugar.com
    service: http://localhost:3008
  - service: http_status:404
config.yml 配置

config.yml 配置

service: http://localhost:3008 对应的是本地服务。

最后那条 http_status:404 是兜底:任何没匹配上的请求统一返回 404。

3.5 启动

bash
cloudflared tunnel run TimeSugar

终端会打出连接日志,看到 Initial protocol quic 和几条 INF 就说明已经连上 Cloudflare 边缘节点:

启动 Tunnel

启动 Tunnel

现在 https://al[.]timesugar.com 已经映射到本地 localhost:3008。HTTPS 证书 Cloudflare 自动签发,不用管。

4. 开机自动运行(可选)

macOS 运行:

bash
brew services start cloudflared

Linux 运行:

bash
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,免费用到底。

如果觉得本文有帮助,就动动给「烁皓」点个关注,不迷路!