什么是 DNS CNAME 记录?

DNS CNAME 记录用作共享单个 IP 地址的域名的别名。

学习目标

阅读本文后,您将能够:

  • 了解 CNAME 记录在域名查找中的作用
  • 了解 CNAME 记录和 A 记录之间的关系

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

什么是 DNS CNAME 记录?

“规范名称” (CNAME) 记录用于将别名域名指向一个 "规范" 域名。当一个 或子域是另一个域的别名时,CNAME 记录被用来代替 A 记录。所有 CNAME 记录都必须指向一个域名,而不是指向一个 IP 地址。想象一下,在一个寻宝游戏中,每条线索都指向另一条线索,而最后的线索则指向宝藏。一个有 CNAME 记录的域名就像一条线索,可以把你指向另一条线索(另一个有 CNAME 记录的域名)或宝藏(一个有 A 记录的域名)。

例如,假设 blog.example.com 的 CNAME 记录的值为“example.com”(没有“blog”)。这意味着当 DNS 服务器点击 blog.example.com 的 DNS 记录时,它实际上会触发另一个对 example.com 的 DNS 查找,并通过其 A 记录返回 example.com 的 IP 地址。在这种情况下,我们会说 example.com 是 blog.example.com 的规范名称(或真实名称)。

通常,当站点具有子域(例如 blog.example.com 或 shop.example.com)时,这些子域将具有指向根域 (example.com) 的 CNAME 记录。这样,如果主机的 IP 发生更改,则仅需要更新根域的 DNS A 记录,这样所有 CNAME 记录都会跟随对根所做的任何更改。

一个常见的误解是 CNAME 记录必须始终解析为其指向的域所在的网站,但事实并非如此。CNAME 记录仅将客户端指向与根域相同的 IP 地址。客户端访问该 IP 地址后,Web 服务器仍将相应地处理 URL。例如,blog.example.com 可能有一个 CNAME 指向 example.com,从而将客户端定向到 example.com 的 IP 地址。但是,当客户端实际连接到该 IP 地址时,Web 服务器将查看 URL,发现它是 blog.example.com,并且提供博客页面而不是主页。

CNAME 记录示例:

blog.example.com record type: value: TTL
@ CNAME is an alias of example.com 32600

在本示例中,您可以发现 blog.example.com 指向 example.com。假设它基于我们的示例 A 记录,我们便知道它最终会解析到 IP 地址 192.0.2.1。

报告
2023 年 GigaOm Radar DNS 安全报告
报告
阅读 2023 年第四季度 DDoS 威胁形势报告

一个 CNAME 记录能否指向另一个 CNAME 记录?

将 CNAME 记录指向另一个 CNAME 记录十分低效,因为它需要在加载域之前进行多次 DNS 查找——这会降低用户体验,不过这个过程是可以实现的。例如,blog.example.com 可以有一个 CNAME 记录指向 www.example.com 的 CNAME 记录,然后后者指向 example.com 的 A 记录。

blog.example.com 的 CNAME:

blog.example.com record type: value: TTL
@ CNAME 是 www.example.com 的化名 32600

它指向 www.example.com 的 CNAME:

www.example.com record type: value: TTL
@ CNAME is an alias of example.com 32600

这种配置在 DNS 查询过程中增加了一个额外的步骤,应当尽可能避免。blog.example.com 和 www.example.com 的 CNAME 记录应当直接指向 example.com。

快速且安全的 DNS
所有 Cloudflare 计划中均包含免费 DNS

使用 CNAME 记录有什么限制?

禁止重复名称

任何其他 DNS 记录都不能与任何给定的 CNAME 记录同名。实际上,这意味着不能用域的别名标记其他类型的 DNS 记录(如 MXTXT、A 或 SOA),也不能有任何其他 CNAME 记录具有相同的名称。

如果“blog.example.com”上有一个指向“example.com”的 CNAME,则“blog.example.com”上不能有任何其他类型的记录——它们都必须位于“example.com”下。

假设 Sam 以笔名“Mark”撰写文章。尽管 Mark 和 Sam 是同一个人,但他的法律文件(如出生证明和护照)仍将使用他的真实姓名 Sam。DNS 记录也是如此:别名域只能指向实际域,而“法律文件”(其他 DNS 记录)必须位于该真实域下。

有一个例外,即在 CNAME 拉平的情况下,此时 CNAME 的行为类似于 A/AAAA 记录。事实上,所有代理 CNAME 记录的行为都是如此。但是,其他记录仍不允许与拉平的 CNAME 记录同名。详细了解 CNAME 拉平

MX 和 NS 记录

MX 和 NS 记录不能指向 CNAME 记录,它们必须指向 A 记录(对于 IPv4)或 AAAA 记录(对于 IPv6)。MX 记录是邮件交换记录,将电子邮件指向一个邮件服务器。NS 记录是“名称服务器”记录,表明哪个 DNS 服务器是该域的权威。

什么时候为非 CNAME 查询返回 CNAME 记录?

如上所述,根据 DNS 规范,不允许域名在已经有 CNAME 记录的名称上拥有其他 DNS 记录。

因此,查询使用别名而不是域名真实名称的其他类型的记录(例如 TXT 记录)将返回 CNAME 记录,而不是请求的记录。然后,请求者需要查询 CNAME 指向的域才能获得所需的记录。

如果 Alice 想要查看 blog.example.com 的 TXT 记录并发送查询,她将获得 CNAME 记录而不是 TXT 记录。然后,她需要向 CNAME 记录的目标发送 DNS 查询,要求 TXT 记录,如果目标有 TXT 记录,她就会得到响应。其他类型的 DNS 记录查询也是如此。

了解有关 TXT 记录的更多信息。