CNAME 是什么
CNAME 是别名记录:它告诉解析器「这个名字等同于另一个名字」,解析器于是换名继续追下去。链上每一跳都要消耗一次查询与一个往返,链越长越慢;出现环或者链过长时,递归器最终会返回失败。
两条硬约束
第一,同一个名字上不能同时存在 CNAME 与其他类型的记录(RFC 1034 §3.6.2),违反后部分解析器会直接丢弃这个名字下的全部记录。第二,区域顶点通常不使用 CNAME,需要把顶点指向外部地址时要靠展平一类的机制(RFC 2181 §10.1 也强调别名的唯一性)。
基本信息
| 规范 | RFC 1034 §3.6.2,唯一性见 RFC 2181 §10.1 |
|---|---|
| 共存限制 | CNAME 必须唯一,不可与其它类型记录共存 |
| 区域顶点 | 一般不用 CNAME,需要别名展平机制替代 |
| 查询成本 | 每跳一次查询,递归器通常限制最大跳数 |
典型使用场景
- 把站点指向内容分发网络或托管平台,由对方随时变更真实地址
- 迁移期间做过渡:旧名字继续指向新名字
- 排查「解析变慢或失败」:先数别名的跳数
- 配置邮件相关记录时避开与别名冲突
手动跟随一条链
手动跟随一条链
dig www.example.com CNAME +short # 看别名指向哪里
dig +short www.example.com # 跟随到最终地址
dig a.example.com CNAME +short # 检查是否存在互相指向的环
dig b.example.com CNAME +short追链要看什么
| 观察点 | 正常表现 | 异常表现 |
|---|---|---|
| 跳数 | 一到两跳 | 多跳会逐级累积延迟 |
| 目标可解析 | 目标名能正常解析 | 目标不存在则整条链失败 |
| 共存记录 | 同一名字下没有其它类型 | 共存记录会被部分解析器整体丢弃 |
| 是否成环 | 无环 | 互为别名导致解析直接失败 |
切换别名目标时,别忘了目标名本身要可解析:整条链建立在最后一跳上,最后一跳不可解析就等于解析全面失败。
对外的别名通常只改一处、由服务方维护目标:这样迁移由对方负责,你只需要保证自己的别名指向正确。
邮件相关的校验记录常放在特定前缀的名字下,若该名字同时被配成别名,就可能触发共存冲突:配置前先确认这个名字没有其它记录。