【发布时间】:2010-09-07 11:18:35
【问题描述】:
如何找到冲突 DNS 记录的来源?
【问题讨论】:
标签: dns
如何找到冲突 DNS 记录的来源?
【问题讨论】:
标签: dns
一种简单的方法是使用在线域工具。我最喜欢的是Domain Tools(以前的 whois.sc)。我不确定他们是否可以解决冲突的 DNS 记录。例如,stackoverflow.com 的 DNS 服务器是
NS51.DOMAINCONTROL.COM
NS52.DOMAINCONTROL.COM
【讨论】:
您需要给定域名的 SOA(授权开始)记录,这就是您使用普遍可用的 nslookup 命令行工具完成它的方法:
command line> nslookup
> set querytype=soa
> stackoverflow.com
Server: 217.30.180.230
Address: 217.30.180.230#53
Non-authoritative answer:
stackoverflow.com
origin = ns51.domaincontrol.com # ("primary name server" on Windows)
mail addr = dns.jomax.net # ("responsible mail addr" on Windows)
serial = 2008041300
refresh = 28800
retry = 7200
expire = 604800
minimum = 86400
Authoritative answers can be found from:
stackoverflow.com nameserver = ns52.domaincontrol.com.
stackoverflow.com nameserver = ns51.domaincontrol.com.
origin(或 Windows 上的 primary name server)行告诉您 ns51.domaincontrol 是 的主要名称服务器stackoverflow.com。
在输出的末尾列出了所有权威服务器,包括给定域的备份服务器。
【讨论】:
dig 似乎是这样(请参阅下面的答案)
nslookup -type=soa stackoverflow.com,权威部分是空的。
您可以使用“host”命令找出域的名称服务器:
[davidp@supernova:~]$ host -t ns stackoverflow.com
stackoverflow.com name server ns51.domaincontrol.com.
stackoverflow.com name server ns52.domaincontrol.com.
【讨论】:
您可以使用 whois 服务。在类似 UNIX 的操作系统上,您将执行以下命令。或者,您可以在网络上通过 http://www.internic.net/whois.html 进行操作。
whois stackoverflow.com
你会得到以下响应。
...此处删除的文字...
按列出顺序排列的域服务器: NS51.DOMAINCONTROL.COM NS52.DOMAINCONTROL.COM
您可以使用 nslookup 或 dig 来查找有关给定域的记录的更多信息。这可能会帮助您解决您所描述的冲突。
【讨论】:
在 *nix 上:
$ dig -t ns <domain name>
【讨论】:
您应该在谷歌上搜索的术语是“权威”,而不是“权威”。
在 Linux 或 Mac 上,您可以使用命令 whois、dig、host、nslookup 或其他几个命令。 nslookup 也可能适用于 Windows。
一个例子:
$ whois stackoverflow.com
[...]
Domain servers in listed order:
NS51.DOMAINCONTROL.COM
NS52.DOMAINCONTROL.COM
至于额外积分:是的,有可能。
aryeh 肯定是错误的,因为他的建议通常只会给你主机名的 IP 地址。如果使用dig,则必须查找 NS 记录,如下所示:
dig ns stackoverflow.com
请记住,这可能会询问您的本地 DNS 服务器,因此可能会给出缓存中的错误或过时的答案。
【讨论】:
您在问题中使用了单数,但通常有多个权威名称服务器,RFC 1034 建议至少两个。
除非您的意思是“主要名称服务器”而不是“权威名称服务器”。二级域名服务器是权威的。
在 Unix 上找出域的名称服务器:
% dig +short NS stackoverflow.com
ns52.domaincontrol.com.
ns51.domaincontrol.com.
要找出列为主要的服务器(“主要”的概念现在非常模糊,通常没有好的答案):
% dig +short SOA stackoverflow.com | cut -d' ' -f1
ns51.domaincontrol.com.
为了检查名称服务器之间的差异,我更喜欢使用旧的 check_soa 工具,该工具在 Liu & Albitz “DNS & BIND”一书(O'Reilly 编辑)中有所描述。源码在http://examples.oreilly.com/dns5/
% check_soa stackoverflow.com
ns51.domaincontrol.com has serial number 2008041300
ns52.domaincontrol.com has serial number 2008041300
在这里,两个权威名称服务器具有相同的序列号。很好。
【讨论】:
www.pressero.com,它是另一个站点的 CNAME -- dig +short SOA 只返回 CNAME 目标。
www.pressero.com 这样做,您可能正在考虑 A 记录(这是 dig 中的默认记录类型,如果您没有指定它)。但如果需要,只需添加 tail -1 即可检索最终结果。
pressero.com 的SOA 你会搜索dig SOA pressero.com(有或没有+short,它会给你正确的结果)而不是dig SOA www.pressero.com(有不同的结果因为有一个 CNAME,所以 dig 是一个 DNS 故障排除工具,而不是一个完整的递归域名服务器)
不幸的是,这些工具中的大多数只返回实际名称服务器本身提供的 NS 记录。为了更准确地确定哪些名称服务器实际上对域负责,您必须使用“whois”并检查那里列出的域或使用“dig [domain] NS @[root name server]”并运行递归直到您获得名称服务器列表...
我希望有一个简单的命令行,您可以运行它以可靠且一致的格式获得该结果,而不仅仅是名称服务器本身给出的结果。对我来说,这样做的目的是能够查询我管理的大约 330 个域名,以便我可以准确地确定每个域指向的名称服务器(根据他们的注册商设置)。
有人知道在 *nix 上使用“dig”或“host”或其他东西的命令吗?
【讨论】:
我们已经构建了一个dns lookup tool,它可以在一个请求中为您提供域的权威域名服务器及其常见的 dns 记录。
示例:https://www.misk.com/tools/#dns/stackoverflow.com
我们的工具通过在根域名服务器上执行实时(未缓存的)dns 查找来查找权威域名服务器,然后跟踪域名服务器引用,直到我们到达权威域名服务器。这与 dns 解析器用于获取权威答案的逻辑相同。每个查询都会选择(并识别)一个随机的权威域名服务器,让您可以通过执行多个请求来找到冲突的 dns 记录。
您还可以通过单击上例中 dns 查找结果底部的“Authoritative Nameservers”来查看名称服务器委托路径。
例如:https://www.misk.com/tools/#dns/stackoverflow.com@f.root-servers.net
【讨论】:
我发现添加 +trace 选项的最佳方式是:
dig SOA +trace stackoverflow.com
它也适用于托管在不同提供商中的递归 CNAME。 +trace 跟踪暗示 +norecurse 因此结果仅适用于您指定的域。
【讨论】:
SOA 记录存在于层次结构更上层的所有服务器上,域所有者无法控制这些服务器,它们实际上都指向一个受域所有者控制的权威名称服务器。
另一方面,权威服务器本身上的 SOA 记录并不是解析该域所必需的,并且可能包含虚假信息(或隐藏的主服务器或其他受限制的服务器),不应依赖于确定给定域的权威名称服务器。
您需要查询对顶级域具有权威性的服务器,以获取给定子域的可靠 SOA 信息。
(可以从根名称服务器查询哪个服务器对哪个 TLD 具有权威性的信息)。
当您从 TLD 权威服务器获得有关 SOA 的可靠信息时,您可以查询主名称服务器本身的权威(即 gTLD 名称服务器上 SOA 记录中的那个!)以获取任何其他 NS 记录,然后继续检查您从查询 NS 记录中获得的所有名称服务器,以查看在任何这些服务器上是否存在任何其他特定记录的不一致。
与 nslookup/windows 相比,这一切在 linux 和 dig 中运行得更好/更可靠。
【讨论】:
我发现对于某些域,上述答案不起作用。我发现最快的方法是首先检查 NS 记录。如果不存在,请检查 SOA 记录。如果不存在,则使用 dig 递归解析名称并获取最后返回的 NS 记录。一个适合这个的例子是analyticsdcs.ccs.mcafee.com.
host -t NS analyticsdcs.ccs.mcafee.com.
host -t SOA analyticsdcs.ccs.mcafee.com.
dig +trace analyticsdcs.ccs.mcafee.com. | grep -w 'IN[[:space:]]*NS' | tail -1
host analyticsdcs.ccs.mcafee.com. gtm2.mcafee.com.
【讨论】: