/etc/resolv.conf 中的第二个名称服务器未被 wget 选中

ben*_*hsu 16 domain-name-system resolv.conf

我的 resolv.conf 看起来像这样:

; generated by /sbin/dhclient-script
search mcdc
nameserver 10.0.4.48
nameserver 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

如果我这样做的nslookup www.google.com

nslookup www.google.com
;; Got SERVFAIL reply from 10.0.4.48, trying next server
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
www.google.com  canonical name = www.l.google.com.
Run Code Online (Sandbox Code Playgroud)

但是当我卷曲 www.google.com 时,它无法解析主机。

我尝试在 strace 下运行 curl,发现 curl 仅使用 resolv.conf 中的第一个名称服务器,而不是第二个。如果我切换两条名称服务器线路,www.google.com 会解析,但内部 DNS 名称不会解析,因此这不是一个好的解决方法。

如何修复 resolv.conf 以使用两个名称服务器?

Ste*_*ski 30

resolv.conf 和解析器的默认行为是按列出的顺序尝试服务器。如果第一个名称服务器超时,解析器只会尝试下一个名称服务器。该resolv.conf的手册页说:

nameserver 名称服务器 IP 地址

解析器应查询的名称服务器的 Internet 地址(以点表示法)。最多可以列出 MAXNS(目前为 3 个,请参阅 参考资料)名称服务器,每个关键字一个。 如果有多个服务器,解析器库会按列出的顺序查询它们。

和:

(使用的算法是尝试名称服务器,如果查询超时,则尝试下一个,直到名称服务器耗尽,然后重复尝试所有名称服务器,直到达到最大重试次数。)

另请参阅resolver(5)手册页以获取更多信息。

您可以使用 更改解析器的行为rotate,它将以循环顺序查询名称服务器:

旋转在 _res.options 中设置 RES_ROTATE,这会导致从列出的名称服务器中循环选择名称服务器。这具有在所有列出的服务器之间分散查询负载的效果,而不是让所有客户端每次都首先尝试列出的第一个服务器。

但是,如果 nslookup 收到SERVFAIL来自第一个名称服务器的a,它将使用第二个名称服务器。从nslookup 联机帮助页

[no]fail 如果名称服务器响应 SERVFAIL 或引用 (nofail) 或终止查询 (fail),则尝试下一个名称服务器。

(默认 = nofail)


Nux*_*Nux 8

因此,为了使其按预期工作,请安装 dnsmasq 或其他轻量级 DNS 中继器(或完整的 DNS 服务器)。请参阅DNS 服务器软件比较

对于 dnsmasq 配置非常简单:

server=10.0.4.48
server=8.8.8.8
Run Code Online (Sandbox Code Playgroud)

您还可以指定哪个 DNS 应用于哪个域。例如:

server=/mcdc/10.0.4.48
server=8.8.8.8
Run Code Online (Sandbox Code Playgroud)

这将使 dnsmasq*.mcdc10.0.4.48DNS 服务器和8.8.8.8.

您只需/etc/resolv.conf使用本地 DNS:

nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

有关 dnsmasq 设置的更多详细信息,请参阅我的答案:https ://unix.stackexchange.com/questions/55090/change-default-dns-on-openvpn-connect/545591#545591 。


小智 6

是的,您可以使用“旋转”和超时设置来改进 DNS 查找,下面是示例,

前任:

[root@centos-xxxxxx ~]# cat /etc/resolv.conf
options rotate
options timeout:1
search xyz.abc.local
nameserver 192.168.56.3
nameserver 10.0.2.4
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这种方法有效,但不可靠。它基本上依赖于客户端重试,直到获得正确的名称服务器,这有时有效,有时无效。 (4认同)