Linuxジャパンのスタッフが技術&学習内容などを書いていきます。

Windows nslookupで名前解決できるのにpingで名前解決できない問題の真相

logo (1)

WEBブラウジングをしていると、名前解決に失敗してページが表示されない時間帯がある環境があります。
正確には名前解決に失敗するのではなく、要求を送ったドメイン名に紐づくIPアドレスは存在しないという結果が返ってくることがあります。

この問題の真相については、知らない人が多いと思うので真相への道筋のみ解説します。

表題の現象が起きうる環境は、下の画像のように「優先DNSサーバー」と「代替DNSサーバー」に設定しているDNSサーバーの名前解決できる範囲が異なる場合です。
192.168.1.5はイントラDNSサーバーを、8.8.8.8はISPのDNSサーバーなど外部キャッシュDNSサーバーを想定しています。
win_dns_setting

nslookupはUnix系と同じ仕様のnslookupが起動するので、苦もなくいつでも名前解決できます。
つまり優先DNSサーバー、代替DNSサーバーその1、代替DNSサーバーその2と優先度の高いものから順に要求送っていきます。
※本題と全く関係ありませんが、nslookupでは問い合わせ先DNSサーバーが逆引きできないと名前解決要求を送らずに失敗します。

一方pingやブラウザは、WinsockというWindows独自のAPIを通じて名前解決を行うのでnslookupとは結果が異なります。

WinsockによるDNSリゾルバーの使用についてはマイクロソフトの記事に解説があります。
一言に要約すると、WindowsのDNSリゾルバーは「優先DNSサーバー」と「代替DNSサーバー」のうちのいずれかのDNSサーバーにしか名前解決要求を送らなくなることがよくあります。
これによりイントラのホストの名前解決要求を外部キャッシュDNSサーバーにのみ送り、イントラのホストが見つからないという現象などが起きます。

以下に解決策を3つ示します。
1つ目の根本解決方法。レジストリを編集しDNSリゾルバーの動作をUnix系と同様にする。下記URLが編集方法が記載されているマイクロソフトのナレッジベースへのリンクです。
http://support.microsoft.com/default.aspx?scid=kb;en-us;320760

2つ目の根本解決方法。「優先DNSサーバー」と「代替DNSサーバー」の名前解決できる範囲を同じにする。

3つ目の暫定対応方法。現象が発生したクライアントマシンのコマンドプロンプトにて、「ipconfig /flushdns」を実行し、DNSのキャッシュをクリアする。

以上が真相への道筋です。
ここまでわかれば真相にたどり着けると思います(紹介したマイクロソフトの記事が真相と言っていいでしょう)。
WindowsのDNSリゾルバーの仕様が日本語でも広まることを願って結びます。

コメントは利用できません。

代表者の著書&連載雑誌

ページ上部へ戻る