web-dev-qa-db-ja.com

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.site.comだけでなく、localhostも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 then DNSを使用するように、すべてが正しく(私の知る限り)構成されているようです。 /etc/nsswitch.confおよび/etc/Host.confが尊重されていない理由に関する洞察はありますか?

システムで実行されているメインアプリケーションはhttp(Apache 2.2.15およびPHP 5.3.8 with curl 7.30.0)です。OSは、カーネル2.6.18-238.9.1で実行されているCentos 5.6です。 .el5およびglibc 2.5-58.el5_6.3。

前もって感謝します!

5
drsnyder

Ipv6を無効にすることでこれを解決できました。以下を/etc/modprobe.confに追加して再起動することにより、ipv6を無効にしました。

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

再起動後、/ etc/hostsにリストされているホストのDNSルックアップが表示されなくなります。

なぜこれが問題を解決するのか正確にはわかりません。

4
drsnyder

OS-apiを使用して名前を照会しない多くのアプリケーションがあります。代わりに、明示的なDNSクエリを実行します。

それが起こった場合-彼らはリゾルバーライブラリを経由しません。

Linuxでは、コマンドラインでも同じことができます。

  • Host YOURHOSTはDNSを解決しようとします-何があっても。
  • gethostip YOURHOSTは、定義されたリゾルバー設定を構成された順序で使用します。
2
Nils

あなたのアプリケーションは、独自の名前解決機能の複雑さを持つcurlライブラリを使用しているようです。たとえば、次のように表示します。

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

0
Josip Rodin