/etc/resolv.conf命令不受“ping”的限制

CentOS 7.我的问​​题是一个看似普遍的问题, nslookup可以parsing主机,但ping不能。 然而,像avahi或者/etc/nsswitch.conf这样的常见问题并没有帮助,因为我的VPS既不运行Avahi也不运行NetworkManager。 (换句话说,我可以通过设置hosts: files来打破/etc/nsswitch.conf hosts: filesping继续工作)

/etc/resolv.conf如下:

 nameserver 10.44.13.246 nameserver 10.32.72.88 nameserver 10.32.72.86 

第一个名称服务器指向在另一个VPS上运行的dnsmasq实例,最后两个是主机提供商的DNS服务器。 我期望他们能够被顺序查询(最后两个只是最后一招)。

现在,对于在那个dnsmasq实例中定义的任何主机, nslookup总是可以工作的,并且一些时候 ping工作 – 主机将正确parsing,然后中断,然后几分钟后它会再次正常工作。 但是,如果我这样删除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正在运行,正在被击中,因为我可以看到caching命中/未命中计数器为这些有问题的查询。

我该如何解决这个问题?

我没有直接回答这个更大的问题,而是回答了一些不同的部分。

关于pingnslookup

值得注意的是, ping只是使用操作系统parsing器库(即getaddrinfo / gethostbyname调用)的常规程序的一个例子, nslookup (以及dig等)是DNS客户端程序自己的DNS查询,而不是使用parsing器库,为了方便起见,他们恰好从系统parsing器的configuration文件中选取了它们的默认服务器。

这意味着nslookup对于testing系统parsing器的行为(例如resolv.confnsswitch.conf等)是不好的,而ping对于testingDNS是不利的。

可以注意到,在Linux版本中,我会考虑testingparsing器行为的更好的select,并且比nslookup更喜欢testingDNS。

关于你可以做什么来看看发生了什么

正如Hangin在安静的绝望中所build议的那样,你可能想要使用strace (也许ltrace为了更高层次的视图),我build议使用它与getent ahosts而不是ping ,不要ping所有的噪音实际的目的,而你试图观察什么只是一个副作用。 getent ahosts只是做这件事情,你正在试图调查。

关于在resolv.conf中有什么

当对“错误”的服务器进行查询时,你所说的关于“中断”的事情让我想知道为什么你把所有这些服务器放在resolv.conf中。 一般来说,将服务器放在列表中的行为(不同于某种方式对您的使用而言非常重要)并不是一个好主意。

平老了。 它早于nsswitch,并使用文件/etc/host.conf(不知道这是否仍然与RHEL7相关)

此外,您不会咨询/ etc / hosts:我可以build议您尝试getent hosts name.example.com ,它将咨询/ etc / hosts(由nsswitch.confconfiguration)。 这使用了C库的标准名称parsingfunction,其中host (和dig )明确是关于DNS,并且只查看/etc/resolv.conf来设置默认值,比如使用哪个域名服务器和search域,使用部分BIND DNS软件代码来查询DNS