“ping” 不遵守 /etc/resolv.conf 顺序

“ping” 不遵守 /etc/resolv.conf 顺序

CentOS 7. 我的问题是一个看似常见的问题,nslookup可以解决主机问题,但ping不能。然而,常见的答案就像弄乱avahi 或 /etc/nsswitch.conf没有帮助,因为我的 VPS 既没有运行 Avahi,也没有运行 NetworkManager。(换句话说,我可以/etc/nsswitch.conf通过设置中断hosts: filesping继续工作)

/etc/resolv.conf如下:

nameserver 10.44.13.246
nameserver 10.32.72.88
nameserver 10.32.72.86

其中第一个名称服务器指向在dnsmasq我的另一个 VPS 上运行的实例,后两个是托管提供商的 DNS 服务器。我希望按顺序查询它们(后两个只是最后的后备方法)。

dnsmasq现在,对于该实例中定义的任何主机,nslookup始终有效,并且ping有效一些时间-- 主机将正确解析,然后中断,几分钟后又会恢复正常。但是,如果我像etc/resolv.conf这样删除上游 DNS 服务器,

nameserver 10.44.13.246
#nameserver 10.32.72.88
#nameserver 10.32.72.86

然后ping立即开始工作100% 的时间。这与 resolv.conf 文档直接矛盾,该文档称,在没有指令的情况下option rotate,将按顺序查询服务器,直到其中一个服务器发送响应。

nscd正在运行并且被命中,因为我可以看到这些有问题的查询的缓存命中/未命中计数器上升。

我该如何解决这个问题?

答案1

我对这个较大的问题没有直接的答案,但对其中的一些不同部分有答案。


关于pingvsnslookup

值得注意的是,这只是一个使用操作系统解析器库(即/调用)ping的常规程序的示例,而(以及等)是 DNS 客户端程序,它们自己进行 DNS 查询,而不是使用解析器库,它们只是为了方便起见,恰好从系统解析器的配置文件中选择其默认服务器。getaddrinfogethostbynamenslookupdig

这意味着nslookup不适合测试系统解析器的行为(即resolv.confnsswitch.conf等),而 egping不适合测试 DNS。

值得注意的是,在 Linux 领域,我认为getent ahosts(例如getent ahosts www.example.com)是测试解析器行为的更好选择,并且比测试 DNSdig更可取。nslookup


关于你可以做什么来了解正在发生的事情

正如建议的那样静静地绝望地坚持,您可能想要使用strace(也许也是ltrace为了更高级别的视图),我建议使用它getent ahosts而不是ping不要得到所有关于它的实际目的的噪音ping,而您试图观察的只是一个副作用。getent ahosts只做你想调查的一件事。


关于 resolv.conf 中的内容

您所说的查询“错误”服务器时会出现“中断”的情况让我很疑惑,您为什么要把所有这些服务器都放进去resolv.conf。通常,将具有不同行为(在某些方面有所不同,但实际上对您的使用很重要)的服务器全部放在列表中并不是一个好主意。

答案2

Ping 比较老了。它早于 nsswitch,并且使用文件 /etc/host.conf(不确定这是否仍然与 RHEL7 相关)

此外,您不会查阅 /etc/hosts:我建议您尝试getent hosts name.example.com,它将查阅 /etc/hosts(由 nsswitch.conf 配置)。它使用 C 库的标准名称解析功能,其中host(和dig) 明确仅用于 DNS,并且仅查看 /etc/resolv.conf 来设置要使用的名称服务器和搜索域等内容的默认值 — 但除此之外,使用 BIND DNS 软件代码的一部分来查询 DNS

相关内容