假设我有以下example.com
区域:
$TTL 120
@ IN SOA ns1 hostmaster (2018041509
300
150
600
60)
IN NS ns1
IN NS ns2
ns1 IN A 192.168.0.159
ns2 IN A 192.168.0.160
blah IN A 192.168.0.141
如上所示,ns1.example.com
并且ns2.example.com
是该区域的两个权威名称服务器。其他名称服务器何时查询它们?NS
根据我的测试,唯一一次查询这两条记录是我192.168.0.159
使用 DNS 查找实用程序(即dig @192.168.0.159 -t NS example.com
.
对于普通用户来说,这真的不重要。如果您追求的是域的一致交付和正常运行时间,那么规则非常简单:
NS
记录应该只指向A
和AAAA
记录。(不是CNAME
记录等)A
记录),否则运行单栈 IPv4 的 DNS 服务器将无法获取有关您的域的信息。而已。实施的方式和原因并不重要。如果您偏离此建议,结果将是大量不一致和不可预测的行为。诸如“未定义的行为”和“实现特定的行为”之类的可怕短语都适用于此。
话虽如此,OP提出的问题是完全公平的。排除客户端的显式请求并排除其他答案的权威部分中的间接引用,递归名称服务器何时明确请求这些
NS
记录?您无意中进入了递归 DNS 服务器如何运行的比较模糊的领域之一。据我所知,我们仍然没有对管理互联网标准进行修订,以阐明这是“应该”如何工作的。
递归 DNS 服务器如何了解您的域的高级概述如下所示:
www.example.com. IN A
.www.example.com. IN A
. (或直到错误阻止它进一步遵循路径)在“冷缓存”场景(想象一个新重新启动的 DNS 服务器)中,它必须从最不具体的开始,然后一直工作到最具体的 . 对于我们的示例
www.example.com. IN A
,它将遵循以下一组引用:.
:又名“根”名称服务器。com.
: 的顶级域名服务器com.
,从.
名称服务器中学习。example.com.
:注册表中列出的名称服务器example.com.
,com.
从com.
名称服务器中学习。www.example.com
:仅当example.com
名称服务器为www
. 对于此示例,我们假设情况并非如此。我们的记录答案A
将直接来自example.com
.沿着这条路径的每一步,递归服务器都会询问这些服务器是否负责
www.example.com
并接收到一组更具体的 DNS 服务器的引用。在这次步行中,我们不需要询问 NS 记录。我们通过推荐了解了更具体的服务器,直到一组服务器最终回复了权威答案www.example.com.
(在这种情况下,example.com.
名称服务器得到了我们的答案)这就是事情变得奇怪的地方。
NS
我们此时记忆中的记录是通过推荐获得的。对于名称服务器来说,这已经“足够好”了,但我们现在有两个问题:当与引用中的 NS 记录关联的 TTL 过期时会发生什么?
当有人问我们这些 NS 记录的价值时会发生什么?
我们将探索其中的每一个。
通过引用学习到的 NS 记录的 TTL 已过期。怎么办?
这就是名称服务器行为大相径庭的地方。虽然它有一定的年代(2011 年 3 月),但我强烈建议您阅读Ólafur Guðmundsson涵盖该主题的演示文稿。幻灯片 11 - 13 向我们介绍了几种名称服务器行为模式。我将从 Ólafur 的演讲中借用相同的术语:
在这种情况下,“父母”指的是我们通过推荐了解到的 NS 记录。“child”是指我们通过查询第一组 NS 记录的值时收到的权威答案了解到的 NS 记录
example.com. IN NS
。(即当我们要求这些名称服务器返回他们自己的NS
记录时......理论上)所有这些模式的共同点是内存中的 NS 数据首先是从父级学习的。这是一个给定的,因为它是该过程如何工作的基础。实现的不同之处在于它们之后的操作:
以孩子为中心的非粘性最初会更喜欢父母,然后换成孩子。一旦孩子过期,NS 记录将被“遗忘”并从头开始重新学习,以便为合并父名称服务器的更改提供机会。如果没有这个,与过期域相关的名称服务器的更改将不会被捕获——无论是过期还是续订。缺点是有时这些 NS 记录定义不一致,导致递归服务器返回针对特定 DNS 记录(即
www.example.com. IN A
)的不同响应,具体取决于它当前正在访问的服务器。以子为中心的粘性是一个非常有问题的实现,其中名称服务器“卡在”定义的子端,并且在清除缓存或重新启动服务器之前不会重新评估父端。由于与之相关的非常明显的问题,它通常被认为是这些实现中最糟糕的。(一个例子是这个问答,有人正在观察行为)
以父为中心是一个有趣的实现,它完全避开了子/权威 NS 记录的价值。其背后的总体思路是,在父母和孩子的价值观之间交替会导致比其价值更多的麻烦和困惑。通过完全忽略 NS 记录的“权威”版本并始终更喜欢推荐(没有它,无论如何都无法了解权威记录),您可以完全避免以儿童为中心的非粘性的“触发器”问题。主要缺点是一些边缘情况,其中来自子端的 NS 记录可以帮助加快从旧名称服务器迁移之前在注册表中进行的更改。当您与某些也提供 DNS 服务的愚蠢注册商打交道时,这可能会很有用,但是当您将域的服务器更改为指向其他地方时,会立即杀死您的所有 DNS 数据。
如您所见,这是一个复杂的主题,如果没有广泛的测试,很难记录下来。之所以如此,是因为直到今天,该领域的标准仍然很松散,至少据我所知。
当客户端向递归器询问 NS 记录的值时会发生什么?
再一次,这取决于。
RFC 2181强烈不鼓励名称服务器返回从答案部分中的引用中学习到的缓存名称服务器数据,但并没有完全禁止它:(“不应该”)
尽管有这个警告,我们可以在我们的答案中返回从推荐中观察到的 NS 记录,因为它没有被明确禁止。我怀疑以父母为中心的实现更有可能发生这种情况,但目前我面前没有任何好的数据。当我找到时间并更新这个答案时,我会自己做一些测试。
如果服务器缓存了来自引用的名称服务器,并且遵守RFC 2181,会发生什么情况?在 ISC BIND 的情况下(至少在我最有经验的 9.10 和 9.11 实现中),
NS
来自客户端对记录的显式请求会触发对子名称服务器的立即刷新。当客户端名称服务器指向 BIND 认为已损坏的内容时,最容易观察到,例如指向 CNAME 记录的 NS 记录。BIND 最初将能够使用从初始推荐中收到的信息(包括胶水)来回答域,但是当NS
收到记录请求并且名称服务器尝试重新学习它的名称服务器信息时,该域将立即停止工作需要与之交流。结束免责声明:这是递归服务器操作的一个非常模糊和令人困惑的领域。自从我上次深入探讨该主题以来,有些事情可能已经改变。我很乐意修改此处提供的任何信息,但请尽可能提供具体的数据引用。