我目前正在将 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 注册商级别的 NS 记录指向 Provider1 的名称服务器。
当我更改 Provider1 区域中的 NS 记录时,我几乎可以立即看到这反映在 NS 查询中(使用“dig example.com ns”)。
但是,当我发送 A 记录查询时,即
test.example.com
它总会返回
10.0.0.1
无论提供商 1 的区域中的 NS 记录设置为何。
在此基础上,我得出结论,区域文件内的 NS 记录与迁移无关,只有 TLD 级别的名称服务器记录才是重要的。
然而,我无法得知那里的变化需要传播多长时间,无论是向前还是向后。
是否可以查询我正在使用的来自 TLD 根服务器的记录的 TTL 是什么?
答案1
在此基础上,我得出结论,区域文件内的 NS 记录与迁移无关,只有 TLD 级别的名称服务器记录才是重要的。
这是一个错误的假设,但很容易犯。你可以阅读更多关于顶点 NS 记录的内容这里简而言之,两者都很重要,并且使用哪种方式将取决于缓存 DNS 服务器是否先前查询过您的域。
请记住,大多数递归 DNS 服务器都会强制执行最小 TTL,因此,任何从 TTL 为零的实验中得出的结论几乎肯定是不准确的。唯一不准确的情况是,当您控制查询服务器使用的最小 TTL 策略时。
我目前正在将 DNS 区域从一个 DNS 服务器提供商迁移到另一个。我正在尝试估计更改需要多长时间才能传播,并了解如果我选择中途回滚,延迟可能会有多大。
我将重点讨论这个话题,因为您的问题的其他部分有一些错误的开始。首先,重要的是要记住 TTL 缓存在递归 DNS 服务器上。由于互联网上的每个人都在使用不同的递归 DNS 服务器,因此仅有的你可以做的假设是,这将需要n秒,n是 TTL 的值。
这让我们知道哪些 TTL 与此相关:
- 缓存中单个记录的 TTL。即使
NS
记录过期,缓存中单个记录的请求也不会自动过期。例如:如果test.example.com IN A
从现在起 10 分钟后过期,但从example.com IN NS
现在起 5 分钟后过期,test.example.com
则即使记录NS
已更改,仍将保留在缓存中。在新服务器上与此记录的值相关的任何问题都不会显现出来,直到记录过期并刷新后才会显现出来。 - TLD DNS 服务器提供的胶水记录的 TTL
NS
。递归服务器使用这些 TTL,这些服务器需要在首次请求时获取有关您的域的信息。这些 TTL 会影响区域文件中列出的 DNS 服务器在下次刷新之前需要多长时间。(有关此内容的说明,请参阅我上面链接的问答) NS
区域文件顶部列出的记录的TTL 。一旦胶水记录 TTL 过期,这些 TTL可能可以代替使用。具体实现在此细节上有所不同。由于您要处理整个互联网的不同实现,因此唯一安全的假设是某些服务器正在使用它。
您不能假设NS
互联网上所有缓存记录的 TTL 都来自一个或另一个来源。这迫使您围绕两者中较高的一个进行规划,除非您真的不关心您不操作的递归 DNS 服务器。
综合以上所有因素,我们得出以下结论:
- 任何给定 DNS 记录刷新到新名称服务器所需的最大时间为最高 TTL该记录、
NS
胶水中的记录以及NS
区域中的记录之间。 - 假设新 DNS 服务器上的 TTL 与旧服务器相同,则回滚所需的最大时间为再次取三个 TTL 中的最高值。在您最初更改 DNS 服务器和恢复更改之间,任何登陆到新服务器的查询都将依赖于从新服务器获得的值。
- 它是很重要让所有参与更改的 DNS 服务器保持运行和同步,直到最终
NS
记录更改后所有 TTL 都过期。您不仅需要所有服务器都可供尚未获取最新更改的客户端使用,而且两者之间记录数据的任何不一致都会使事情变得更加混乱。
答案2
您可以在 Windows 上使用 nslookup 轻松完成此操作,我假设您可以使用 dig 执行相同操作。使用 nslookup,您只需查询其中一个 GTLD 名称服务器以获取您的域的名称服务器记录,然后使用 debug 获取您的域的名称服务器列表以及这些名称服务器记录的 TTL。
Microsoft Windows [Version 10.0.10240]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Users\Joe>nslookup
Default Server: Unknown
Address: 192.168.1.2
> server f.gtld-servers.net
Default Server: f.gtld-servers.net
Address: 192.35.51.30
> set q=ns
> set debug
> crabbygeezer.com
Server: f.gtld-servers.net
Address: 192.35.51.30
------------
Got answer:
HEADER:
opcode = QUERY, id = 4, rcode = NOERROR
header flags: response, want recursion
questions = 1, answers = 0, authority records = 5, additional = 10
QUESTIONS:
crabbygeezer.com, type = NS, class = IN
AUTHORITY RECORDS:
-> crabbygeezer.com
nameserver = freedns1.registrar-servers.com
ttl = 172800 (2 days)
-> crabbygeezer.com
nameserver = freedns2.registrar-servers.com
ttl = 172800 (2 days)
-> crabbygeezer.com
nameserver = freedns3.registrar-servers.com
ttl = 172800 (2 days)
-> crabbygeezer.com
nameserver = freedns4.registrar-servers.com
ttl = 172800 (2 days)
-> crabbygeezer.com
nameserver = freedns5.registrar-servers.com
ttl = 172800 (2 days)
ADDITIONAL RECORDS:
-> freedns1.registrar-servers.com
internet address = 208.64.122.242
ttl = 172800 (2 days)
-> freedns1.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
-> freedns2.registrar-servers.com
internet address = 208.64.122.244
ttl = 172800 (2 days)
-> freedns2.registrar-servers.com
internet address = 72.20.38.137
ttl = 172800 (2 days)
-> freedns3.registrar-servers.com
internet address = 5.135.128.216
ttl = 172800 (2 days)
-> freedns3.registrar-servers.com
internet address = 62.210.149.103
ttl = 172800 (2 days)
-> freedns4.registrar-servers.com
internet address = 62.210.149.102
ttl = 172800 (2 days)
-> freedns4.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
-> freedns5.registrar-servers.com
internet address = 192.99.40.34
ttl = 172800 (2 days)
-> freedns5.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
------------
crabbygeezer.com
nameserver = freedns1.registrar-servers.com
ttl = 172800 (2 days)
crabbygeezer.com
nameserver = freedns2.registrar-servers.com
ttl = 172800 (2 days)
crabbygeezer.com
nameserver = freedns3.registrar-servers.com
ttl = 172800 (2 days)
crabbygeezer.com
nameserver = freedns4.registrar-servers.com
ttl = 172800 (2 days)
crabbygeezer.com
nameserver = freedns5.registrar-servers.com
ttl = 172800 (2 days)
freedns1.registrar-servers.com
internet address = 208.64.122.242
ttl = 172800 (2 days)
freedns1.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
freedns2.registrar-servers.com
internet address = 208.64.122.244
ttl = 172800 (2 days)
freedns2.registrar-servers.com
internet address = 72.20.38.137
ttl = 172800 (2 days)
freedns3.registrar-servers.com
internet address = 5.135.128.216
ttl = 172800 (2 days)
freedns3.registrar-servers.com
internet address = 62.210.149.103
ttl = 172800 (2 days)
freedns4.registrar-servers.com
internet address = 62.210.149.102
ttl = 172800 (2 days)
freedns4.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
freedns5.registrar-servers.com
internet address = 192.99.40.34
ttl = 172800 (2 days)
freedns5.registrar-servers.com
internet address = 72.20.53.50
ttl = 172800 (2 days)
>
执行类似查询的语法dig
是:
$ dig NS crabbygeezer.com @f.gtld-servers.net +trace
答案3
以前您可以查询域的 SOA 记录以获取默认 TTL 值:
dig example.com. SOA
但它已被弃用,取而代之的是 $TTL 指令。
如果您有感兴趣的特定记录,可以添加 +ttlid 标志来挖掘:
dig +ttlid somehost.example.com.
要获取准确的 TTL 剩余时间:
;; ANSWER SECTION:
somehost.example.com. 604800 IN A 192.168.99.5
(第二个字段是 TTL - 在本例中为 604800)