我开始深入研究 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 记录时,我会在答案部分获得 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”是主机的“规范名称”,程序通常也需要知道这一点。