![如果第一个名称服务器不是递归的,为什么 DNS 查询会失败?](https://linux22.com/image/182558/%E5%A6%82%E6%9E%9C%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%90%8D%E7%A7%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8D%E6%98%AF%E9%80%92%E5%BD%92%E7%9A%84%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%20DNS%20%E6%9F%A5%E8%AF%A2%E4%BC%9A%E5%A4%B1%E8%B4%A5%EF%BC%9F.png)
我在 Windows Active Directory 域内有一个 Linux 盒子(Ubuntu 服务器 11.10),并使用以下命令加入该域同样开放。该resolv.conf
文件如下所示:
domain mydomain.com
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 8.8.4.4
其中192.168.1.1
是 Windows 域的 Windows DNS 服务器。8.8.8.8
和8.8.4.4
是 Google 的公共 DNS 服务器,我们比 ISP 服务器更喜欢它。
该设置运行正常,直到由于网络设计的一些变化而决定禁用 Windows DNS 服务器中的递归。我认为这会很顺利,因为我们接下来将其配置为使用 Google 的服务器,但似乎并非如此:
mydomain\myuser@linux-server:~$ dig google.com
; <<>> DiG 9.7.3 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55321
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 4
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;google.com. IN A
;; AUTHORITY SECTION:
. 3600 IN NS c.root-servers.net.
. 3600 IN NS d.root-servers.net.
. 3600 IN NS e.root-servers.net.
. 3600 IN NS f.root-servers.net.
. 3600 IN NS g.root-servers.net.
. 3600 IN NS h.root-servers.net.
. 3600 IN NS i.root-servers.net.
. 3600 IN NS j.root-servers.net.
. 3600 IN NS k.root-servers.net.
. 3600 IN NS l.root-servers.net.
. 3600 IN NS m.root-servers.net.
. 3600 IN NS a.root-servers.net.
. 3600 IN NS b.root-servers.net.
;; ADDITIONAL SECTION:
c.root-servers.net. 3600 IN A 192.33.4.12
d.root-servers.net. 3600 IN A 128.8.10.90
e.root-servers.net. 3600 IN A 192.203.230.10
f.root-servers.net. 3600 IN A 192.5.5.241
;; Query time: 4 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Jan 8 14:02:22 2014
;; MSG SIZE rcvd: 507
还:
mydomain\myuser@linux-server:~$ ping google.com
ping: unknown host google.com
而且我的鱿鱼代理连接也失败了(我使用dns_名称服务器选项在鱿鱼配置中并忽略内部 DNS 服务器)。
当第一个名称服务器拒绝递归时,为什么 DNS 请求会失败?该机器不应该尝试下一个服务器吗?如果这是预期(设计)的行为,我该怎么办?
编辑:NSLOOKUP 给出了其他(成功)结果:
mydomain\myuser@linux-server:~$ nslookup google.com
;; Got recursion not available from 192.168.1.1, trying next server
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: google.com
Address: 173.194.67.102
Name: google.com
Address: 173.194.67.138
Name: google.com
Address: 173.194.67.100
Name: google.com
Address: 173.194.67.113
Name: google.com
Address: 173.194.67.139
Name: google.com
Address: 173.194.67.101
那么这是否依赖于应用程序?我能否让(如果第一个服务器拒绝递归,则尝试下一个服务器)对所有请求名称解析的应用程序透明地工作,或者名称解析是程序本身的责任? (或者我错过了什么?!)...
编辑:另外值得注意的是,mydomain.com
它是互联网上的注册公共地址,不属于我们所有。就像我们已经建立了一个名为 的内部域apple.com
,我向你保证我不为 Apple 工作,至少现在还不是;-)。
答案1
恐怕答案是“视情况而定”。
就目前而言dig
,它基本上是一个用来调试DNS信息的工具。因此,它会向您显示从您询问的名称服务器返回的信息;它不会继续提出进一步的问题。
对于其他程序,这将取决于程序。大多数人可能会使用操作系统的函数来进行名称解析(请参阅 参考资料man getnameinfo
)。其他人可能不会。这意味着如果您列出非递归名称服务器,您将遇到一些很难定位的错误。
换句话说,在解析器列表中保留非递归名称服务器是一个坏主意。
如果您不希望 Windows 服务器递归,那么我建议设置一台单独的服务器作为解析器,并让该服务器向 Windows 服务器询问内部域。