华为云 DNS + Cloudflare:让博客大陆直连,境外走 CDN
当前网站访问架构
flowchart TD
V["访客访问<br/>xianou.com / www.xianou.com"]
DNS["华为云 DNS<br/>根据地区线路返回解析结果"]
CN["中国大陆<br/>全网默认 A 记录 → VPS IP"]
OVERSEA["大陆以外<br/>境外 CNAME → cdn.zha.me"]
CF["Cloudflare 边缘节点<br/>使用博客域名的边缘证书"]
VPS["日本 VPS · 1Panel / OpenResty<br/>保留现有源站证书"]
SITE["xianou.com:301 跳转到 www<br/>www.xianou.com:WordPress 博客"]
V --> DNS
DNS --> CN
DNS --> OVERSEA
CN -->|HTTPS 直连优化线路| VPS
OVERSEA --> CF
CF -->|需回源的请求:HTTPS,保留博客域名| VPS
CF -.->|可缓存资源命中时直接响应| V
VPS --> SITE
classDef direct fill:#eaf7f3,stroke:#209889,color:#192b41
classDef edge fill:#fff5e7,stroke:#e89026,color:#192b41
classDef origin fill:#eaf0fc,stroke:#708cbd,color:#192b41
class CN direct
class OVERSEA,CF edge
class VPS,SITE origin
方案背景
我的博客部署在日本 VPS,服务器线路对中国大陆访问做过优化。我希望大陆访客直接访问服务器,大陆以外的访客通过 Cloudflare,同时保留华为云 DNS 和 1Panel 上现有的网站配置。
这篇文章记录具体做法,根域名和 www 都可以配置分流,原来的“根域名 301 跳转到 www”也可以继续使用。
本文整理于 2026 年 10 月 21 日,基于我的实际配置和测试结果。文中的域名仅作示例,请替换成自己的域名。
一、先看懂这套方案
最终的访问方式如下:
中国大陆访客 → 日本 VPS → 博客
大陆以外访客 → Cloudflare → 日本 VPS → 博客
我们需要两个域名:
| 用途 | 本文示例 | DNS 放在哪里 |
|---|---|---|
| 博客域名 | xianou.com、www.xianou.com | 保留在华为云 |
| 辅助域名 | zha.me | 托管到 Cloudflare |
| 辅助域名下的接入名称 | cdn.zha.me | 在 Cloudflare 添加 |
cdn.zha.me 是境外解析的接入目标,也用于告诉 Cloudflare 源站在哪里。访客正常打开的仍然是博客域名。
不需要把博客域名的 NS 改成 Cloudflare,也不需要修改 WordPress 地址或 1Panel 网站绑定。
这属于 DNS 地区分流,通常根据递归 DNS 的位置以及是否携带访客网段信息判断地区,并不是每次都能精确识别访客实际位置。使用境外公共 DNS、代理或 VPN 时,结果可能不同。
二、开始前准备什么
- 博客在源站已经可以正常通过 HTTPS 打开,证书同时覆盖根域名和 www。
- 华为云已有根域名和 www 的“全网默认”A 记录,指向 VPS。
- 准备另一个可长期使用的辅助域名,以及 Cloudflare 账号。
- 截图或导出现有 DNS 记录,方便恢复。
本文使用 Cloudflare for SaaS 的“自定义主机名”功能。Free 套餐目前包含 100 个自定义主机名,启用时需要按页面要求添加付款方式;域名费用和额外付费功能另算。详情以 Cloudflare 套餐说明和启用说明为准。
本文的根域名分流依赖华为云对根域名 CNAME 的支持,不能直接套用到所有 DNS 服务商。如果根域名已有邮件、TXT 等业务,或开启了 DNSSEC,先核对兼容条件;控制台提示冲突时不要删除业务记录强行添加。根域名和 www 如果已有 AAAA 或更具体的地区线路,也需要检查,避免部分访问绕过预期线路。参见华为云记录冲突规则。
三、把辅助域名接入 Cloudflare
登录 Cloudflare 控制台,添加辅助域名 zha.me,选择适用的套餐。
在辅助域名的注册商处,把它的名称服务器改为 Cloudflare 提供的地址。如果辅助域名已有网站或邮箱,先把相关 DNS 记录完整迁入。
等待辅助域名显示“有效 / Active”后,进入它的 DNS → 记录,添加:
| 类型 | 名称 | 内容 | 代理状态 |
|---|---|---|---|
| A | cdn | 你的 VPS 公网 IPv4 | 已代理,橙云 |
这条记录需要保持橙云,TTL 使用自动即可。内容直接填写 VPS IP,不要填博客域名,避免形成回源循环。
这里改的是辅助域名,博客域名 xianou.com 仍使用华为云 DNS。
四、设置 HTTPS 和回退源
仍然在 Cloudflare 的辅助域名下操作。
1. 设置 SSL/TLS
进入 SSL/TLS → 概述,将加密模式设置为:
完整(严格) / Full (strict)
进入 SSL/TLS → 边缘证书,最低 TLS 版本设置为 1.2,TLS 1.3 保持开启。
“完整(严格)”会让 Cloudflare 通过 HTTPS 连接 VPS,并校验源站证书。源站继续使用 1Panel 上已有的有效证书即可。参见官方加密模式说明。
2. 添加回退源
进入 SSL/TLS → 自定义主机名,按页面要求启用 Cloudflare for SaaS。
找到 回退源 / Fallback Origin,填写:
cdn.zha.me
只填完整域名,不带 https://、端口或路径。点击添加,等状态变成“活动 / Active”后再继续。
五、添加根域名和 www,完成 TXT 验证
1. 分别添加两个自定义主机名
点击“添加自定义主机名”,按下面的设置添加两次:
| 设置 | 第一条 | 第二条 |
|---|---|---|
| 自定义主机名 | xianou.com | www.xianou.com |
| 最低 TLS 版本 | TLS 1.2 | TLS 1.2 |
| 证书类型 | 由 Cloudflare 提供 | 由 Cloudflare 提供 |
| 证书验证方法 | TXT 验证 | TXT 验证 |
| 源服务器 | 默认源服务器 | 默认源服务器 |
不用添加泛域名,也不用选择自定义源服务器。默认源服务器会使用刚才设置的回退源。
2. 去华为云添加验证 TXT
展开每个自定义主机名,复制 Cloudflare 给出的 TXT 名称和值,然后到 华为云 → 云解析服务 DNS → 博客域名 → 添加记录集。
主机记录填写规则如下:
| Cloudflare 显示的完整名称 | 华为云主机记录 | 用途 |
|---|---|---|
| _cf-custom-hostname.xianou.com | _cf-custom-hostname |
根域名归属验证 |
| _cf-custom-hostname.www.xianou.com | _cf-custom-hostname.www |
www 归属验证 |
| _acme-challenge.xianou.com | _acme-challenge |
根域名证书验证 |
| _acme-challenge.www.xianou.com | _acme-challenge.www |
www 证书验证 |
记录类型选 TXT,线路选 全网默认,TTL 可以设为 300 秒,记录值复制 Cloudflare 页面对应的内容。
华为云输入框右侧会自动补上 .xianou.com,所以不要在主机记录里重复填写完整域名。
页面显示几条验证信息,就按要求添加几条。有些归属验证已完成时,页面可能不再显示该项。
3. 同名 TXT 有两个值怎么办
我实际遇到的情况是:根域名由 SSL.com 签发,显示两个证书验证值;www 由 Google Trust Services 签发,当时只显示一个。
SSL.com 的 RSA 和 ECDSA 证书需要不同的验证值。不要自行判断应该有几个,以当前页面列出的全部值为准。参见Cloudflare 颁发机构说明。
在华为云的同一个 TXT 记录集中,每个验证值单独占一行,用英文半角双引号包裹:
"第一个验证值"
"第二个验证值"
上面只是格式示例,实际字符串从 Cloudflare 复制。不要用中文引号,也不要把两个值拼成一行。参见华为云 TXT 填写规则。
如果同名记录已经有其他值,只追加本次所需值,不能直接覆盖。根域名的值与 www 的值分开填写。
1Panel 申请证书时也可能使用这些
_acme-challenge名称。不要同时手动触发两边的证书申请;已有任务正在运行时,先等它完成。不要把_acme-challenge改成 CNAME 委派,以免影响现有的 1Panel DNS 验证。
4. 等待验证完成
保存 TXT 后,等待 DNS 生效,回到 Cloudflare 刷新。
确认根域名和 www 都满足:
- 证书状态:有效。
- 主机名状态:有效。
添加归属验证 TXT 前,可能出现 custom hostname does not CNAME to this zone 提示。先完成页面要求的预验证,不要急着删除原来的 A 记录。两个状态都有效后,再测试并切换境外解析。
六、先测试,再添加境外解析
1. 测试 Cloudflare 接入是否正常
Windows 打开终端,执行:
curl.exe -I -L --connect-to "xianou.com:443:cdn.zha.me:443" --connect-to "www.xianou.com:443:cdn.zha.me:443" https://xianou.com/
请把命令中的两个博客域名和 cdn.zha.me 都替换成自己的实际名称。
这个命令会让本次请求连接 Cloudflare,同时保留博客域名的请求信息和正常证书校验,不修改线上 DNS。
我的正常结果是:
HTTP/1.1 301 Moved Permanently
location: https://www.xianou.com/
Server: cloudflare
HTTP/1.1 200 OK
Server: cloudflare
这说明根域名正确跳转到 www,www 首页通过 Cloudflare 正常响应。它还不能证明地区分流已经生效,分流要在下一步配置后再检查。
2. 华为云新增两条境外 CNAME
保留原来的 A 记录,最终配置如下:
| 主机记录 | 类型 | 线路 | 记录值 | 操作 |
|---|---|---|---|---|
| 根域名:留空或按控制台填 @ | A | 全网默认 | 原 VPS IP | 保留 |
| www | A | 全网默认 | 原 VPS IP | 保留 |
| 根域名:留空或按控制台填 @ | CNAME | 地域解析 → 境外 | cdn.zha.me | 新增 |
| www | CNAME | 地域解析 → 境外 | cdn.zha.me | 新增 |
新增记录 TTL 可设为 300 秒或控制台允许的相近值。
新增 CNAME 的线路一定选“境外”,不能选“全网默认”。 如果已有同名境外记录,需要先核对用途和冲突,不能盲目追加。
大陆没有匹配境外线路时,继续使用全网默认 A 记录;境外匹配 CNAME 后进入 Cloudflare。这种默认指向公网 IP、境外指向 CDN CNAME 的结构,可参考华为云官方分流示例,不需要购买示例中的 GA 产品。
根域名如果提示记录冲突,先保留原配置核对规则,不要删除邮件等业务记录或关闭 DNSSEC 强行保存。
七、确认分流效果
等待 DNS 缓存更新后,使用多地区检测工具,分别测试根域名和 www。
正常应看到:
| 检测地区 | 预期结果 |
|---|---|
| 中国大陆 | 返回 VPS IP |
| 港澳台及其他大陆以外地区 | 解析到 Cloudflare IP |
再用境外 HTTPS 检测确认根域名跳转、www 页面、图片及文章页面都能正常访问,不能只看 Ping 成功。
如果需要恢复原来的直连方式,暂停本次新增的两条境外 CNAME 即可,保留的全网默认 A 记录会继续提供解析。恢复也需要等待 DNS 缓存更新。
八、验证记录和证书续期怎么处理
两个域名的证书和主机名都有效后:
_cf-custom-hostname和_cf-custom-hostname.www中,本次归属验证的 TXT 值可以删除。_acme-challenge和_acme-challenge.www中,本次已完成证书订单的 TXT 值可以清理;保留其他仍在使用的值。- 暂时保留也可以,旧的证书验证值不代表以后能一直用于续期。
归属验证完成后可以移除 TXT,见官方预验证说明。
两边的证书分别维护:
| 证书 | 后续处理 |
|---|---|
| 1Panel 源站证书 | 保持自动续期,确保华为云 DNS API 凭据仍有效 |
| Cloudflare 边缘证书 | Cloudflare 自动尝试续期;若出现待验证,按页面添加新的验证值 |
Cloudflare 对符合条件的非泛域名可能自动使用 HTTP 验证,即使首次选择的是 TXT。不过,本方案只有境外解析到 Cloudflare,不能保证每次自动验证都成功。
建议从到期前约 30 天开始关注状态。如果提示待验证 TXT,就添加当前页面提供的新值,不要等证书过期才处理。参见Cloudflare 续期说明。
原创文章,作者:火鸡味锅巴,如若转载,请注明出处:https://www.xianou.com/79.html