双 CDN 分流配置失败复盘:阿里云 DNS 与 Cloudflare Free 的边界
摘要
本次问题的目标是让同一个静态资源子域名在国内访问时走阿里云 CDN,在海外访问时走 Cloudflare CDN,同时保持权威 DNS 仍由阿里云托管。实际验证后确认:在 Cloudflare Free 套餐下,这条架构路径不可行。
根因不在 SSL/TLS 模式、页面规则或重定向规则,而在 Cloudflare 的接入模式限制:Cloudflare Free/Pro 默认支持的是 Full setup,也就是需要把域名的权威 Nameserver 切到 Cloudflare;不切 NS、只用外部 DNS CNAME 到 Cloudflare 代理节点的 Partial/CNAME setup,是 Business/Enterprise 才支持的能力。
背景与目标
初始目标可以抽象为下面的链路:
国内用户
-> 阿里云 DNS 分线路解析
-> 阿里云 CDN
-> OSS 或对象存储源站
海外用户
-> 阿里云 DNS 分线路解析
-> Cloudflare CDN
-> OSS 或对象存储源站
这个目标背后的约束是:
- 域名注册和权威 DNS 继续留在阿里云。
- 国内访问继续使用阿里云 CDN,以满足备案、调度和访问质量要求。
- 海外访问希望使用 Cloudflare 的边缘网络改善访问质量。
- 源站已经配置 HTTPS,并使用可被浏览器信任的证书。
- 不希望升级付费套餐。
从 DNS 层面看,这个设想很自然:阿里云 DNS 支持分线路解析,因此看起来只要给同一个主机名配置两条 CNAME 即可。
img.example.com 中国内地线路 CNAME aliyun-cdn.example-cname.com
img.example.com 境外线路 CNAME cloudflare-target.example
但 CDN 反向代理不是普通 DNS 解析。海外线路如果要真正进入 Cloudflare 代理层,需要 Cloudflare 认可这个主机名、给 它签发边缘证书,并允许外部权威 DNS 通过 CNAME 把流量接入 Cloudflare。问题就出在这里。
实际踩坑过程
1. 不能直接添加子域名
最初尝试在 Cloudflare 中直接添加 img.example.com。Cloudflare 提示应添加根域名,而不是子域名。
这是符合 Cloudflare 常规接入模型的。普通 Zone 接入通常以根域名为单位,例如添加 example.com,再在 Zone 内管理 img.example.com、www.example.com 等子域名。
2. 添加根域名后 Zone 一直处于 Pending 状态
随后添加根域名 example.com,但没有把阿里云上的 Nameserver 修改为 Cloudflare 提供的 Nameserver。这样做的结果是:Cloudflare 控制台中的 Zone 一直显示未激活或 Nameserver 无效。
当时的误判是:只要在 Cloudflare 控制台里添加一条 img 的 CNAME 记录,并打开橙色云代理,再回到阿里云 DNS 将海外线路 CNAME 到 Cloudflare,就能绕过 NS 接管。
后续验证表明,这个判断不成立。Cloudflare 控制台里能 创建 DNS 记录,并不代表该 Free Zone 已经具备外部 CNAME 接入能力。
3. Universal SSL 没有为子域名签发证书
Cloudflare SSL/TLS 模式设置为 Full 或 Full (strict) 后,预期 Cloudflare 会给 img.example.com 自动签发边缘证书。但由于 Zone 未激活,Universal SSL 并没有按预期完成证书部署。
这里容易混淆两件事:
- 源站证书:Cloudflare 回源访问 OSS 或对象存储时验证的证书。
- 边缘证书:浏览器访问 Cloudflare 边缘节点时看到的证书。
源站已有可信证书,只能解决 Cloudflare 到源站这一段;浏览器到 Cloudflare 这一段仍然需要 Cloudflare 边缘证书。如果 Cloudflare 没有为这个主机名部署边缘证书,HTTPS 访问仍会失败。
4. 自定义证书上传按钮是灰色的
尝试改为上传自己的证书到 Cloudflare 边缘,但控制台中的上传自定义证书按钮不可用。
这不是证书格式问题,而是套餐能力问题。Cloudflare 的自定义边缘证书能力不属于 Free/Pro 的可用范围。对于 Free 套餐,不能通过上传自有证书来绕开 Universal SSL 未签发的问题。
5. 页面规则和重定向规则不能解决根因
期间还尝试通过页面规则或重定向规则配置 Always Use HTTPS、HTTP 到 HTTPS 跳转等规则。Cloudflare 控制台提示规则可能不适用于当前流量,或者 URL 校验不通过。
即使规则能够保存,也不能解决根因。HTTPS 重定向规则运行在 Cloudflare 代理请求处理链路中,而当前问题是这个主机名并没有在 Cloudflare Free 下完成正式的可用接入:边缘证书没有就绪,外部 CNAME 接入也不是 Free 套餐支持的模式。
换句话说,规则是流量进入 Cloudflare 之后的处理逻辑;本次失败发生在流量能否被 Cloudflare 正式接入并完成 TLS 终止之前。
根因分析
本次踩坑可以归结为一个核心误区:
把 Cloudflare 控制台中“可以创建 DNS 记录并打开橙色云”,误认为“可以在不切换 NS 的情况下,用阿里云 DNS CNAME 到 Cloudflare Free 代理层”。
官方文档中的接入模型更清楚:
- Cloudflare DNS setup 分为 Full setup、Partial/CNAME setup 等模式。
- Full setup 要求将域名 Nameserver 切到 Cloudflare。
- Partial/CNAME setup 才是“不切换权威 DNS,只通过 CNAME 将指定主机名接入 Cloudflare”的模式。
- Partial/CNAME setup 的可用套餐是 Business/Enterprise,不是 Free/Pro。
因此,下面这条链路在 Cloudflare Free 下不是一个受支持的 生产架构:
阿里云权威 DNS
-> 境外线路 CNAME
-> Cloudflare Free 代理主机名
-> 源站
Cloudflare Free 可以很好地用于下面这种 Full setup:
用户
-> Cloudflare 权威 DNS
-> Cloudflare 代理
-> 源站
但它不能在不接管 Nameserver 的情况下,作为一个被第三方权威 DNS 任意 CNAME 过来的反向代理 CDN 使用。