我的resolv.conf
样子是这样的:
; generated by /sbin/dhclient-script
search mcdc
nameserver 10.0.4.48
nameserver 8.8.8.8
如果我这样做,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.
但是当我卷曲www.google.com,它无法解析主机。
我尝试在 strace 下运行 curl,发现 curl 只使用了 中的第一个名称服务器resolv.conf
,而不是第二个。如果我将两个名称服务器行互换,www.google.com可以解析,但内部 DNS 名称却不能,所以这不是一个好的解决方法。
我该如何修复resolv.conf
以使用这两个名称服务器?
答案1
resolv.conf 和解析器的默认行为是按照列出的顺序尝试服务器。如果第一个名称服务器超时,解析器将只尝试下一个名称服务器。resolv.conf 手册页说:
nameserver 名称服务器 IP 地址
解析器应查询的名称服务器的 Internet 地址(以点表示法表示)。最多可列出 MAXNS 个(当前为 3 个,请参阅)名称服务器,每个关键字一个。 如果有多个服务器,解析器库将按照列出的顺序进行查询。
和:
(使用的算法是尝试一个名称服务器,如果查询超时,则尝试下一个,直到名称服务器用完,然后重复尝试所有名称服务器,直到达到最大重试次数。)
另请参阅旋转变压器(5)手册页以获取更多信息。
您可以使用 来改变解析器的行为rotate
,它将以循环顺序查询名称服务器:
rotate 在 _res.options 中设置 RES_ROTATE,这会导致从列出的服务器中循环选择名称服务器。这可以将查询负载分散到所有列出的服务器中,而不是让所有客户端每次都先尝试列出的第一个服务器。
SERVFAIL
但是,如果 nslookup从第一个名称服务器收到,它将使用第二个名称服务器。从nslookup 手册页:
[no]fail 如果名称服务器以 SERVFAIL 或引用 (nofail) 响应,则尝试下一个名称服务器,或者在这样的响应上终止查询 (fail)。
(默认 = 无失败)
答案2
是的,您可以使用“旋转”和超时设置来改进 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
答案3
因此,要使其按预期工作,请安装 dnsmasq 或其他轻量级 DNS 中继器(或功能齐全的 DNS 服务器)。请参阅DNS服务器软件比较。
对于 dnsmasq,配置非常简单:
server=10.0.4.48
server=8.8.8.8
您还可以指定哪个域应该使用哪个 DNS。例如:
server=/mcdc/10.0.4.48
server=8.8.8.8
这将使 dnsmasq*.mcdc
在10.0.4.48
DNS 服务器和任何其他服务器中查找8.8.8.8
。
如果/etc/resolv.conf
你只使用本地 DNS:
nameserver 127.0.0.1
有关 dnsmasq 设置的详细信息,请参阅我的回答:https://unix.stackexchange.com/questions/55090/change-default-dns-on-openvpn-connect/545591#545591。
答案4
在 ubuntu 18.04 LTS 中启动 resolv conf 时添加以下命令有效
options rotate