我遇到一个问题,即使主机名存在于 /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 库,该库具有自己的名称解析功能复杂性,例如: