为什么不允许同时使用 CNAME 和 DNAME

为什么不允许同时使用 CNAME 和 DNAME

如果您有一个主域和一堆类似的域,并且您基本上希望它们的行为完全相同,那么按如下方式配置似乎是合乎逻辑的:

“穷亲戚”区:

amazon.co.uk。DNAME amazon.com。

amazon.co.uk。CNAME amazon.com。

“爸爸”区:

amazon.com。A 1.1.1.1

www.amazon.com。A 1.1.1.1

amazon.com.MX xyz

... 并期望 xyz 处理 amazon.co.uk 和 .com 的电子邮件,并且位于 1.1.1.1 的 Web 服务器不仅获取针对 amazon.com 和 www.amazon.com 的请求,还获取针对 amazon.co.uk 和 www.amazon.co.uk 的请求。

然而 RFC 6672 指出:

The owner name of a DNAME can only have one DNAME RR, and no CNAME RRs can exist at that name. These rules make sure that for a single domain name, only one redirection exists; thus, there's no confusion about which one to follow.

我不明白,我的问题是,不允许 CNAME 与 DNAME 一起使用可以避免哪些潜在的混淆?我的理解是 DNAME 可以执行除顶点之外的所有操作,而 CNAME 可以执行顶点,我错过了什么?

答案1

答案似乎是,最初的建筑师从来没有想过它会有什么用处,或者同样目光短浅

重要的是要了解,域名系统 (DNS) 正在取代/etc/hosts当时在互联网上每台计算机上使用全球克隆版本的安排,因此可靠性和快速平均响应对于其采用至关重要。因此,在原始设计中加入缓存解析器是其成功的关键。

从那时起,焦点发生了转移:向后兼容性是极其重要:缓存 DNS 解析器是消费设备上的一项核心服务,通常运行 10 至 15 年而无需软件更新。

现在想象一下 CNAME 记录被允许与某些其他记录类型结合,然后考虑缓存解析器。

第一个问题是效率。

根据查询的顺序和记录的 TTL,它最终将在其缓存中只保留给定名称的 CNAME。

那么当客户端(可能是另一个缓存解析器)查询 AAAA 时应该发生什么:它应该使用 CNAME 来回答,还是向权威服务器查询 AAAA?

下一个问题是模糊性。

如果所有者和目标名称都是区域顶点,并且客户端查询 NS 或 SOA,则可能存在两个完全不同的答案,这两个答案均有效,具体取决于为什么已进行查询。

“保持简单”的设计会说“对所有查询都一视同仁”,因为你不知道为什么客户要求:始终遵循重定向。

您可能会争辩说,不同的规则应该适用于不同的记录类型,并且应该有一个可以与 CNAME 记录共存的 RR 类型的枚举列表,但这样的列表必须是原始设计的一部分(在 20 世纪 80 年代初期)。虽然这可以解决 SOA 和 NS 的问题,但它无法解决直到后来才添加的 DNAME 的问题。

在查询记录中添加“不遵循 CNAME”字段可能已经解决了大多数问题,而无需添加很多O_NOFOLLOW复杂性,但在符号链接才刚刚出现、至少还要十年才出现的时代,这已经是一个有先见之明的设计了。

答案2

因为这就是规则。

答案似乎是最初的建筑师从来没有想过它会有什么用处,或者是同样目光短浅的东西。

如果根目录允许使用 CNAME 记录,则 CNAME 将包含 NS 记录,从而使区域本身无效并陷入无限循环。

其他 DNS 服务器已使用 ANAME 之类的东西“修复”了这个问题,ANAME 专门将主机的解析别名化为 A 记录请求的答案。ANAME 不是标准。

https://www.rfc-editor.org/rfc/rfc1912

http://www.faqs.org/rfcs/rfc1034.html

按照其他人的做法,将你的根域 301 到 www 子域,你可以自己做,也可以通过第三方服务来做。

答案3

由于其定义方式,它CNAME必须是域的唯一 RR。因此,它仅适用于顶级域。

DNAMECNAME当一个域的所有子域都应重定向到不同域下的相同结构时,可以用它来代替多个记录。该DNAME记录不会重定向其适用的域。查询由DNAME记录重定向的域的服务器将获得CNAME响应。

如果两个域由相同的服务器提供服务,则可以通过对两个域使用相同的区域文件来避免重定向。

答案4

“您缺少什么”是指不能在区域顶点使用,并且是否存在CNAMEa 并不重要。DNAME

对于那些在询问合并CNAMEDNAME非顶级名称时偶然发现这个问题的人,我想指出https://tools.ietf.org/id/draft-sury-dnsext-cname-dname-00.htmlhttps://tools.ietf.org/id/draft-sury-dnsop-cname-plus-dname-01.html这解释了为什么这基本上是现有 DNS 规范的一个缺陷。

禁止CNAME在区域的顶点出现与将CNAMEDNAME应用于同一名称是完全不同的两回事,并且有充分且合理的理由允许后者(当然,前提是它不是顶点)。

实际上这只是 DNS 服务器软件的问题;如果您的软件不允许这种组合,请考虑升级或更换它。

相关内容