假设我想知道查找域的 A 和 AAAA 记录,例如:google.com
我可以使用host
:
$ host google.com
google.com has address 172.217.169.46
google.com has IPv6 address 2a00:1450:4009:801::200e
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
但这显然没有将它们全部列出,就好像我直接查询名称服务器一样,我得到了不同的答案:
$ host google.com ns2.google.com
Using domain server:
Name: ns2.google.com
Address: 216.239.34.10#53
Aliases:
google.com has address 216.58.205.46
google.com has IPv6 address 2a00:1450:4009:808::200e
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
结果甚至似乎因查询而异......所以我推断有一些事情正在发生,DNS服务器没有告诉整个画面。
换个角度看,如果你去 robtex.com 之类的网站上查找,并在那里查找域,我的查询没有返回一长串 IP:
https://www.robtex.com/dns-lookup/google.com#records
目前列出了这个长长的 IP 号码集合:
2404:6800:4003:c02::8b
2404:6800:4004:807::200e
2404:6800:4006:803::200e
2607:f8b0:4004:811::200e
2607:f8b0:4005:802::200e
2607:f8b0:4005:808::200e
2607:f8b0:400a:809::200e
2800:3f0:4001:803::200e
2a00:1450:400b:805::200e
74.125.68.100
74.125.68.101
74.125.68.102
74.125.68.113
74.125.68.138
74.125.68.139
172.217.0.46
172.217.5.110
172.217.15.110
172.217.27.78
172.217.29.14
172.217.171.14
216.58.194.174
216.58.199.46
如果正确,则表明我从中得到的答案host
仅暗示了真实情况。
怎样才能得到完整、权威的答案?
从客户端来看,您可能永远无法了解全貌,因为许多 DNS 端点都在使用 GeoDNS 和其他基于 GeoLocation 的负载平衡。
但是,假设您可以访问分布在全球各地的客户端,您可以使用 GNU dig 来实现这一点。
您首先需要找到要查询的根名称服务器 - 只需运行即可获得根名称服务器列表
dig
。获取其中一个输出服务器(在本例中为 l.root-servers.net)并查询它:(dig @l.root-servers.net -t NS DOMAIN.NEt
产生如下输出:这将给出 TLD 名称服务器的列表。现在,如果您想要一个全局完整的视图,您需要从分布在全球的客户端执行剩余的查询(使用 CDN 或类似的)。
要获得真正完整的视图,您应该从所有全局客户端端点遍历所有这些名称服务器;但是您可能会缩短它,只需查询其中一个以获取他们知道的目标域的所有名称服务器:
dig @a.gtld-servers.net. -t NS DOMAIN.NET
这会给你这样的东西:
^^^^ 这是您的 domain.net 名称服务器的起始列表。记下它们。
接下来,遍历这些输出名称服务器并确保它们不会委托给其他名称服务器:
dig @c.dns.domain.net -t NS DOMAIN.NET
如果这会产生您在上一个查询中未列出的任何名称服务器,请将它们添加到要查询的 DOMAIN.NET 名称服务器列表中。
现在,遍历您的 DOMAIN.NET 名称服务器列表并像这样查询每一个(其中 $NAME_SERVER 是您当前正在查询的列表中的名称服务器):
将上述两个查询的结果添加到 DOMAIN.NET 的 A 和 AAAA 记录列表中。
一旦您从所有全球分布式客户端查询了所有权威名称服务器,您将拥有一个相当完整的视图。