コンテンツにスキップ

DNS の3つの役割

ブラウザが example.com へ接続するには、その名前に対応する IP アドレスを調べる必要があります。この名前解決は、1台のサーバーだけで完結するとは限りません。通常は、役割の異なるスタブリゾルバー、フルリゾルバー、権威 DNS サーバーの3者が分担します1。

以降の章では「誰が何をするか」を区別して説明します。ここでは、その前提となる3者の役割と用語を整理します。

スタブリゾルバー(問い合わせる側)

Section titled “スタブリゾルバー(問い合わせる側)”

スタブリゾルバー(stub resolver)は、OS に組み込まれた小さな部品です。アプリケーションから「この名前の IP アドレスを教えてほしい」と頼まれると、その依頼を設定済みの問い合わせ先へ送り、返ってきた答えをアプリケーションへ渡します。

スタブリゾルバーは名前解決を自分では行いません。ルート DNS サーバーがどこにあるかも、目的のドメイン名を誰が管理しているかも知らず、階層をたどる処理は持っていません。持っているのは、問い合わせ先のアドレス(/etc/resolv.conf に書かれた nameserver など)だけです。

フルリゾルバー(名前解決する側)

Section titled “フルリゾルバー(名前解決する側)”

フルリゾルバー(recursive resolver / 再帰リゾルバー)は、スタブリゾルバーから名前解決要求を受け取り、答えが得られるまで権威 DNS サーバーへ問い合わせる役です。Unbound はこの役割を担うソフトウェアです。

フルリゾルバーは、最初から答えを持っているわけではありません。複数の権威 DNS サーバーに順に問い合わせ、返ってきた情報を頼りに次の問い合わせ先を決めます。一度得た情報はキャッシュに保存し、次に同じ名前を聞かれたときはそこから回答します。「キャッシュ DNS サーバー」とも呼ばれるのはこのためです。

スタブリゾルバーから見ると、フルリゾルバーは「頼めば最終的な答えを返してくれる相手」です。しかし、その裏で何回問い合わせが起きたかは、スタブリゾルバーには見えません。

権威 DNS サーバー(答えを持つ側)

Section titled “権威 DNS サーバー(答えを持つ側)”

権威 DNS サーバー(authoritative DNS server)は、自分が管理する範囲の情報を、ほかのサーバーへ問い合わせずに回答するサーバーです。example.com の権威 DNS サーバーは example.com の情報には答えますが、example.net の情報には答えません。

担当範囲の外について聞かれたとき、権威 DNS サーバーはエラーを返すとは限りません。担当範囲の一部を別の権威 DNS サーバーに任せていて、聞かれた名前がその先にある場合は、「その先はこちらの権威 DNS サーバーに問い合わせてください」という応答を返します。これを委任応答(referral)と呼びます。委任応答は最終的な答えではなく、次に問い合わせる先の案内です。担当範囲の区切り方は階層・委任・ゾーンで扱います。

フルリゾルバーが複数の権威 DNS サーバーに順番に問い合わせるのは、この委任応答をたどるためです。実際の経路は名前解決とキャッシュで扱います。

名前解決の依頼は、次の向きに流れます。

  • アプリケーション ➡ スタブリゾルバー: 名前に対応する IP アドレスを頼む
  • スタブリゾルバー ➡ フルリゾルバー: 名前解決要求を1回送る
  • フルリゾルバー ➡ 権威 DNS サーバー: 答えが得られるまで複数回問い合わせる

戻りはこの逆です。権威 DNS サーバーからの応答はフルリゾルバーが受け取り、フルリゾルバーが組み立てた最終的な答えだけがスタブリゾルバーへ返ります。スタブリゾルバーが自分でルート DNS サーバーをたどることはありません。

図1.1 スタブリゾルバー、フルリゾルバー、権威 DNS サーバーの関係と問い合わせの向き
図1.1 スタブリゾルバー、フルリゾルバー、権威 DNS サーバーの関係と問い合わせの向き

再帰的問い合わせと反復的名前解決

Section titled “再帰的問い合わせと反復的名前解決”

フルリゾルバーは「再帰リゾルバー」とも呼ばれますが、フルリゾルバー自身が権威 DNS サーバーへ送る問い合わせは再帰的問い合わせではありません。

再帰的問い合わせとは、DNS メッセージの RD(Recursion Desired)ビットを1にした問い合わせです2。スタブリゾルバーがフルリゾルバーへ送る問い合わせがこれにあたり、「最終的な答えまで解決してほしい」という要求を表します。RD が0の問い合わせは非再帰的問い合わせと呼びます。

一方、フルリゾルバーは、ルート DNS サーバーから委任応答をたどりながら、権威 DNS サーバーへ順番に問い合わせます。この処理を反復的名前解決(iterative resolution)と呼びます。フルリゾルバーが権威 DNS サーバーへ送る問い合わせでは、通常 RD を立てません3。

つまり、スタブリゾルバーからフルリゾルバーへの問い合わせは再帰的問い合わせであり、フルリゾルバーがその要求に応えるために行う処理は反復的名前解決です。本書では、この2つを区別して書きます。

  1. RFC 9499 の 6. DNS Servers and Clients ↩

  2. RFC 9499 の 6. DNS Servers and Clients の Recursive query の項と、RFC 1034 の 4.3.1. Queries and responses ↩

  3. RFC 9499 の 6. DNS Servers and Clients の Iterative resolution の項 ↩