名前解決の優先順位について調べてみた

こんにちは。最近パスタ作りにはまっている浅見です。
サーバも料理も「基本」が大事。オイル系パスタは「乳化」を意識して調理することで、格段においしいものが作れるようになりますよ。
ということで本題ですが、先日resolv.confとサーバホスト名の組み合わせで嵌ったことがありました。
名前解決の優先順位の問題だったのですが、意外と知らないことが多かったのでまとめてみます。

名前解決順の調べ方

今回は、名前解決の挙動をpingとtcpdumpコマンドを使って調べてみようと思います。調査に利用したOSは「CentOS Linux release 7.5.1804 (Core)」です。
ターミナルを2つ開いて、片方でwww2に対してpingを打ちます。

# ping www2
ping: www2: Name or service not known

そんなドメインは存在しないと言われますが気にしないでおきましょう。
もう一方のターミナルで、53番ポートあての通信に対してtcpdumpを取得します。ここに出力されるドメインを見ることで名前解決の挙動を確認しました。

# tcpdump -n -vv dst port 53
09:36:42.231676 IP (tos 0x0, ttl 64, id 21661, offset 0, flags [DF], proto UDP (17), length 62)
10.0.30.178.34110 > 10.0.0.2.domain: [bad udp cksum 0x32ef -> 0x2d60!] 20085+ A? www2.denet.co.jp. (34)
09:36:42.232305 IP (tos 0x0, ttl 64, id 21662, offset 0, flags [DF], proto UDP (17), length 62)
10.0.30.178.39466 > 10.0.0.2.domain: [bad udp cksum 0x32ef -> 0x5fbe!] 2358+ A? www2.denet.ad.jp. (34)
09:36:42.232829 IP (tos 0x0, ttl 64, id 21663, offset 0, flags [DF], proto UDP (17), length 50)
10.0.30.178.52032 > 10.0.0.2.domain: [bad udp cksum 0x32e3 -> 0x0825!] 19058+ A? www2. (22)

上の例では、www2.denet.co.jp、www2.denet.ad.jp、www2と名前解決していき、名前解決できなかったので「www2: Name or service not known」となっています。

名前解決順を調べてみた結果

名前解決の優先順位は

  • resolv.confのsearch
  • rsolv.confのdomain
  • ホスト名
     
    の組み合わせで決まっています。
    名前解決の順番を調べた結果は次の通りです。

    resolv.confのsearch

    resolv.confのsearchでは、所属ドメインを複数記載することができます。
    名前解決のさいに、ここに記載したドメインを自動補完してくれます。何が良いかというと、wwwなど短いドメインで名前解決が可能になります。
    複数記載する場合は半角スペースで区切り列挙します。記載順が優先順位となり、最大6個まで設定が可能です。
    resolv.confに

    search denet.co.jp denet.ad.jp
    

    と記載した場合に、ping www2を実行したところ、次の順番で名前解決していました。

    1. www2.denet.co.jp
    2. www2.denet.ad.jp
    3. www2
      wwwなど存在するドメインの場合は、先頭に記載したwww.denet.co.jpの名前解決が行われます。

      resolv.confのdomain

      resolv.confのdomainでは、所属ドメインを記載することができます。
      resolv.confに

      domain denet.jp
      

      と記載した場合に、ping www2を実行したところ次の順番で名前解決していました。

    4. www2.denet.jp
    5. www2

      resolv.confのsearchとdomain

      searchとdomainを両方記載した場合はsearchのみ有効になります。
      resolv.confに

      domain denet.jp
      search denet.co.jp denet.ad.jp

      と記載した場合に、ping www2を実行したところ次の順番で名前解決していました。

    6. www2.denet.co.jp
    7. www2.denet.ad.jp
    8. www2
      domain部分の名前解決は行われていないことがわかります。

      ホスト名

      resolv.confのsearchとdomainを記載していない場合、ホスト名が利用されます。
      ホスト名に

      www.denet.co.jp
      

      という名前を利用していた場合は、denet.co.jpを所属ドメインとして名前解決してくれます。
      ping www2を実行したところ次の順番で名前解決していました。

    9. www2.denet.co.jp
    10. www2
      ホスト名に

      denet.co.jp
      

      という名前を指定している場合は次のようになります。

    11. www2.co.jp
    12. www2

      まとめ

      今回嵌ったのは、searchとdomainを記載しておらず、ホスト名にxxx.comと記載していたパターンで、localhostで名前解決するとlocalhost.comの結果が返ってきました。
      原因は、/etc/hostsファイルのlocalhostの部分をlocalhstと誤記載していたことだったのですが、.comの情報がどこで付与されているのか良くわからなかったので今回調べてみました。
      普段あまり意識することがない部分ですが、基本的なことをしっかりと抑えているかどうかでトラブルシュートの対応速度が大きく変わっていきます。
      基本をしっかりと抑えることを習慣づけていきましょう。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA