前言

前几天做了一个自己收集微信文章的小工具(有感兴趣的朋友欢迎来看 https://github.com/liang1057/TailoredArticle ),但是只能在家里的局域网跑跑才行,脱离局域网就玩不转了。于是就想到可以找找网络穿透的工具,用了豆包和文心一言,不得不说,文心一言浪费了我两个小时。豆包帮我搞定了。

当然,两者都是我已经推荐的Cloudflare Tunnel(cloudflared,CF),这个工具完全免费不限流量,自带CDN、自动签发HTTPS证书,不用路由器端口映射,不用公网IP,Windows环境就能一键部署,还支持单条隧道同时发布多个本地服务。

本文记录完整实操踩坑全过程,从安装、授权、域名绑定、排错到多服务分流、开机自启。不要相信小白照着复制命令就能落地。我也是让豆包反复确认,在控制台和豆包之间来回搞,再加上我的理解。(实际上龙虾应该能搞定这个吧,我没有试过,有懂的大神指导一下)

环境与前置准备

  1. 操作系统:Windows 11
  2. 域名:已注册域名,并把域名NS服务器修改为Cloudflare官方NS(域名注册商仅用来续费,解析托管到CF)。我是用的 dnshe.com,大概是免费用1年
  3. 工具:cloudflared,无需额外安装Nginx、Caddy,比较适合简单的场景
  4. 优势总结
    • 免费、据说无流量限制
    • 自动HTTPS加密
    • 无需公网IP、不用光猫桥接、不用路由器放行端口
    • 单隧道支持多个本地Web服务同时公网发布
    • 可安装系统后台服务,开机自动重连

一、下载并安装cloudflared客户端

1.1 官方下载地址

Cloudflare官方下载页:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
根据系统选择Windows amd64版本,下载exe可执行文件。

验证安装,新开CMD执行:

cloudflared --version

输出版本号即代表环境配置成功。

二、账号授权与隧道创建

2.1 Cloudflare账号授权

CMD执行授权命令,会自动拉起浏览器,登录你的Cloudflare账号,并选中托管的域名完成授权:

cloudflared tunnel login

授权完成后,用户目录下.cloudflared文件夹自动生成授权证书cert.pem,不要删除、不要手动修改。
我是使用的谷歌账号登录的,这样更方便。

2.2 创建持久化隧道

自定义隧道名称(示例tunnel-web),执行创建命令:

cloudflared tunnel create tunnel-web

执行成功会返回两组关键信息,务必复制留存:

  1. 隧道唯一UUID(一串长随机字符)
  2. 自动生成凭证文件:UUID.json,存放在C:\Users\用户名\.cloudflared\下

⚠️ 重要提醒:不要手动重命名这个UUID.json凭证文件,改名会直接导致隧道鉴权失败,无法连接云端。

/ 之前文心一言给我瞎指挥,这里就弄的不对(当然,还不止这一点。不过也不能说文心一言不对,也可能我的提问也是有问题) /
查看已创建隧道列表,确认创建成功:

cloudflared tunnel list

三、域名DNS绑定

3.1 访问返回1003记录冲突报错

我遇到这个问题花了一点时间。
执行域名绑定命令时大概率抛出code:1003,同名A/CNAME记录已存在报错。
原因:该子域名在Cloudflare后台DNS面板已经存在旧解析记录,命令无法自动新增隧道专属CNAME。

3.2 两种解决方案

方案1:CF后台手动删除冲突旧记录(推荐)
  1. 登录Cloudflare控制台,进入域名DNS-记录列表
  2. 找到对应子域名的A/CNAME记录,直接删除(确认旧服务不再使用该域名)
  3. 重新执行域名绑定命令:
cloudflared tunnel route dns tunnel-web blog.xxx.com

输出Added CNAME即绑定成功,CF后台自动生成隧道CNAME解析,默认开启CDN代理。

方案2:更换全新未占用子域名(这个我也试了,这样就是麻烦一些,其实没必要)

不想改动原有解析,直接换新子域名执行绑定即可,后续配置同步修改hostname。

四、编写隧道配置文件config.yml

进入用户目录下.cloudflared文件夹,新建config.yml配置文件,填写隧道UUID、凭证路径和转发规则。

4.1 单服务基础配置模板

# 替换为你的隧道UUID
tunnel: "你的隧道UUID字符串"
# 完整填写自动生成的UUID.json路径,不要手动改名
credentials-file: "C:\Users\用户名\.cloudflared\你的UUID.json"

# 流量转发规则
ingress:
  - hostname: blog.xxx.com
    service: http://127.0.0.1:8080
  # 兜底规则必须放在最后,不可删除
  - service: http_status:404

4.2 配置语法校验

修改配置后先校验语法,避免格式写错无法启动:

cloudflared tunnel ingress validate

输出Validation passed代表配置无误。

五、启动隧道、网络协议排错(QUIC UDP被拦截)

国内运营商、局域网防火墙大概率拦截UDP 7844端口,默认QUIC协议会反复重连报错,日志持续打印context canceled,需要强制切换HTTP2协议启动。

5.1 前台测试启动(调试用)

cloudflared tunnel --protocol http2 --config "C:\Users\用户名\.cloudflared\config.yml" run tunnel-web

看到日志输出Connection registered successfully,代表本地客户端成功连上Cloudflare边缘节点。

此时浏览器访问https://blog.xxx.com,即可公网访问本机127.0.0.1:8080服务,自动带HTTPS安全绿锁。

常见报错:Failed to get tunnel

触发原因:手动修改了UUID.json凭证文件名、配置内凭证路径填写错误,云端鉴权不通过。
解决办法:

  1. 删除旧的cert.pem、改名后的凭证文件
  2. 重新执行cloudflared tunnel login授权,重建隧道
  3. 配置文件严格指向原始UUID.json完整路径,不再手动修改文件名。

六、单隧道同时发布多个本地Web服务

不用新建多条隧道,同一条隧道通过ingress按子域名分流,同时转发本机多个端口服务。

6.1 多域名分流配置示例(推荐)

修改config.yml,追加多条hostname规则,一个子域名对应一个本地端口:

tunnel: "你的隧道UUID字符串"
credentials-file: "C:\Users\用户名\.cloudflared\你的UUID.json"

ingress:
  # 服务1:博客站点
  - hostname: blog.xxx.com
    service: http://127.0.0.1:8080
  # 服务2:后台管理系统
  - hostname: admin.xxx.com
    service: http://127.0.0.1:9000
  # 服务3:API接口服务
  - hostname: api.xxx.com
    service: http://127.0.0.1:9090
  - service: http_status:404

6.2 新增子域名DNS绑定

每个新增子域名执行一次绑定命令:

cloudflared tunnel route dns tunnel-web admin.xxx.com
cloudflared tunnel route dns tunnel-web api.xxx.com

6.3 同域名路径分流(无需新增子域名)

不想申请多个子域名,通过URL路径区分后端服务:

tunnel: "你的隧道UUID字符串"
credentials-file: "C:\Users\用户名\.cloudflared\你的UUID.json"

ingress:
  - hostname: blog.xxx.com
    path: /admin
    service: http://127.0.0.1:9000
  - hostname: blog.xxx.com
    path: /api
    service: http://127.0.0.1:9090
  - hostname: blog.xxx.com
    service: http://127.0.0.1:8080
  - service: http_status:404

访问规则:

  • https://blog.xxx.com → 本机8080端口
  • https://blog.xxx.com/admin → 本机9000端口
  • https://blog.xxx.com/api → 本机9090端口

七、Windows安装系统后台服务,开机自启

前台CMD启动只能临时调试,关闭窗口隧道就断开。最好是安装为Windows系统服务,后台静默运行,电脑重启自动重连。

7.1 管理员CMD执行安装命令

cloudflared.exe service install --protocol http2 --config "C:\Users\用户名\.cloudflared\config.yml"

7.2 服务启停运维命令

# 启动隧道服务
net start cloudflared
# 停止隧道服务
net stop cloudflared
# 修改config.yml配置后重载生效
net stop cloudflared && net start cloudflared

7.3 查看运行日志

事件查看器 → Windows日志 → 应用程序,筛选cloudflared即可查看完整运行日志,排查断线、访问异常问题。

八、完整踩坑总结

  1. ❌ 不要手动重命名自动生成的UUID.json凭证文件,路径写错直接鉴权失败;
  2. ❌ 国内网络不要默认QUIC协议,必须加--protocol http2强制TCP连接;
  3. ❌ 执行route dns域名绑定前,先清理CF后台同名旧DNS记录,规避1003报错;
  4. ✅ 单隧道可无限追加多个Web服务,仅修改ingress配置,无需新建隧道;
  5. ✅ 隧道是客户端主动出站连接,路由器、光猫无需做任何端口映射,内网防火墙仅放行出站流量即可。

九、个人感觉的适用范围与局限性

适用场景

  • 本地开发接口、前端项目公网临时演示
  • 个人小站点、内网后台长期公网部署
  • 小程序、公众号本地调试公网回调地址

局限性

  • 仅原生支持HTTP/HTTPS Web服务分流,TCP、SSH、数据库端口转发需要额外参数配置;
  • 免费版CF节点访问速度受运营商线路影响,追求极低延迟建议搭配自选节点方案。我对延迟容忍度很高,所以感觉还是不错的。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐