查 github.com,只看到几个 IP。查 www.taobao.com,看到一条链:
www.taobao.com
→ www.taobao.com.danuoyi.tbcache.com
→ 一组 IP
再查 taobao.com,结果又和 www.taobao.com 完全不同。
这三种结果的差别不是随机的,每一种都对应着一个具体的技术决定。读懂 CNAME,能从一次解析里看出对方的部署方式。
CNAME 是什么
A 记录说「这个名字对应这个 IP」,CNAME 记录说的是另一件事:
这个名字实际上是另一个名字,去查那个。
解析器遇到 CNAME 会自动跟过去,一级级跟到出现 A 或 AAAA 记录为止。所以你在浏览器里访问一个挂了 CNAME 的域名,中间这几跳是完全透明的。
它的价值在于解耦:你的域名指向 CDN 的调度域名,CDN 想换节点、换机房、扩容,改自己那边就行,你的 DNS 记录一个字都不用动。
为什么 CNAME 比 IP 更有信息量
拿到一组 IP,查归属地最多告诉你「浙江省·移动」。而 CNAME 的后缀是厂商指纹——CDN 厂商必须用自己的域名做调度,这个后缀藏不住。
几个最常见的:
| CNAME 后缀 | 厂商 |
|---|---|
kunlunaq.com / alicdn.com | 阿里云 CDN |
tencent-cloud.net / cdntip.com | 腾讯云 CDN |
eo.dnse0.com | 腾讯云 EdgeOne |
cdn.cloudflare.net | Cloudflare |
akamaiedge.net / edgekey.net | Akamai |
fastly.net | Fastly |
cloudfront.net | AWS CloudFront |
wscloudcdn.com | 网宿科技 |
(域名查 IP 页面上有完整的对照表并会自动比对,这里只列最常撞见的几个。认不出后缀时它会把原始 CNAME 链完整列出来。)
大厂自建 CDN 则会指向自家域名,得靠认:danuoyi.tbcache.com 是淘宝,bilicdn1.com 是 B 站。
一条多级链,各级分别是谁
典型的三级结构长这样:
shop.example.com ← 你的业务域名
→ example.com.w.kunlunaq.com ← CDN 的调度域,决定给哪个区域
→ xxx.kunlunar.com ← 节点域
→ 121.x.x.x / 121.x.x.y ← 最终的边缘节点 IP
读这条链能看出三件事:
- 用的是谁家 —— 看后缀
- 接入方式 —— 有的厂商会在调度域里带上产品线标识,能区分是普通 CDN 还是全站加速、安全加速
- 故障面 —— 链条跨了几家服务商,故障面就是几家的叠加。任意一级的权威 DNS 出问题,整条链都解析不出来
根域名为什么不能 CNAME
这是所有 DNS 配置问题里最常见的一个,而原因来自一条很老的规则:
一个名字上如果有 CNAME 记录,就不能再有任何其他记录。
(RFC 1034 定的,因为 CNAME 的语义是「这个名字整体等价于那个名字」,同时挂别的记录会自相矛盾。)
而根域名——也就是不带 www 的 example.com——身上必然有两条记录:
- SOA:这个区的起始授权信息
- NS:这个区由哪些权威服务器负责
这两条是区文件的必需项,删不掉。于是结论就出来了:根域名上放不下 CNAME。
同一条规则还有一个常见的连带后果:挂了 CNAME 的名字也不能再配 MX 或 TXT。想给 mail.example.com 同时配 CNAME 和 MX,会被 DNS 服务商拒绝或者被解析器忽略其中之一。
三条变通路线
1. 根域名放 A 记录,www 放 CNAME
最传统的做法。代价是根域名的 IP 写死了,CDN 换节点你得跟着改。也是「查 example.com 和 www.example.com 结果完全不同」的主要来源。
2. 根域名 301 跳到 www
根域名只负责跳转,实际服务全在 www 上。干净,但多了一次跳转的往返。
3. ALIAS / ANAME / CNAME 拉平
各家 DNS 服务商提供的一种特殊记录类型(叫法不一,Route 53 叫 ALIAS,有的叫 ANAME,Cloudflare 叫 CNAME flattening)。
它的原理是:服务商在自己的权威服务器上替你把链跟完,对外只返回最终的 A 记录。 查询者看到的是一组普通 IP,完全不知道背后有一条 CNAME。
这条路最省事,但有两个代价值得知道:
- 地理调度的基准变了 —— 跟链这一步是 DNS 服务商的服务器做的,CDN 是按它的位置给节点,而不是按最终用户的位置。服务商和用户离得远时,调度精度会下降
- 它是各家自己的扩展,不是 DNS 标准,换服务商时这条记录不一定能平移
实操:怎么读一次解析结果
- 根域名和 www 都查一遍 —— 两者经常不同,只查一个会得出错误结论
- 先看有没有 CNAME —— 有就顺着链读后缀,认厂商
- 没有 CNAME 就看 A 记录的数量和归属地 —— 两三个分散在不同省份的 IP,基本就是 CDN 在调度;单个固定 IP 更像是自己的服务器
- 看有没有 AAAA —— 有 AAAA 说明支持 IPv6 访问,纯 IPv6 环境下能不能打开就看这一条
- 要批量对一批域名,粘进去一次跑完 —— 上限 500 个,导出 CSV
一个必须说清楚的前提:这是服务器视角
解析是在本站的杭州服务器上完成的,用的是公共 DNS。它回答的是「这个域名对外长什么样」,不是「你的网络里它长什么样」。
所以两件事它做不到:
- 判断你这边打不开某网站是不是 DNS 的问题 —— 那要在你自己的机器上查,用
nslookup 域名或dig 域名 - 列出一个 CDN 域名的全部节点 —— CDN 的权威 DNS 只返回查询者附近的一小组地址,实测大站也只给两个 A 记录。想看各地调度需要用 EDNS Client Subnet 伪装成各地用户分别查询,那是另一套机制
本机 DNS 出问题时的排查顺序,见 DNS 污染排查;想知道查出来的那些 IP 归属地为什么常常对不上,见 IP 归属地为什么查不准。
DNS 解析结果随时可能变化,归属地数据也存在误差,仅供参考。