MENU
「安心のセキュリティをお得な価格」でご提供!
Fortinet商品など
ENGAGE fotinet

DNSのネガティブキャッシュについて

DNSのネガティブキャッシュとは、「存在しない」というDNSの応答を一定時間保存する仕組みです。

通常のDNSキャッシュは、

  • www.example.com の A レコード
  • example.com の MX レコード

のように、存在するレコードの情報を保存します。

一方、ネガティブキャッシュが保存するのは、

  • そのドメイン名は存在しない
  • その名前は存在するが、問い合わせた種類のレコードは存在しない

といった、否定的な応答です。

つまりDNSには、「ある」という結果だけでなく、「ない」という結果もキャッシュする仕組みがあるということです。

ネガティブキャッシュの主な対象

ネガティブキャッシュを理解するうえで、まず押さえたいのが次の2つです。

NXDOMAIN

NXDOMAIN は、問い合わせたドメイン名そのものが存在しないことを表します。

たとえば、no-such-host.example.com という名前自体がゾーン内に存在しない場合、この応答になります。

これはシンプルに言えば、「その名前はない」ということです。

NODATA

NODATA は厳密には正式なRCODE名ではありませんが、実務ではよく使われる表現です。

意味としては、名前自体は存在するが、問い合わせた種類のレコードがないという状態です。

たとえば、

  • example.com という名前は存在する
  • A レコードはある
  • でも AAAA レコードはない

この場合、AAAA を問い合わせると NODATA 相当の応答になります。

つまりこちらは、「その名前はあるが、そのタイプのデータはない」という意味です。

具体例で見るとわかりやすい

例1: NXDOMAIN の場合

new.example.com を問い合わせた時点では、まだそのレコードが作られていなかったとします。

このとき権威DNSが NXDOMAIN を返すと、その結果がしばらくキャッシュされます。

その後で new.example.com を追加しても、ネガティブキャッシュが残っている間は、一部のリゾルバではまだ「その名前は存在しない」と見えることがあります。

例2: NODATA の場合

www.example.com には A レコードがあるが、AAAA レコードがまだないとします。

この状態で AAAA を問い合わせると、名前自体は存在するためエラーにはならず、「その型のレコードはない」という否定応答になります。

この結果もキャッシュされるため、あとから AAAA レコードを追加しても、しばらくは IPv6 だけ見えない、ということが起こりえます。

なぜネガティブキャッシュが必要なのか

ネガティブキャッシュがない場合、存在しない名前に対する問い合わせがあるたびに、リゾルバは毎回権威DNSへ確認しに行かなければなりません。

たとえば次のようなケースです。

  • 存在しないサブドメインに何度もアクセスされる
  • タイポしたホスト名への問い合わせが繰り返される
  • botが無数のランダムなサブドメインを引く
  • アプリやサーバーの設定ミスで、存在しない名前を何度も問い合わせる

このようなとき、毎回権威DNSまで到達していると無駄が大きくなります。

そこで、「存在しなかった」という結果自体を一定時間覚えておくことで、不要な再問い合わせを減らします。

つまりネガティブキャッシュの役割は、主に次の2つです。

  • DNSサーバーの負荷を下げる
  • 同じ失敗問い合わせを何度も繰り返さないようにする

ネガティブキャッシュのTTLはどう決まるのか

ここは特に誤解が多いポイントです。

ネガティブキャッシュの保持時間は、単純に「SOA に書かれている何かの値」という曖昧なものではありません。

より正確には、権威サーバーが NXDOMAIN や NODATA を返すとき、authority section に SOA レコードを含め、その応答に付く TTL がネガティブキャッシュの基準になります。

実務上は、ネガティブキャッシュTTLは次の考え方で理解すると整理しやすいです。

min(SOA.MINIMUM, SOA自身のTTL)

つまり、

  • SOA の MINIMUM
  • SOA レコード自身の TTL

のうち、小さいほうが基準になります。

SOA の MINIMUM フィールドについて

古い説明では、SOA レコードの最後の値を「ゾーン全体の最低TTL」のように説明しているものがあります。

ただし現在の理解では、この説明はそのままでは不正確です。

整理すると、

  • 通常レコードのデフォルトTTLは $TTL で扱う
  • SOA の MINIMUM は、ネガティブ応答TTLに関わる意味として理解する

という形で考えるほうが混乱しにくくなります。

そのため、実務では次のように分けて覚えるとわかりやすいです。

  • 通常のレコードのキャッシュTTL → 各レコードに設定されたTTL
  • 否定応答のキャッシュTTL → 返却された SOA に基づくTTL

NXDOMAINNODATA の違いはかなり重要

この2つは似て見えますが、意味ははっきり違います。

  • NXDOMAIN
    名前そのものが存在しない
  • NODATA
    名前は存在するが、その種類のレコードがない

この違いは、トラブル時の切り分けで非常に重要です。

たとえば、

  • 新しいサブドメインを作ったのに見えない
    NXDOMAIN のネガティブキャッシュを疑う
  • AAAA や MX を追加したのに見えない
    NODATA のネガティブキャッシュを疑う

という見方ができます。

dig で確認するときの見方

dig で確認するとき、NXDOMAIN は比較的わかりやすいです。

status: NXDOMAIN と表示されていれば、名前そのものが存在しないと判断しやすいです。

一方、NODATA は少しわかりにくく、典型的には

  • status: NOERROR
  • でも answer section に目的のレコードがない

という形で現れます。

ただし、ここで注意が必要です。

NOERROR かつ answer が空だからといって、必ず NODATA とは限りません。

場合によっては referral のこともあるため、authority section に

  • SOA があるのか
  • NS が返っているのか

を見て区別する必要があります。

つまり、dig の見方としては次のように整理するとよいです。

  • NXDOMAIN
    → 名前がない
  • NOERROR + answer なし + SOA あり
    → NODATA の可能性が高い
  • NOERROR + answer なし + NS 中心
    → referral の可能性がある

実務で起こりやすいケース

新しいサブドメインを追加したのに見えない

たとえば campaign.example.com を公開前に誰かが確認し、その時点ではまだ未作成だったとします。

すると、その「存在しない」という結果がネガティブキャッシュされます。

その後で正しくレコードを追加しても、キャッシュが残っている間は一部環境でまだ見えないことがあります。

これはDNSの「反映が遅い」と感じる典型例のひとつです。

AAAA や MX を後から追加したのに反映しない

最初にその種類のレコードが存在しなかったため、NODATA がキャッシュされることがあります。

その後で AAAA や MX を追加しても、その否定応答が残っている間は、まだ未設定のように見えることがあります。

よくある誤解

誤解1: TTLを短くすれば何でもすぐ反映する

これは半分だけ正しい理解です。

通常レコードの TTL を短くしても、ネガティブキャッシュは別の仕組みで保持されます。

つまり、A レコードや CNAME の TTL だけを見ていても、「存在しなかった」という過去の結果がどのくらい残るかまでは判断できません。

誤解2: NXDOMAINNODATA は同じ

これは違います。

  • NXDOMAIN は名前の不在
  • NODATA はレコード種別の不在

です。

同じ「見つからない」に見えても、意味も対処も変わります。

誤解3: NOERROR で answer が空なら必ず NODATA

これも違います。

referral の可能性があるため、authority section の中身まで見て判断する必要があります。

実務での基本的な切り分け方

DNSの反映が遅れているように見えるときは、次の順で考えると整理しやすいです。

  1. まず権威DNSでは正しく設定されているか確認する
  2. 過去の NXDOMAIN または NODATA がキャッシュされていないか疑う
  3. 名前がないのか、型がないのかを切り分ける
  4. 公開DNS、ISP DNS、社内DNS、OS、ブラウザなど、どの層にキャッシュが残っているかを見る

重要なのは、「今は正しく設定されている」ことと、「利用者から正しく見える」ことは別だという点です。

まとめ

DNSのネガティブキャッシュとは、「その名前は存在しない」「その種類のレコードは存在しない」という否定応答を一定時間保存する仕組みです。

特に重要なのは次の3点です。

  • NXDOMAINNODATA は別物である
  • ネガティブキャッシュTTLは SOA に基づいて決まる
  • 新規追加やレコード種別追加の直後に「まだ見えない」原因になりやすい

DNS運用で「設定したのに見えない」ときは、設定ミスだけでなく、過去の“存在しなかった”結果がまだ残っている可能性を考えることが大切です。

以上、DNSのネガティブキャッシュについてでした。

最後までお読みいただき、ありがとうございました。

カテゴリ一覧

ページトップへ