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

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

我在 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.88.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 服务器询问内部域。

相关内容