DNSの負のキャッシュ:NXDOMAIN・NODATAとSOA TTL
NXDOMAINは名前自体がない応答、NODATAは指定した型のデータがその名前にない応答です。両者ではキャッシュキーとSOAによる期限が異なります。SERVFAILなどの解決失敗とも分け、RFCとBIND 9.20.2の資料から確認点を整理します。
発行・訂正窓口:infostoa · 編集基準
この記事の個別の執筆者・専門査読者の情報は提供されていません。
要求したレコードが返らないDNS応答も、意味は一つではありません。NXDOMAINは問い合わせ名が存在しない応答、NODATAはその名前に要求した型のデータがない応答です。RFC 2308は両者のキャッシュキーとSOAによる期限を分けています。応答コード、QNAME・QTYPE、authority欄のSOA、残りTTLを合わせて確認します。
NXDOMAINとNODATAは異なる内容を示す
NXDOMAINは名前エラーのRCODEで、問い合わせ名が存在しないことを示します。NODATAは別の名前エラーコードではなく、通常はNOERRORでもanswer欄に要求型のレコードがない応答から判定します。同じ名前に別型があっても、問い合わせたAレコードがない場合があります。「名前がない」と「その名前に要求型のデータがない」を区別してください。
RFC 2308ではNXDOMAINを同じ名前とクラス(QNAME、QCLASS)でキャッシュし、NODATAは名前・型・クラス(QNAME、QTYPE、QCLASS)で記録します。A問い合わせのNODATAがMXやAAAAの答えになるわけではありません。再現調査では名前と問い合わせ型の両方を残します。
SOAが負の応答の期限を伝える
負の応答にはanswer欄にTTLを付けるレコードがないため、権威サーバーは通常zoneのSOAをauthority欄に含めます。RFC 2308ではSOAレコード自身のTTLとSOA.MINIMUMの小さい方をそのTTLにします。キャッシュ中に値は減り、0になった応答は再利用できません。SOA.MINIMUMがzone内の全レコードのTTLという意味ではありません。
SOAがなければ標準的な負のキャッシュ経路と異なる可能性があります。RFC 2308は転送ループを防ぐ期限情報がないため、SOAなしの負の応答をキャッシュしないよう推奨しています。RCODEだけでなくSOAのzone、TTL、MINIMUM、返された残りTTLを確認します。
レコード追加後も古い答えが残る理由
権威DNSにレコードを追加しても、再帰リゾルバーが以前のNXDOMAINやNODATAを保存していればTTLが切れるまで残る場合があります。NXDOMAINは名前単位で、NODATAは問い合わせ型も含めて記憶されます。端末のstub、再帰サービス、アプリケーションにも別々のキャッシュがあり得ます。
読み取り中心の確認では、権威応答とSOA・TTL、再帰応答のRCODEと残りTTL、クライアントが送った名前・型を照合します。古い値だけを見てzoneを再変更したりTTLを下げたりせず、どの層が応答を保持するかを特定します。ここでは本番キャッシュの消去や設定変更を指示しません。
SERVFAILやタイムアウトは名前の不存在ではない
RFC 9520はNXDOMAINとNOERROR/NODATAを解決失敗と区別します。SERVFAIL、REFUSED、タイムアウト、到達不能などでは利用可能なサーバーから有用な答えを得られないことがあります。リゾルバーは解決失敗の別キャッシュを実装し、RFC 9520は最低1秒・最長5分とし、失敗が続けばbackoffを推奨します。
SERVFAILを「名前がない」応答として扱わないでください。権威サーバーの問題、DNSSEC検証、ネットワーク到達性など原因は異なり得ます。応答コード、再試行、上流サーバーを名前・型とともに記録します。
BIND 9.20.2は版固有の方針として読む
ISCのBIND 9.20.2資料ではmin-ncache-ttlの既定値は0秒で、90秒を超える値は90秒に切り詰められます。この版のmax-ncache-ttlは既定10,800秒(3時間)、上限7日です。SOAの期限とリゾルバーのローカル保存上限の両方が関わる例です。他のBIND版やDNS実装に一般化しないでください。
同じ版のservfail-ttlはDNSSEC検証失敗または一般サーバー失敗のキャッシュで、既定1秒、最大30秒、0で無効です。これはRFC 9520の失敗キャッシュ一般の5分上限とは別の製品範囲です。文書上の既定値から実サーバーの設定は分かりません。
専門家の視点:標準期限と実装方針を分ける
RFC 2308はSOAに基づく負の応答の期限、RFC 9520は答えを得られない解決失敗のキャッシュを扱います。BIND 9.20.2資料はその版の保存時間の制限を示します。階層を分けて読めば、SOA値、リゾルバー方針、サーバー障害を一つの「DNS TTL問題」にまとめず、古い応答がどこで生じたかを調べられます。
出典
- Mark Andrews, RFC 2308: Negative Caching of DNS Queries(1998年3月)
- D. Wessels、W. Carroll、M. Thomas, RFC 9520(2023年12月)
- ISC, BIND 9 v9.20.2 Configuration Reference
架空のDNS応答を読む
以下はCNAMEや委任のないexample.ゾーンを仮定した独自の省略例です。実際のdig実行や運用ネットワークの測定ではありません。説明用の名前・アドレスを使い、status、ANSWERとSOAを比較します。
A. QUESTION: missing.example. IN A
status: NXDOMAIN; ANSWER: 0
AUTHORITY: example. 300 IN SOA ns.example. hostmaster.example.
2026093001 3600 600 86400 300
B. QUESTION: www.example. IN AAAA
status: NOERROR; ANSWER: 0
AUTHORITY: example. 300 IN SOA ns.example. hostmaster.example.
2026093001 3600 600 86400 300
C. QUESTION: www.example. IN A
status: NOERROR; ANSWER: 1
ANSWER: www.example. 600 IN A 192.0.2.10
応答の意味とキャッシュキー
AのNXDOMAINは質問した名前が存在しないという応答です。基本的な負のキャッシュキーは名前とクラスです。Bは名前は存在するが要求したAAAAデータがないNODATAの例です。NODATAは独立したRCODEではなく、NOERRORと応答内容から判断します。キーには要求したタイプも含まれるため、BだけでAレコードもないとは判断できません。Cは同じwww.example.にAレコードがある別の架空応答です。
300秒の根拠
ゾーンの元のSOA TTLを900秒、SOA MINIMUMを300秒と仮定します。RFC 2308の基本規則ではmin(900, 300) = 300秒です。負の応答A・Bに含まれるSOA TTLはすでに300秒に短縮されています。SOAのrefresh、retry、expireと取り違えないでください。受信から120秒後の架空キャッシュ応答では残りのSOA TTLは180秒です。実際のリゾルバーの制限・方針や追加仕様で挙動は変わり、この数値は運用上の保証ではありません。
変更後の比較手順
- 権威サーバーと再帰リゾルバーの応答を区別します。
- 名前・タイプ・クラスをそろえて比較します。
- statusだけでなくanswerとauthorityのSOAも確認します。NOERRORの空の答えだけで、委任やCNAMEを無視してNODATAと断定しません。
- 残りTTLが減るかを調べます。新規レコードを作っても保存済みの負の応答が直ちに消えるとは限りません。
出典:RFC 2308 §2.2、§3、§5、§6:NODATAの判読、SOA TTL計算、キャッシュキー、残りTTL。フィールドと数値は独自の架空例で、外部の運用ログのコピーではありません。