为什么我的服务器不查询 resolv.conf 中的第二条条目?

为什么我的服务器不查询 resolv.conf 中的第二条条目?

我有一个 CentOS 6.4 盒子。

与此机架中的所有其他盒子一样,它有两个 NIC:一个内部(192.168.1.x),一个外部(全世界可见)。

我们在机架 (192.168.1.11) 中的一台服务器上运行我们自己的缓存解析器 (使用 Unbound),并且它配置了一些本地 DNS 条目 (mario.local、luigi.local 等),以便我们可以简单地从任何本地机器 ping/ssh/ftp 到“主机名”到任何其他本地机器,而无需通过其中一个外部交换机(这会产生我们 ISP 的费用)。

如果我的 /etc/resolv.conf 如下所示:

search local
nameserver 192.168.1.11
nameserver 8.8.8.8
nameserver 74.82.42.42

然后我 ping “mario”,得到结果:

# ping mario
PING mario.local (192.168.1.3) 56(84) bytes of data.
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.738 ms

但是,本地 DNS 服务器比 Google 公共 DNS 服务器慢得多,因此我更希望将其放在列表的首位。因此,如果我将 /etc/resolve.conf 更改为以下内容:

search local
nameserver 8.8.8.8
nameserver 192.168.1.11
nameserver 74.82.42.42

我期望 ping 到“mario”会尝试解析 8.8.8.8 上的 mario.local,失败,然后查询列表中的第二个 DNS 服务器 (192.168.1.11) 并解析。但我得到的却是:

# ping mario
ping: unknown host mario

知道我做错了什么吗?或者我误解了 resolve.conf 应该如何工作?我想知道这是否与路由有关。

我的预期是,如果第一个 DNS 服务器无法解析 IP,则第二个 resolv.conf 条目会得到尝试,但那不起作用。救命!

答案1

仅当尝试访问第一个名称服务器超时时,解析器才会查询第二个名称服务器。对于您来说,这不是超时问题,而是解析失败,因此无需查询其余名称服务器。

您可以通过在第一行中添加没有运行名称服务器的 IP 以及其下方的真实名称服务器来测试这一点 - 如下所示

 search local
 nameserver 1.2.3.4
 nameserver 192.168.1.11
 nameserver 8.8.8.8

第一个肯定会超时,然后按照顺序查询剩下的名称服务器。

答案2

您肯定需要让本地解析器运行以执行递归查找并缓存结果,这是本地网络上的最佳实践——我同意 Zoredache 的观点。这样,它将通过查询本地权威名称服务器(可能在同一主机上运行)来缓存“本地”TLD 内的域名,以及从基于 Internet 的公共域名称服务器递归解析的结果。

假设可用的硬件资源,这个/这些缓存名称服务器不会超出其可接受的限制,这将始终比访问公共名称服务器提供更好的性能,因为解析的域名被缓存后,延迟响应较低。

设置完成后,您将利用您的第一个resolv.conf示例并省略公共 IP。当然,您需要冗余的本地解析器。

相关内容