解析 CNAME - 谁查找后续的 A 记录 - 解析器还是服务器?

解析 CNAME - 谁查找后续的 A 记录 - 解析器还是服务器?

当解析器查找 CNAME 时,解析器显然会首先向 DNS 服务器发送 A 记录请求。DNS 服务器是否应该确定该请求实际上是针对 CNAME 的,或者解析器是否应该重试该请求,但针对的是 CNAME 类型?我之所以问这个问题,是因为 - 这里有转折 - 我们在内部 LAN 上使用了一个“内部”顶级域,我们称之为“domain1”,而我查询的 DNS 服务器是“domain1”的权威服务器(并且对其他所有域都是递归的)。我的主机(Centos 6.8)实际上发出的是 A 记录请求:

16:15:45.837525 IP (tos 0x0, ttl 64, id 36911, offset 0, flags [none], proto UDP (17), length 62)
myhost.domain1.40684 > dnsserver.domain1.domain: 15355+ A? cfengine.domain1. (34)
Reply - a servfail:
16:15:45.837762 IP (tos 0x0, ttl 64, id 49982, offset 0, flags [DF], proto UDP (17), length 62)
dnsserver.domain1.domain > myhost.domain1.40684: 15355 ServFail 0/0/0 (34)

如果我挖掘 CNAME 类型,我会得到正确的 CNAME 记录(尽管 A rec 不会作为附加数据返回):

cfengine.domain1.   3600    IN  CNAME   helm02.domain2.

是的,我知道将权威函数和递归函数组合到单个 DNS 服务器中是不好的做法,但我无法控制此 DNS 设置。

首先,如果将权威功能和递归功能组合到一个服务器中,并且您向该服务器发送递归所需查询以获取该服务器具有权威性的 CNAME - 它是否应该工作?

假设它能正常工作,谁负责确定我的请求实际上是 CNAME 记录而不是 A 记录?DNS 服务器,还是我的解析器?

答案1

如果服务器对某个名称具有权威性,并且拥有CNAME该名称的记录,则它必须使用该记录来响应所有记录类型的查询。

如果服务器正在进行递归,请求的记录类型不是CNAME,但得到了CNAME响应,那么它应该使用记录中的名称重新启动查询CNAME,将重新启动的查询的响应与响应合并CNAME,并将组合的响应返回给执行递归的任何人。

换句话说,权威服务器负责知道某个名称具有 ,CNAME并对所有查询做出响应,而递归服务器负责注意到它CNAME在请求其他内容时得到了响应,并采取相应的行动。如果你特别作为CNAME记录,您可以绕过这个额外的魔法,而递归器将只给您原样响应CNAME,而不会尝试跟踪名称。

答案2

如果您再次使用 尝试该查询,应该会SERVFAIL消失+norecurse。 dig 默认假设需要递归,并且SERVFAIL如果请求递归并且无法解析别名的目标,则返回正确的响应。

查询权威服务器的递归服务器不应在设置了需要递归 ( ) 标志的情况下发出请求RD=1。简而言之,您只会在以下两种情况下看到此问题:

  1. 您正在手动运行此事务并忘记禁用递归。
  2. 有人编写了一个(糟糕的)递归名称服务器实现,并且作者在执行权威查找时忘记取消设置需要递归标志。递归名称服务器不应要求权威服务器代表其执行递归。

相关内容