为什么 DNS 查找不遵守 /etc/nsswitch.conf 和 /etc/host.conf?

为什么 DNS 查找不遵守 /etc/nsswitch.conf 和 /etc/host.conf?

我遇到一个问题,即使主机名存在于 /etc/hosts 中,也会从 DNS 中查找主机名。

我已经进行了以下配置:

/etc/host.conf:

order hosts,bind

/etc/nsswitch.conf:

hosts:      files dns

/etc/resolv.conf:

nameserver <nameserver one>
nameserver <nameserver two>

主机上运行的应用程序会发出一些内部和外部 API 请求。

从 tcpdump 中,我看到了对 /etc/hosts 中列出的某些内部服务主机名的 DNS 查询。我使用的 tcpdump 命令是:

tcpdump -tqAlU -s0 port 53 and host <nameserver one>

在转储中我看到如下请求:

IP 10.0.80.11.domain > app004-private.51308: UDP, length 102
E...I2..>...
.P.
.........I.1E...:...Q.. localhost............   [email protected]..
IP app004-private.33828 > 10.0.80.11.domain: UDP, length 39
E..Ca.@[email protected].
.2.
.P..$.5./..3e.......... localhost.site.com.....
IP 10.0.80.11.domain > app004-private.33828: UDP, length 96
E..|....>.T;
.P.
.2..5.$.hU.3e.......... localhost.site.com................-.ns10.dnshost.com...dns.8w.............u.....

请注意,localhost 和 localhost.site.com 都被发送到 DNS。localhost 的 /etc/hosts 条目为:

127.0.0.1 localhost.localdomain localhost

IP 10.0.80.11.domain > app004-private.51664: UDP, length 93
E..yx...>.m.
.P.
.2..5...e.<N2...........api.site.com................-.ns10.dnshost...dns.5w.............u.....
IP app004-private.51664 > 10.0.80.11.domain: UDP, length 48
E..L`.@[email protected].
.2.
.P....5.8..n............api.site.com.site.com.....
IP 10.0.80.11.domain > app004-private.48878: UDP, length 76
E..h&e..>..w
.P.
.2..5...TQ..............11.80.0.10.in-addr.arpa.............Q............p.... .        :...Q.
IP 10.0.80.11.domain > app004-private.51664: UDP, length 105
E...VX..>..g
.P.
.2..5...qJ.n............api.site.com.site.com................-.ns10.dnshost.'.dns.Aw.............u.....

其中 api.site.com 位于 /etc/hosts 中。运行 getent 查询 api.site.com 返回:

$ getent hosts api.site.com
10.36.176.114   api001-private api001-private.site.com api001 api.site.com api

我被难住了。一切似乎都配置正确(据我所知)首先使用 /etc/hosts然后DNS。有没有关于为什么不遵守 /etc/nsswitch.conf 和 /etc/host.conf 的见解?

系统上运行的主要应用程序是 http(apache 2.2.15 和 PHP 5.3.8,带有 curl 7.30.0)。操作系统是 Centos 5.6,运行内核 2.6.18-238.9.1.el5 和 glibc 2.5-58.el5_6.3。

提前致谢!

答案1

我们可以通过禁用 ipv6 来解决这个问题。我们通过将以下内容添加到 /etc/modprobe.conf 并重新启动来禁用 ipv6。

alias net-pf-10 off
alias ipv6 off
options ipv6 disable=1

重启后,我们不再看到 /etc/hosts 中列出的主机的 DNS 查找。

我不清楚这究竟为什么能解决这个问题。

答案2

很多应用程序不使用 OS-api 来查询名称。相反,它们会进行显式 DNS 查询。

如果发生这种情况 - 他们将不会通过解析器库。

在 Linux 上,您可以在命令行上执行相同操作:

  • host YOURHOST将会尝试解析 DNS – 无论如何。
  • gethostip YOURHOST将按照配置的顺序使用定义的解析器设置。

答案3

看起来您的应用程序使用了 curl 库,该库具有自己的名称解析功能复杂性,例如:

https://stackoverflow.com/questions/29570033/how-can-i-get-libcurl-to-return-me-dnsresolver-used-for-connect-call

相关内容