為什麼 DNS 查找不尊重 /etc/nsswitch.conf 和 /etc/host.conf?
我有一個問題,即從 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
將按照配置的順序使用定義的解析器設置。