如果第一个名称服务器不是递归的,为什么 DNS 查询会失败?

amy*_*sin 9 dns resolvconf

我在 Windows Active Directory 域中有一个 Linux 机器(Ubuntu 服务器 11.10),并且使用likewise-open加入了域。该resolv.conf文件如下所示:

domain mydomain.com
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 8.8.4.4
Run Code Online (Sandbox Code Playgroud)

192.168.1.1Windows 域的 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
Run Code Online (Sandbox Code Playgroud)

还:

mydomain\myuser@linux-server:~$ ping google.com
ping: unknown host google.com
Run Code Online (Sandbox Code Playgroud)

而且我也失败了鱿鱼代理连接(我使用鱿鱼配置中的dns_nameservers选项解决了这个问题,而忽略了内部 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
Run Code Online (Sandbox Code Playgroud)

那么这是依赖于应用程序吗?我可以让(如果第一个拒绝递归,尝试下一个服务器)为所有请求名称解析的应用程序透明地工作,或者名称解析是程序本身的责任?(或者我错过了什么?!)...

编辑:另外值得注意的是,mydomain.com是互联网上的注册公共地址,不归我们所有。这就像我们已经建立了一个名为 的内部域apple.com,我向你保证我不为 Apple 工作,至少现在还没有 ;-)。

Jen*_*y D 6

恐怕答案是“视情况而定”。

就其dig而言,它基本上是一个用于调试DNS信息的工具。因此,它会向您显示从您询问的名称服务器返回的信息;它不会继续并提出进一步的问题。

对于其他程序,这将取决于程序。大多数人可能会使用操作系统的函数进行名称解析(请参阅 参考资料man getnameinfo)。其他人可能不会。这意味着如果您列出非递归名称服务器,您将遇到一些很难定位的错误。

换句话说,在解析器列表中保留非递归名称服务器是一个坏主意。

如果您不希望 Windows 服务器递归,那么我建议设置一个单独的服务器作为解析器,并让该服务器向 Windows 服务器询问内部域。