DNS:为什么服务器在请求 MX 时返回 CNAME 记录

DNS:为什么服务器在请求 MX 时返回 CNAME 记录

我开始深入研究 DNS 如何解析名称,但很难理解使用 cmdlet 时收到的答案Resolve-DnsName。首先,我知道该名称id.madeira.gov.pt是另一个名称的 CNAME(基本上指向托管多个站点的 Web 服务器)。在运行测试时,我首先使用以下命令询问有关该名称的信息:

❯ Resolve-DnsName id.madeira.gov.pt

Name                           Type   TTL   Section    NameHost
----                           ----   ---   -------    --------
id.madeira.gov.pt              CNAME  72    Answer     crater.madeira.gov.pt

经过这次测试,我很好奇如果MX在使用Resolve-DnsName具有先前名称的 cmdlet 时指定记录类型会发生什么。最初,我真的认为我不应该得到任何响应,因为指定的名称已注册为 CNAME 并且没有与之关联的 MX 条目。然而,事实并非如此……事实上,我最终得到了与之前相同的输出:

❯ Resolve-DnsName id.madeira.gov.pt -Type MX

Name                           Type   TTL   Section    NameHost
----                           ----   ---   -------    --------
id.madeira.gov.pt              CNAME  72    Answer     crater.madeira.gov.pt

我还用 wireshark 捕获了交换,下面是我收到的响应:

MX 查询响应

我不明白为什么当我请求 MX 记录时,我会在答案部分获得 CNAME...我的意思是,我印象中 DNS 回复可以包含“3 个部分”:

  • 答案:准确查询的记录;
  • 权威性:标识查询的权威名称服务器的记录;
  • 附加:对查询可能很重要的附加信息

我假设 cmdlet 运行正常,因此我对 DNS 查询的响应方式做出了错误的假设。有人能帮我理解发生了什么吗?我的意思是,服务器如何解释这个问题?当您指定参数时Type,难道不应该只获得与指定名称和指定记录类型匹配的答案吗?

谢谢!

答案1

您的描述基本正确,唯一的区别在于,这是CNAME由 DNS 服务器专门处理的,并且此行为在RFC 1034(第 3.6.2 节):

CNAME RR 会导致 DNS 软件采取特殊措施。当名称服务器无法在与域名关联的资源集中找到所需的 RR 时,它会检查资源集是否包含具有匹配类的 CNAME 记录。如果是,名称服务器会在响应中包含 CNAME 记录,并在 CNAME 记录的数据字段中指定的域名处重新启动查询。此规则的一个例外是,与 CNAME 类型匹配的查询不会重新启动。

基本上,这意味着,如果您请求 MX 记录,并且不存在这样的记录,则响应将包含原始查询的 CNAME,并且如果包含 MX 记录,还将查询 CNAME 给出的别名,该别名也将被返回。

此外,如果某个节点存在 CNAME,则该节点就不应该存在其他资源记录,因此 MX 就不应该存在(来自 RFC 的同一节):

如果节点上存在 CNAME RR,则不应存在其他数据

答案2

CNAME 别名并非 100% 透明 - 它们仅重定向到另一个名称,而不会直接从中获取记录。因此,您的查询的答案将包含整个 CNAME 链最后的 A 或 MX 记录,全部位于“答案”部分。

因此,记录查询A的答案如下:

;; ANSWER SECTION:
id.madeira.gov.pt.      300  IN  CNAME  crater.madeira.gov.pt.
crater.madeira.gov.pt.  299  IN  A      62.28.72.169

这两条记录都是“答案”的一部分,并且都被客户端解析器使用(例如 C 语言中的 getaddrinfo() 或 gethostbyname() 函数)——它得到 62.28.72.169 作为最终答案它指出“crater.madeira.gov.pt”是主机的“规范名称”,程序通常也需要知道这一点。

相关内容