Skip to content

Chapter8: DNS 3

この章ではルートネームサーバーとリゾルバについて学びます。

Lesson

リゾルバ

今までは手動で名前解決をしていましたが、普段インターネットを利用する際には「リゾルバ」がその役割を担ってくれます。 リゾルバは一般に「フルリゾルバ」と「スタブリゾルバ」の 2つで構成されています。

スタブリゾルバは各デバイスに存在し、フルリゾルバへ向けて「再帰問い合わせ」を投げ、その結果を受け取ります。

フルリゾルバは、スタブリゾルバから再帰問い合わせ(Recursive request)を受けてネームサーバーに反復問い合わせ(Iterative request)をし、ドメイン名を解決します。

反復問い合わせは、複数回の非再帰問い合わせ(Non-recursive request)をすることを指します。

非再帰問い合わせは、ネームサーバーのローカルにある情報だけで応答します。応答結果は次の 5 つのいずれかになります。

  • 完全なドメイン名が存在するとき: ドメイン名の指定レコード
  • そのドメインが別のネームサーバーに移譲されていることがわかっているとき: 移譲先のドメイン名(NS レコードの RDATA)
  • そのドメインにエイリアス(CNAME レコード)が存在するとき: エイリアス元のドメイン名(CNAME レコードの RDATA)
  • ドメイン名が存在しないとき: NXDOMAIN
  • 完全なドメイン名が存在するが、指定レコードが存在しないとき: NODATA

フルリゾルバのアルゴリズムは次のようになります。

  1. キャッシュを確認し、もし存在したらその結果を返す。
  2. ローカルの情報から、問い合わせを投げるのに適切なネームサーバー群を選択する。
  3. 選択したネームサーバー群にそのうちのどれか 1 つが応答を返すまで問い合わせを投げる
  4. 応答結果を分析する
    1. ドメイン名の指定レコードが帰ってきたら、その結果をキャッシュし、スタブリゾルバに返す
    2. NS レコードが帰ってきたら、その結果をキャッシュし、2.に戻る
    3. CNAME レコードが帰ってきたら、その結果をキャッシュし、探索対称のドメイン名を変更したうえで 1.に戻る
    4. それ以外の結果(エラー)が帰ってきた場合、そのネームサーバーを選択したネームサーバー群から除外し、3.に戻る

このようにフルリゾルバとスタブリゾルバを分離することで、キャッシュを共有できるようになり、より効率的に名前解決ができます。

TIP

bind9 にはフルリゾルバの機能もあります

Assignment

1. ルートネームサーバーを設定してみよう

ルートネームサーバーに問い合わるように設定してみよう。

ヒント1

named.conf.default-zonesを見るといいでしょう

ヒント2

bind9 ルートネームサーバー 設定などで調べるといいでしょう

答え

/usr/share/dns/root.hints
追記もしくは書き換える。

.             3600000      NS    NS.ROOT.
NS.ROOT.      3600000      A     {ルートネームサーバーの Global IP}

2. リゾルバを使って名前解決してみよう

1.で立てたフルリゾルバをつかって s1~s3 のサーバーのいずれかから名前解決をしてみて下さい。

ヒント

スタブリゾルバの設定は/etc/resolv.confに書くことができます。

答え

/etc/resolv.conf

nameserver {ルートネームサーバーの Global IP}