Domain-Name-System

為什麼 DNS 查找不尊重 /etc/nsswitch.conf 和 /etc/host.conf?

  • November 1, 2016

我有一個問題,即從 DNS 中查找主機名,即使它們存在於 /etc/hosts 中。

我配置了以下內容:

/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............   ..@.a.root-servers.net..nstld.verisign-grs.com.w..
IP app004-private.33828 > 10.0.80.11.domain: UDP, length 39
E..Ca.@.@.B.
.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 正在發送到 DNS 以及 localhost.site.com。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`.@.@.C.
.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。

提前致謝!

我們可以通過禁用 ipv6 來解決這個問題。我們通過將以下內容添加到 /etc/modprobe.conf 並重新啟動來禁用 ipv6。

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

重新啟動後,我們不再看到 /etc/hosts 中列出的主機的 DNS 查找。

我不清楚為什麼這能解決這個問題。

有許多應用程序不使用 OS-api 來查詢名稱。相反,他們執行顯式 DNS 查詢。

如果發生這種情況 - 他們將不會通過解析器庫。

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

  • host YOURHOST將嘗試解析 DNS - 無論如何。
  • gethostip YOURHOST將按照配置的順序使用定義的解析器設置。

引用自:https://serverfault.com/questions/517122