CentOS 7.我的问题是一个看似普遍的问题, nslookup
可以parsing主机,但ping
不能。 然而,像avahi或者/etc/nsswitch.conf这样的常见问题并没有帮助,因为我的VPS既不运行Avahi也不运行NetworkManager。 (换句话说,我可以通过设置hosts: files
来打破/etc/nsswitch.conf
hosts: files
和ping
继续工作)
/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命中/未命中计数器为这些有问题的查询。
我该如何解决这个问题?
我没有直接回答这个更大的问题,而是回答了一些不同的部分。
关于ping
与nslookup
值得注意的是, ping
只是使用操作系统parsing器库(即getaddrinfo
/ gethostbyname
调用)的常规程序的一个例子, nslookup
(以及dig
等)是DNS客户端程序自己的DNS查询,而不是使用parsing器库,为了方便起见,他们恰好从系统parsing器的configuration文件中选取了它们的默认服务器。
这意味着nslookup
对于testing系统parsing器的行为(例如resolv.conf
, nsswitch.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