`ping` 不遵守 /etc/resolv.conf 命令

Mik*_*her 3 domain-name-system linux

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
Run Code Online (Sandbox Code Playgroud)

第一个名称服务器指向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
Run Code Online (Sandbox Code Playgroud)

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

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

我该如何解决这个问题?

Håk*_*ist 8

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


关于pingvsnslookup

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

这是什么意思的是,nslookup用于测试系统解析器的行为(即如何不好resolv.confnsswitch.conf等等),而例如ping是用于测试DNS坏。

可以注意到,在 Linux 领域,我会考虑getent ahosts(例如getent ahosts www.example.com)一个更好的选择来测试解析器行为,并且dignslookup测试 DNS更可取。


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

正如Hangin 在安静的绝望中建议的那样,您可能想要使用strace(也许也是ltrace为了更高级别的视图),我建议使用它getent ahosts而不是ping不获得ping实际目的的所有噪音,而您重新尝试观察什么只是副作用。getent ahosts只是做你正在尝试调查的一件事。


关于 resolv.conf 中的内容

当“错误”的服务器被查询时,你所说的关于“破坏”的事情让我想知道你为什么把所有这些服务器resolv.conf放在首位。将具有不同行为(以某种方式对您的使用实际上很重要的方式不同)的服务器全部放在列表中通常真的不是一个好主意。