2
0

Cloudflare Tunnel 反向代理教程:没有公网 IP 也能建站(手把手喂饭版)

2026-08-03
摘要:

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 账号

  1. 打开浏览器,访问:https://dash.cloudflare.com/sign-up
  2. 输入邮箱和密码,点注册
  3. 去邮箱收验证邮件,点确认链接
  4. 完成!你会进入 Cloudflare 控制台首页

⏱️ 全程约 2 分钟。如果打不开网站……你懂的,自备梯子。


三、第二步:把域名托管给 Cloudflare(改 NS 记录)

这一步是把你的域名"交给" Cloudflare 管理。只改服务器的名字,域名所有权还是你的。

3.1 添加站点

  1. 在 Cloudflare 控制台首页,点 "Add a site"(添加站点)
  2. 输入你的域名,比如 example.com,点继续
  3. 套餐选择 Free(免费),点继续
  4. Cloudflare 会扫描你的 DNS 记录,先不用管,直接点继续

3.2 修改域名的 NS 记录(关键步骤!)

  1. Cloudflare 会给你 两个 NS 地址,长这样:
    ada.ns.cloudflare.com bob.ns.cloudflare.com
  2. 登录你买域名的网站(阿里云就去阿里云控制台,Namesilo 就去 Namesilo)
  3. 找到你的域名 → DNS 管理 / 修改 DNS 服务器 / Nameserver 设置
  4. 把原来的 NS 地址全部删掉,填上 Cloudflare 给你的那两个
  5. 保存

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 安装

  1. 下载:https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-windows-amd64.exe
  2. 把下载的文件重命名为 cloudflared.exe,放到 C:\cloudflared\ 文件夹
  3. 在文件夹地址栏输入 cmd 回车,打开命令行
  4. 验证:
    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 件事:

  1. 域名托管到 Cloudflare(改 NS,一次性)
  2. 本机装 Halo(Docker 一条命令)
  3. 装 cloudflared 并建隧道(login → create → route dns)
  4. 写 config.yml 并启动(管道转发到 8090)

之后不管 Halo 怎么更新、怎么重启,只要 cloudflared 服务在跑,你的博客就永远在线。

最终架构:

访客 → https://blog.example.com → Cloudflare CDN → 隧道 → localhost:8090 → Halo

祝你的博客顺利上线!🎉


如果你按照本教程成功建站,欢迎在评论区分享你的域名,我去参观~

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论