要約

  • NXDOMAIN は名前そのものの不在、NODATA は存在し得る名前に要求型がないことを示す。前者は名前とクラス、後者は名前・型・クラスで記憶する。
  • RFC 2308は権威ある否定にゾーンの SOA を付ける。SOA の TTL とMINIMUMの小さい方が負の TTL となり、キャッシュで経過した分だけ減り、ゼロで再利用を終える。
  • SOA を欠く否定はキャッシュすべきでない。転送ループの各サーバーが短い期限を新しく与えれば、エラー全体は永久に循環できるからだ。
  • DNSSEC は NSEC/NSEC3 による認証済み否定と範囲からの合成を可能にした。署名が保証するのは DNS 上の出所と完全性であり、制度的な正しさや永遠の不在ではない。

失敗した質問ほど繰り返される

正しい応答には保存できるリソースレコードがある。存在しないサービス、入力ミス、検索サフィックスによる候補、未配備の探索名には、それがない。記憶できなければ、同じ失敗が階層を何度も上る。

ただしタイムアウトを不在として保存してはならない。SERVFAILは処理不能であり、名前の不存在ではない。空の Answer は委任を示す場合もある。再利用できる否定には、その名前空間について話せる権威、何を否定したかという範囲、いつまで信頼できるかという期限が必要になる。

1987年の RFC 1034は負応答のキャッシュを任意機能として記述した。権威ある Name Error に TTL を付け、繰り返しを抑えられる。所有者が更新速度とキャッシュ効率の均衡を時間で表すという、DNS 全体の設計に沿うものだった。

しかし、保存した否定を別のリゾルバーへ同じ有用性で渡す仕組みは不十分だった。ローカルな記憶はできても、その記憶が移動するときに同じ年齢を保てなかった。

「名前がない」と「型がない」

NXDOMAIN は Name Error の応答コードで、有効な問い合わせ名が存在しないと述べる。CNAME の連鎖がある場合、否定対象は最初の別名ではなく最後の正規名になり得る。キャッシュキーは名前とクラスである。存在しない名前に別の型を尋ねても結果は変わらない。

NODATA は専用の RCODE ではない。NOERRORのまま要求型の答えがなく、Authority の SOA などから委任ではないと判断する。名前は存在し、MX や TXT を持ちながら A だけを持たないことがある。

したがって NODATA は名前、型、クラスで記憶する。A がないという情報を NXDOMAIN として扱えば、実在する MX まで消してしまう。負キャッシュの精度は、否定の範囲を縮めたまま保存できるかにかかっている。

SOA が「いいえ」の時計になる

1998年3月に公表された RFC 2308は、当時 CSIRO に所属していた Mark Andrews が執筆した。これにより、オーストラリアの公的研究機関が、この DNS 運用規則の文書上の系譜に明確に位置づけられる。IETF は、この契約と後の DNSSEC 改訂を共有仕様にした標準化の場を提供した。両機関の役割は異なる。CSIRO をここで関連づける根拠は、決定的な仕様に記された著者所属であり、IETF のプロセスはその文書をインターネット共通の契約へ変えた。

権威サーバーが NXDOMAIN または NODATA を返すとき、対象を含むゾーンの SOA を Authority に含める。SOA は、どのゾーンが不在を述べたかと、その否定を保持できる時間を伝える。負の TTL は SOA 自身の TTL と SOA MINIMUMの小さい方である。

キャッシュは SOA と否定を一緒に保存する。別のクライアントへ返すとき、保存中に経過した時間を TTL から引く。ゼロになった否定は使わず、改めて問い合わせる。これは永久の判決ではなく、「この範囲について、このゾーンは最近こう答えた」という期限付きの証言である。

MINIMUMは実装の歴史で複数の意味を負っていた。RFC 1035の全般的な下限、ゾーンファイルで省略した TTL の既定値、負応答の寿命である。RFC 2308は一般下限を廃し、既定値には$TTLを導入し、負の TTL への入力という意味を残した。

各ノードの短命が全体の不死をつくる

DNS の名前空間は木でも、問い合わせグラフはループを作れる。二つのサーバーが互いをフォワーダーに設定すればよい。不完全な委任でも同種の循環が起きる。

SOA のない否定を各サーバーがローカルに十分快短く保存しても、次のサーバーが受け取るたびに新しい寿命を与えれば、否定は若返り続ける。短い TTL を守るノードだけで、終わらないエラーが成立する。

RFC 2308が SOA のない負応答をキャッシュしないよう求める理由である。SOA とともに減る TTL なら、管理境界を越えても既に消費した時間を取り戻さない。伝送で保存されない制限は、分散システム全体の制限にならない。

動いていた実装から共通規則へ

RFC 2308の歴史付録は、1987年末の CHIVES を紹介する。検索パスが多くの失敗問い合わせを作り、ARPANET の輻輳期にはそれを避ける価値が大きかった。CHIVES を使う少数の機械で応答時間が改善したという記述であり、全インターネットの測定ではない。

1993年の BIND 4.9.2 ALPHA では、10分間の負 TTL、NXDOMAIN とNOERROR_NODATAの区別、後には SOA の保持が試みられた。標準は突然一人が発明した完成品ではない。クエリーキー、持ち運べる証拠、減算される期限という運用上の学習を共通化した。

不在を速く答えると、出現が遅くなる

負キャッシュはパケットと権威サーバーの負荷を減らし、失敗をすぐ返す。しかし運用者が新しい名前を追加したり、以前なかった型を足したりしても、旧い否定を持つリゾルバーは期限まで「ない」と答える。

否定を受け取った時刻はキャッシュごとに異なり、独自の最大 TTL を設ける実装もある。回復は一斉の瞬間ではなく、異なる年齢を持つキャッシュの分布で進む。RFC 2308は一〜三時間を実用的な既定値とし、一日を超える値を問題視している。

下流の動作も結果を変える。偽の NXDOMAIN ならメールが即座に返送され得る一方、誤ったアドレスならキューに残り、修復を待てる場合がある。一時障害を不存在に変換することは、復旧可能な事故を不可逆な業務判断へ変える。

一つの署名済み否定が範囲を覆う

DNSSEC の NSEC は、存在する名前を正規順序で結び、所有者にある型を示す。RFC 4035の検証規則と組み合わせれば、ある区間に名前がないことや、実在名に型がないことを認証できる。

NSEC はゾーン列挙を容易にする。RFC 5155の NSEC3 は所有者名をハッシュ化し、Opt-Out を導入した。Opt-Out 区間は、その中の未署名委任すべてについて存在・不存在を証明しない。この証拠の穴を確定的な否定へ拡張してはならない。

RFC 8020は、NXDOMAIN のノードより下のサブツリーも存在しないという解釈をキャッシュに適用した。NODATA はカットではない。型を一つ欠く名前にも別型や子孫があり得る。

RFC 8198は、検証済み NSEC/NSEC3 が十分なら、範囲内の別問い合わせへ負応答を合成するよう検証リゾルバーに認めた。権威問い合わせ、遅延、情報漏えいは減る。同時に、範囲内へ追加した名前は負証拠の TTL まで利用できない。

署名が示すのは DNS の信頼鎖における出所と完全性である。正しい鍵で署名された破壊的変更は検証に成功する。だが、それは組織が消えたこと、名前への権利がないこと、否定が制度的に正しいことを証明しない。

出典と証拠の限界

これらは設計、要件、限定された実装史を示す資料であり、普及率の完全な調査ではない。DNSSEC 否定、NXDOMAIN カット、積極的な合成を1987年や1998年の実装へ遡って帰属させない。