CentOS 7. 我的问题是一个看似常见的问题,nslookup
可以解决主机问题,但ping
不能。然而,常见的答案就像弄乱avahi 或 /etc/nsswitch.conf没有帮助,因为我的 VPS 既没有运行 Avahi,也没有运行 NetworkManager。(换句话说,我可以/etc/nsswitch.conf
通过设置中断hosts: files
并ping
继续工作)
/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
我对这个较大的问题没有直接的答案,但对其中的一些不同部分有答案。
关于ping
vsnslookup
值得注意的是,这只是一个使用操作系统解析器库(即/调用)ping
的常规程序的示例,而(以及等)是 DNS 客户端程序,它们自己进行 DNS 查询,而不是使用解析器库,它们只是为了方便起见,恰好从系统解析器的配置文件中选择其默认服务器。getaddrinfo
gethostbyname
nslookup
dig
这意味着nslookup
不适合测试系统解析器的行为(即resolv.conf
、nsswitch.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