Cloudflare Tunnel 反向代理教程:没有公网 IP 也能建站(手把手喂饭版)
Cloudflare Tunnel 反向代理教程:没有公网 IP 也能建站(手把手喂饭版)
本文以 Halo 博客为例,教你把本机/内网服务器上的网站,通过 Cloudflare Tunnel 免费暴露到公网,不需要公网 IP、不需要路由器开端口、不需要备案。
一、先搞清楚三件事(很重要,看完再动手)
1. 什么是 Cloudflare Tunnel?
想象你的电脑在一个"门锁着的房间"里(内网),外面的人进不来。Cloudflare Tunnel 就是你在墙上凿了一条专属管道,管道的另一端由 Cloudflare 的服务器守着。别人访问你的网站时,流量先到 Cloudflare,再从管道悄悄送进你的房间。
好处:
- ✅ 不需要公网 IP(家庭宽带、校园网都能用)
- ✅ 不需要在路由器上做端口转发
- ✅ 不暴露你的真实 IP,防攻击
- ✅ 自带 HTTPS 证书,不用自己配
- ✅ 完全免费
2. 你需要准备什么?
| 材料 | 说明 | 花钱吗? |
|---|---|---|
| 一个域名 | 阿里云、腾讯云、Namesilo 等都行 | 一年几十块 |
| 一台能跑 Docker 的机器 | 你的电脑、旧笔记本、云服务器都行 | 看你 |
| Cloudflare 账号 | 免费注册 | 免费 |
💡 没有域名? 先花几十块钱买一个最便宜的
.top/.xyz域名,这一步省不了——Tunnel 必须绑定域名。
3. 整体流程长什么样?
浏览器用户 → Cloudflare 服务器(CDN) → 管道(cloudflared) → 你家的 Halo(8090端口)
你只需要在服务器上装一个叫 cloudflared 的小程序,它负责把 Cloudflare 发来的请求转发给本机的 Halo。
二、第一步:注册 Cloudflare 账号
- 打开浏览器,访问:https://dash.cloudflare.com/sign-up
- 输入邮箱和密码,点注册
- 去邮箱收验证邮件,点确认链接
- 完成!你会进入 Cloudflare 控制台首页
⏱️ 全程约 2 分钟。如果打不开网站……你懂的,自备梯子。
三、第二步:把域名托管给 Cloudflare(改 NS 记录)
这一步是把你的域名"交给" Cloudflare 管理。只改服务器的名字,域名所有权还是你的。
3.1 添加站点
- 在 Cloudflare 控制台首页,点 "Add a site"(添加站点)
- 输入你的域名,比如
example.com,点继续 - 套餐选择 Free(免费),点继续
- Cloudflare 会扫描你的 DNS 记录,先不用管,直接点继续
3.2 修改域名的 NS 记录(关键步骤!)
- Cloudflare 会给你 两个 NS 地址,长这样:
ada.ns.cloudflare.com bob.ns.cloudflare.com - 登录你买域名的网站(阿里云就去阿里云控制台,Namesilo 就去 Namesilo)
- 找到你的域名 → DNS 管理 / 修改 DNS 服务器 / Nameserver 设置
- 把原来的 NS 地址全部删掉,填上 Cloudflare 给你的那两个
- 保存
3.3 等待生效
改完 NS 后,回到 Cloudflare 页面点 "Check nameservers"。
生效时间通常几分钟到 24 小时,一般 10 分钟内就好了。页面变成绿色"Active"就说明成功。
😵 这步卡住的人最多。记住:NS 是在你买域名的地方改,不是改你网站的 DNS 解析记录。改的是"我的域名听谁指挥",不是"A 记录指向哪里"。
四、第三步:安装 Halo 博客(Docker 版)
Tunnel 只是"管道",管道那头得有个网站。我们先用 Docker 装 Halo。
4.1 安装 Docker(如果还没装)
Windows: 去 https://www.docker.com/products/docker-desktop/ 下载安装,一路下一步。
Linux(Ubuntu/Debian):
curl -fsSL https://get.docker.com | bash -s docker
sudo systemctl enable --now docker
验证:
docker --version
显示版本号就成功了。
4.2 用 Docker 跑 Halo
创建一个数据目录,然后启动:
# 创建 Halo 数据文件夹
mkdir -p ~/halo
# 启动 Halo(8090 端口)
docker run -d \
--name halo \
-p 8090:8090 \
-v ~/halo:/root/.halo2 \
-e JVM_OPTS="-Xmx256m -Xms256m" \
halohub/halo:2.25
注意:Halo 2.x 数据目录是
/root/.halo2,别挂错了。
验证: 浏览器打开 http://localhost:8090,能看到 Halo 初始化页面就成功了。先随便初始化一下,把博客搭起来。
💡 Halo 装好后,本机访问没问题,但外网访问不到——因为 Halo 只监听本机端口,且你的宽带没有公网 IP。下一步的 Tunnel 就是来解决这个的。
五、第四步:安装 cloudflared(管道客户端)
cloudflared 是 Cloudflare 官方的小程序,负责建立管道。
5.1 Linux 安装(Debian/Ubuntu)
# 添加 Cloudflare 软件源
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
# 安装
sudo apt-get update && sudo apt-get install -y cloudflared
# 验证
cloudflared --version
5.2 Windows 安装
- 下载:https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe
- 把下载的文件重命名为
cloudflared.exe,放到C:\cloudflared\文件夹 - 在文件夹地址栏输入
cmd回车,打开命令行 - 验证:
cmd cd C:\cloudflared cloudflared --version
🔧 国内下载 GitHub 慢?用镜像加速:把下载地址里的
github.com换成ghproxy.com/前缀,或者用你的梯子。
六、第五步:登录 Cloudflare 并创建隧道
6.1 登录授权
在服务器上执行(Windows 打开 CMD,Linux 打开终端):
cloudflared tunnel login
它会显示一个链接,复制到浏览器打开,选择你的域名,点授权。完成后,服务器上会生成一个证书文件 ~/.cloudflared/cert.pem,就代表登录成功了。
⚠️ 这一步必须在服务器本机上执行,浏览器授权只是确认"这台机器归你管"。
6.2 创建隧道
cloudflared tunnel create my-blog
这里的 my-blog 是隧道名字,可以随便起(别用中文)。成功后输出类似:
Tunnel credentials written to /root/.cloudflared/my-blog.json
记下你的隧道 ID(一串 UUID 长字符串),或者用名字代替,后面都要用。
验证:
cloudflared tunnel list
能看到 my-blog 就对了。
七、第六步:把域名指向隧道(DNS 记录)
执行下面命令,告诉 Cloudflare:"这个域名要接到我创建的隧道上":
cloudflared tunnel route dns my-blog blog.example.com
把 blog.example.com 换成你自己的域名(建议用子域名,比如 blog.yourname.com)。
成功后,去 Cloudflare 控制台 → DNS 页面,你会看到自动生成了一条记录:
类型: CNAME
名称: blog
目标: my-blog.cfargotunnel.com
代理状态: 已代理(橙色云朵) ⚡
✅ 这步是全自动的,你只需要在命令行里跑那一条命令。橙色云朵说明走了 Cloudflare 代理。
八、第七步:写配置文件(告诉管道往哪转)
cloudflared 需要一个配置文件,说明"收到哪个域名的请求,转发到本机哪个端口"。
创建文件 ~/.cloudflared/config.yml(Windows 是 C:\cloudflared\config.yml):
tunnel: my-blog
credentials-file: /root/.cloudflared/my-blog.json
ingress:
- hostname: blog.example.com
service: http://localhost:8090
- service: http_status:404
逐行解释(看仔细了):
| 配置项 | 含义 |
|---|---|
tunnel: my-blog |
指定用哪个隧道(名字) |
credentials-file: ... |
隧道凭证文件路径(创建隧道时生成的 .json) |
hostname: blog.example.com |
哪个域名走这个管道 |
service: http://localhost:8090 |
转发到本机 8090 端口(Halo 就在这) |
service: http_status:404 |
兜底规则:其他所有域名一律返回 404 |
⚠️ 最后一条
http_status:404必须要有!它是保险丝,没有它 cloudflared 会启动失败。
⚠️ Windows 用户把credentials-file路径改成你的实际路径,比如C:\cloudflared\my-blog.json。
九、第八步:启动隧道!
Linux(前台测试)
cloudflared tunnel run my-blog
看到 Registered tunnel connection 就说明管道建好了。先别关这个窗口,测试完再说。
Windows(前台测试)
cd C:\cloudflared
cloudflared tunnel run my-blog
测试访问
浏览器打开 https://blog.example.com:
- 🎉 看到你的 Halo 博客 → 成功!
- 😭 看到 502 / 页面打不开 → 看下面"常见问题"
⏳ 刚配置完 DNS,全球生效需要 1~5 分钟,别急。
十、第九步:设置开机自启(让管道永远在线)
前台跑着,一关电脑就断了。要让隧道后台运行、开机自动启动。
Linux(systemd 服务)
# 把服务注册到 systemd
sudo cloudflared service install
# 启动并设置开机自启
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
# 查看状态
sudo systemctl status cloudflared
Windows(计划任务或 NSSM)
最简单的方法:把启动命令写进一个 .bat 文件:
@echo off
cd C:\cloudflared
cloudflared tunnel run my-blog
然后用"任务计划程序"设置开机自动运行这个 bat 文件即可。想更省事可以搜"NSSM 把程序注册成 Windows 服务"。
十一、常见问题(报错看这里)
Q1:访问域名显示 502 Bad Gateway
管道通了,但后端没通。检查:
# Halo 还活着吗?
curl -s -o /dev/null -w "%{http_code}" http://localhost:8090
- 返回 200 → Halo 活着,检查 config.yml 里端口是不是 8090
- 连不上 → Docker 里
docker ps看 Halo 容器有没有挂
Q2:cloudflared 启动报 cannot determine default configuration path
没找到配置文件。确认 config.yml 放在 ~/.cloudflared/config.yml(Linux)或 C:\cloudflared\config.yml(Windows)。
Q3:报错 credentials file ... does not exist
config.yml 里 credentials-file 路径写错了。用 cloudflared tunnel list 看生成的 json 文件实际在哪,复制真实路径。
Q4:改了配置不生效?
重启隧道:
sudo systemctl restart cloudflared
Q5:手机流量能访问,家里 WiFi 打不开?
你家网络 DNS 缓存了旧记录,等几分钟,或者把手机连同一 WiFi 再试。
Q6:想要更快的国内访问?
Cloudflare 免费版国内访问速度一般。追求速度可以换 cdn.allstream.workers.dev 之类的优化方案,或者用国内 CDN + Tunnel 的进阶玩法——那是后话了。
十二、总结
你其实只做了 4 件事:
- 域名托管到 Cloudflare(改 NS,一次性)
- 本机装 Halo(Docker 一条命令)
- 装 cloudflared 并建隧道(login → create → route dns)
- 写 config.yml 并启动(管道转发到 8090)
之后不管 Halo 怎么更新、怎么重启,只要 cloudflared 服务在跑,你的博客就永远在线。
最终架构:
访客 → https://blog.example.com → Cloudflare CDN → 隧道 → localhost:8090 → Halo
祝你的博客顺利上线!🎉
如果你按照本教程成功建站,欢迎在评论区分享你的域名,我去参观~