我目前正在将 DNS 区域从一个 DNS 服务器提供商迁移到另一个。我正在尝试估计更改传播需要多长时间,并了解如果我选择在中途回滚可能会有什么延迟。
以前,我认为我可以这样做:
dig example.com ns
要查看 NS 记录上剩余的 TTL 是多少,但现在我知道这个 NS 记录是区域中子域的 NS 记录,而不是来自根服务器的 NS 记录,根服务器最终决定将发送查询的名称服务器。
我通过在每个提供者的区域中设置测试记录来测试这一点:
Provider1 test.example.com 10.0.0.1
Provider2 test.example.com 192.168.0.1
对于这两个提供商来说,NS 上的 TTL 记录为 0,而 TLD Registrar 级别的 NS 记录指向 Provider1 的名称服务器。
当我更改 Provider1 区域中的 NS 记录时,我几乎可以立即在 NS 查询中看到这一点(使用“dig example.com ns”)。
但是,当我发送查询 A 记录时,即
test.example.com
它总是返回
10.0.0.1
无论 Provider 1 区域中的 NS 记录设置为什么。
在此基础上,我得出结论,区域文件中的 NS 记录与迁移无关,只有 TLD 级别的名称服务器记录很重要。
但是,我无法了解那里的更改可能会传播多长时间,无论是向前还是向后。
是否可以查询 TTL 正在处理来自 TLD 根服务器的记录?
这是一个不正确的假设,但很容易犯错误。您可以在此处阅读有关 apex NS 记录主题的更多信息。简短的版本是两者都很重要,并且正在使用的版本会有所不同,具体取决于缓存 DNS 服务器之前是否查询过您的域。
请记住,大多数递归 DNS 服务器强制执行最小 TTL,因此从 TTL 为零的实验得出的任何结论几乎肯定是不准确的。唯一不是这样的情况是当您控制您正在查询的服务器使用的最小 TTL 策略时。
我将专注于这个话题,因为你在剩下的问题中有一些错误的开始。首先,重要的是要记住 TTL 缓存在递归 DNS 服务器上。由于 Internet 上的每个人都使用不同的递归 DNS 服务器,因此您可以做出的唯一假设是最多需要n秒,其中n是 TTL 的值。
这为我们带来了与此处相关的 TTL:
NS
记录过期,缓存中的单个记录的请求也不会自动过期。示例:如果test.example.com IN A
从现在开始十分钟后example.com IN NS
过期,但从现在开始五分钟后过期,即使在记录更改test.example.com
后仍将保留在缓存中。NS
在记录过期并被刷新之前,与新服务器上此记录的值相关的任何问题都不会变得明显。NS
TLD DNS 服务器提供的粘合记录的TTL 。这些由需要在首次请求时获取有关您的域的信息的递归服务器使用。这些 TTL 会影响区域文件中列出的 DNS 服务器用于下一次刷新之前的时间。(请参阅我上面链接的问答以对此进行澄清)NS
区域文件顶部列出的记录的 TTL 。一旦粘合记录 TTL 过期,这些 TTL可能会被使用。实现在这个细节上有所不同。由于您正在处理整个互联网的不同实现,唯一安全的假设是某些服务器正在使用它。您不能假设
NS
Internet 上的所有缓存记录 TTL 都来自一个来源或另一个来源。这迫使您围绕两者中的较高者进行计划,除非您真的不关心您不操作的递归 DNS 服务器。将所有这些放在一起,我们得出以下结论:
NS
NS
NS
后过期。您不仅需要为尚未获得最新更改的客户端提供所有可用的服务器,而且两者之间记录数据的任何不一致都会使事情变得更加混乱。您可以使用 Windows 上的 nslookup 轻松完成此操作,我假设您可以使用 dig 执行此操作。使用 nslookup,您只需使用 debug 查询一个 GTLD 名称服务器以获取您的域的名称服务器记录,以获取您的域的名称服务器列表以及这些名称服务器记录的 TTL。
执行类似查询的语法
dig
是:过去,您可以查询域的 SOA 记录以获取默认 TTL 值:
但这已被弃用,取而代之的是 $TTL 指令。
如果您有感兴趣的特定记录,可以添加 +ttlid 标志来挖掘:
要获得剩余的确切 TTL:
(第二个字段是 TTL - 在本例中为 604800)