说明:本文用 blog.126330.xyz 作为访问域名、346330.xyz 作为加速域名来演示。示例里的 blog.126330.xyz 目前是本站的 GitHub Pages 域名;GitHub Pages 不能运行 cloudflared,所以这是一篇方法教程,适用于你在 NAS、家里电脑或云服务器上通过 Cloudflare Tunnel 暴露的服务。不要直接照搬去改现有博客的 DNS。

Cloudflare Tunnel 很好用:不用公网 IP、不用端口映射,装个 cloudflared 就能把本地服务暴露到公网。但它默认走 Cloudflare 分配的边缘节点,国内访问不一定快。这个方案要解决的就是「Tunnel 已经通了,但访问速度不理想」的问题。

思路不复杂:用 Cloudflare for SaaS 的「自定义主机名 + 回退源」把访问域名挂到 Tunnel 上,再让访问域名走一个「优选域名」的 Cloudflare IP。

一、角色与链路

先约定本文用到的几个域名,后面每一步都对应这张表:

角色 本文示例 说明
访问域名 126330.xyz 用户最终访问的域名
访问主机名 blog.126330.xyz 真正对外提供服务的地址
加速域名 346330.xyz Tunnel 和 SaaS 配置所在的 Cloudflare zone
Tunnel 主机名 / 回退源 blog.346330.xyz 指向 cloudflared 的公网主机名
自定义主机名 blog.126330.xyz 在 SaaS 里登记的访问主机名
优选记录 speedup.346330.xyz 指向公共优选域名的中转记录
优选域名 cloudflare.182682.xyz 等 第三方维护的 Cloudflare 优选 CNAME
Tunnel 目标 <tunnel-id>.cfargotunnel.com Cloudflare 自动生成的隧道 CNAME

最终链路:

1
2
3
4
5
6
7
8
9
10
用户
→ blog.126330.xyz
→ speedup.346330.xyz
→ cloudflare.182682.xyz(优选 Cloudflare IP)
→ Cloudflare Edge(SNI 仍是 blog.126330.xyz)
→ SaaS 自定义主机名
→ 回退源 blog.346330.xyz
→ <tunnel-id>.cfargotunnel.com
→ cloudflared
→ 本地服务(NAS / 电脑 / 云服务器)

关键点在于:优选域名只负责把 DNS 解析到更快的 Cloudflare 边缘 IP,不改变浏览器发出的 SNI。 浏览器访问的仍然是 blog.126330.xyz,Cloudflare 边缘根据 SNI 找到 SaaS 里的自定义主机名,再回源到 Tunnel。

二、前置条件

动手前确认这几件事:

  1. 有一个可以正常工作的 Cloudflare Tunnel,或者你准备现在创建一个。
  2. 加速域名 346330.xyz 已经接入 Cloudflare,并且能打开 SSL/TLS → 自定义主机名(Cloudflare for SaaS)菜单。
  3. 访问域名 126330.xyz 的 DNS 可控。126330.xyz 和 346330.xyz 最好是两个不同的域名或不同的 zone,避免 CNAME 和代理状态互相干扰。
  4. Cloudflare for SaaS 的自定义主机名有免费额度/套餐限制,具体以你的控制台为准。
  5. 本地服务已经在运行,例如 http://localhost:8080。

三、第一步:在加速域名上配置 Tunnel

进入 Cloudflare Zero Trust → Networks → Tunnels,新建一个隧道,名字填 blog,按提示在目标机器上安装并运行 connector。

然后给隧道添加一个 Public Hostname:

1
2
主机名:blog.346330.xyz
服务:http://localhost:8080

如果使用本地 config.yml 管理隧道,可以写成:

1
2
3
4
5
6
7
tunnel: <tunnel-id>
credentials-file: C:\Users\you\.cloudflared\<tunnel-id>.json

ingress:
- hostname: blog.346330.xyz
service: http://localhost:8080
- service: http_status:404

Cloudflare 会自动在 346330.xyz 里生成一条 DNS 记录:

1
blog.346330.xyz  CNAME  <tunnel-id>.cfargotunnel.com  (代理 / 橙云)

这条记录必须保持代理开启。cfargotunnel.com 的 CNAME 只在 Cloudflare DNS 里、并且开启代理时才有效。

先访问 https://blog.346330.xyz,确认 Tunnel 本身是通的。如果这一步不通,后面的 SaaS 配置没有意义。

四、第二步:开启 SaaS 并设置回退源

进入 346330.xyz → SSL/TLS → 自定义主机名(Cloudflare for SaaS)。

1. 设置回退源

把「回退源」填成:

1
blog.346330.xyz

回退源必须是当前 zone 里的一条代理 DNS 记录,并且状态要变成「有效」。它负责接收所有没有单独指定源服务器的自定义主机名流量。

2. 添加自定义主机名

点击「添加自定义主机名」,填入访问主机名:

1
blog.126330.xyz

Cloudflare 会要求验证这个主机名的归属。选择 TXT 验证,它会给出类似下面的一组记录:

1
2
3
名称:_cf-custom-hostname.blog.126330.xyz
类型:TXT
值:<Cloudflare 生成的一串验证值>

先把这组记录记下来,下一步要加到 126330.xyz 的 DNS 里。

3. 设置回源 Host(很关键)

在自定义主机名的「源服务器」设置里,建议把 Origin Host Header 设为:

1
blog.346330.xyz

原因是:Tunnel 的 ingress 默认按 Host 匹配。如果让 Tunnel 收到 blog.126330.xyz,而它只发布了 blog.346330.xyz,就可能直接返回 404。把回源 Host 固定成回退源,Tunnel 就能匹配到正确的路由。

如果不想改 Origin Host Header,也可以在 Tunnel 的 ingress 最后加一条 catch-all:

1
- service: http://localhost:8080

两种做法选一种即可,推荐前者,边界更清晰。

五、第三步:完成证书验证

回到 126330.xyz 的 DNS,添加刚才拿到的 TXT 记录:

1
_cf-custom-hostname.blog.126330.xyz  TXT  <Cloudflare 生成的值>

这条记录只用于验证,保持「仅 DNS」即可。添加后回到 Cloudflare 的自定义主机名页面,等证书状态从「正在初始化」变成「有效」。

视频里还演示了 DCV 委派。Cloudflare 会在自定义主机名详情里给出一条类似下面的记录:

1
_acme-challenge.blog.126330.xyz  CNAME  <Cloudflare 提供的 DCV 目标>

把这条 CNAME 也加到 126330.xyz 的 DNS 里。它的作用是让 Cloudflare 之后可以自动续期证书,不用每次手动改 TXT。不是所有账户/界面都会显示这一步,有就加,没有就按控制台提示走。

证书签发后,blog.126330.xyz 在 Cloudflare 那边就已经是一个有效的主机名了。但此时它还没有指向加速线路,下一步才做。

六、第四步:添加优选记录

公共优选域名的原理是:这些域名由第三方维护,会解析到一批当前延迟较低的 Cloudflare 边缘 IP。你把 CNAME 指过去,DNS 就会返回这些 IP。

在 346330.xyz 的 DNS 里新增:

1
speedup.346330.xyz  CNAME  cloudflare.182682.xyz  (仅 DNS / 灰云)

cloudflare.182682.xyz 是视频里用的优选域名之一,支持 IPv4/IPv6,更新频率较高。类似的还有:

  • www.visa.cn
  • bestcf.top
  • cdn.2020111.xyz
  • cfip.cfcdn.vip
  • *.cf.licdn.top

这些域名来自第三方维护的公共列表(视频里用的是 WeTest.vip 的 Cloudflare 优选域名页,文末有链接)。它们不是 Cloudflare 官方服务,可用性和速度会变化,建议:

  • 选更新频率高的;
  • 自己用 dig 或测速工具验证解析结果;
  • 发现变慢或解析失败时,换一个优选域名;
  • TTL 不要设太长,方便切换。

这条记录要设为「仅 DNS」(灰云),不要开代理。 如果开代理,Cloudflare 会用自己的边缘 IP 覆盖 CNAME 的解析结果,优选域名的意义就没了。

七、第五步:把访问域名指向加速记录

最后,在 126330.xyz 的 DNS 里,把访问主机名指到刚才的优选记录:

1
blog.126330.xyz  CNAME  speedup.346330.xyz  (仅 DNS / 灰云)

如果 126330.xyz 也在 Cloudflare,这条 CNAME 同样建议设为「仅 DNS」。开代理会让 Cloudflare 用它自己的边缘,削弱优选线路的效果;保持灰云,浏览器才能拿到 speedup 解析出的优选 IP。

如果 126330.xyz 不在 Cloudflare,按普通 CNAME 添加即可,DNS 服务商会返回 CNAME 链。

等 DNS 生效后,访问:

1
https://blog.126330.xyz

此时浏览器看到的证书应该是 blog.126330.xyz 的证书,流量路径则是:

1
2
blog.126330.xyz → speedup.346330.xyz → 优选域名 → Cloudflare Edge
→ SaaS 自定义主机名 → 回退源 blog.346330.xyz → Tunnel → 本地服务

八、DNS 记录总表

把本文的配置汇总成一张表,方便对照:

位置 名称 类型 值 代理状态
346330.xyz blog CNAME <tunnel-id>.cfargotunnel.com 代理(橙云)
346330.xyz speedup CNAME cloudflare.182682.xyz 仅 DNS(灰云)
126330.xyz _cf-custom-hostname.blog TXT Cloudflare 给出的验证值 仅 DNS
126330.xyz _acme-challenge.blog CNAME Cloudflare 给出的 DCV 目标(可选) 仅 DNS
126330.xyz blog CNAME speedup.346330.xyz 仅 DNS(灰云)

在 Cloudflare 的 SaaS 页面里对应:

配置项 值
回退源(Fallback Origin) blog.346330.xyz
自定义主机名(Custom Hostname) blog.126330.xyz
回源 Host(Origin Host Header) blog.346330.xyz
证书验证方式 TXT
证书自动续期 建议开启 / 添加 DCV 委派

九、验证与排错

1. 检查 DNS

1
2
3
dig +short blog.126330.xyz
dig +short speedup.346330.xyz
dig +short blog.346330.xyz

Windows 可以用:

1
2
Resolve-DnsName blog.126330.xyz
Resolve-DnsName speedup.346330.xyz

你应该能看到 blog.126330.xyz 的 CNAME 指向 speedup.346330.xyz,再指向优选域名,最终返回 Cloudflare 的 IP。

2. 检查 HTTP 和证书

1
2
curl -I https://blog.126330.xyz
curl -v https://blog.126330.xyz 2>&1 | grep -E 'subject|issuer|SSL'

正常应该返回 200,证书颁发者是 Cloudflare 或其上游 CA,证书域名是 blog.126330.xyz。

3. 检查 Tunnel

Cloudflare Zero Trust → Networks → Tunnels,确认隧道状态是 Healthy;在 Tunnel 的日志里能看到请求。

4. 常见错误

现象 可能原因 处理
Tunnel 返回 404 Tunnel 的 Host 匹配不到 把自定义主机名的 Origin Host Header 设为回退源,或在 ingress 加 catch-all
1033 错误 Tunnel 没连上,或回退源没开代理 检查 connector、DNS 代理状态
525 / 526 SSL/TLS 模式不对 用 Full 或 Full (strict),不要 Flexible
证书一直「正在初始化」 TXT 没生效 / DCV 没配 检查 _cf-custom-hostname 记录,必要时加 DCV CNAME
1000 / 1016 DNS 指向了受限 IP,或 CNAME 冲突 用 SaaS 自定义主机名接入,不要直接普通 CNAME
403 / 1020 WAF / 防火墙拦截 查看 Security Events,放行对应 hostname
能打开但很慢 优选域名线路变差 换一个优选域名,更新 speedup 记录

十、注意事项

  1. 示例域名和实际博客要分清。 本文的 blog.126330.xyz 是演示用的访问主机名;本站目前仍然是 GitHub Pages,不在 Tunnel 后面。GitHub Pages 不能跑 cloudflared,不要把现有博客的 DNS 直接改掉。
  2. Cloudflare for SaaS 有配额/套餐限制。 免费额度、额外主机名费用以控制台为准;如果看不到「自定义主机名」菜单,说明当前账户/套餐不支持。
  3. 公共优选域名不是官方服务。 它们由第三方维护,可能失效、被阻断或解析到不理想的 IP;不要把它当成长期稳定的基础设施。参考文章里也提到过公共优选域名出现解析失败、301/409 等情况。
  4. 优选域名只参与 DNS 解析。 TLS 仍然在 Cloudflare 边缘终止,优选域名提供方看不到你的 HTTPS 内容;但仍建议选择可信来源。
  5. Tunnel 暴露的是内网服务。 如果是 NAS 管理后台、数据库、私有网盘等敏感服务,建议叠加 Cloudflare Access 或应用本身的认证,不要只靠“域名没人知道”。
  6. 遵守 Cloudflare 的使用条款。 不要用这套方案承载违规内容;公共优选 IP 的做法属于社区实践,Cloudflare 不保证其稳定性,也不官方推荐直接 A 记录到它的边缘 IP。
  7. 先备份现有 DNS。 改 126330.xyz 之前,把现有记录截图或导出;一旦 CNAME 配错,博客或其它子域名可能受影响。

十一、参考链接

这套方案的核心就一句话:Tunnel 负责把本地服务送上网,SaaS 自定义主机名负责让访问域名合法地回源,优选域名负责让 DNS 解析到更快的 Cloudflare 边缘。 三者各司其职,配置一次之后,后面主要维护的就是优选记录和证书状态。