DNSのネガティブキャッシュとは、「存在しない」というDNSの応答を一定時間保存する仕組みです。
通常のDNSキャッシュは、
www.example.com の A レコードexample.com の MX レコードのように、存在するレコードの情報を保存します。
一方、ネガティブキャッシュが保存するのは、
といった、否定的な応答です。
つまりDNSには、「ある」という結果だけでなく、「ない」という結果もキャッシュする仕組みがあるということです。
ネガティブキャッシュを理解するうえで、まず押さえたいのが次の2つです。
NXDOMAIN は、問い合わせたドメイン名そのものが存在しないことを表します。
たとえば、no-such-host.example.com という名前自体がゾーン内に存在しない場合、この応答になります。
これはシンプルに言えば、「その名前はない」ということです。
NODATA は厳密には正式なRCODE名ではありませんが、実務ではよく使われる表現です。
意味としては、名前自体は存在するが、問い合わせた種類のレコードがないという状態です。
たとえば、
example.com という名前は存在するこの場合、AAAA を問い合わせると NODATA 相当の応答になります。
つまりこちらは、「その名前はあるが、そのタイプのデータはない」という意味です。
new.example.com を問い合わせた時点では、まだそのレコードが作られていなかったとします。
このとき権威DNSが NXDOMAIN を返すと、その結果がしばらくキャッシュされます。
その後で new.example.com を追加しても、ネガティブキャッシュが残っている間は、一部のリゾルバではまだ「その名前は存在しない」と見えることがあります。
www.example.com には A レコードがあるが、AAAA レコードがまだないとします。
この状態で AAAA を問い合わせると、名前自体は存在するためエラーにはならず、「その型のレコードはない」という否定応答になります。
この結果もキャッシュされるため、あとから AAAA レコードを追加しても、しばらくは IPv6 だけ見えない、ということが起こりえます。
ネガティブキャッシュがない場合、存在しない名前に対する問い合わせがあるたびに、リゾルバは毎回権威DNSへ確認しに行かなければなりません。
たとえば次のようなケースです。
このようなとき、毎回権威DNSまで到達していると無駄が大きくなります。
そこで、「存在しなかった」という結果自体を一定時間覚えておくことで、不要な再問い合わせを減らします。
つまりネガティブキャッシュの役割は、主に次の2つです。
ここは特に誤解が多いポイントです。
ネガティブキャッシュの保持時間は、単純に「SOA に書かれている何かの値」という曖昧なものではありません。
より正確には、権威サーバーが NXDOMAIN や NODATA を返すとき、authority section に SOA レコードを含め、その応答に付く TTL がネガティブキャッシュの基準になります。
実務上は、ネガティブキャッシュTTLは次の考え方で理解すると整理しやすいです。
min(SOA.MINIMUM, SOA自身のTTL)
つまり、
のうち、小さいほうが基準になります。
古い説明では、SOA レコードの最後の値を「ゾーン全体の最低TTL」のように説明しているものがあります。
ただし現在の理解では、この説明はそのままでは不正確です。
整理すると、
$TTL で扱うMINIMUM は、ネガティブ応答TTLに関わる意味として理解するという形で考えるほうが混乱しにくくなります。
そのため、実務では次のように分けて覚えるとわかりやすいです。
NXDOMAIN と NODATA の違いはかなり重要この2つは似て見えますが、意味ははっきり違います。
NXDOMAINNODATAこの違いは、トラブル時の切り分けで非常に重要です。
たとえば、
NXDOMAIN のネガティブキャッシュを疑うNODATA のネガティブキャッシュを疑うという見方ができます。
dig で確認するときの見方dig で確認するとき、NXDOMAIN は比較的わかりやすいです。
status: NXDOMAIN と表示されていれば、名前そのものが存在しないと判断しやすいです。
一方、NODATA は少しわかりにくく、典型的には
status: NOERRORという形で現れます。
ただし、ここで注意が必要です。
NOERROR かつ answer が空だからといって、必ず NODATA とは限りません。
場合によっては referral のこともあるため、authority section に
を見て区別する必要があります。
つまり、dig の見方としては次のように整理するとよいです。
NXDOMAINNOERROR + answer なし + SOA ありNOERROR + answer なし + NS 中心たとえば campaign.example.com を公開前に誰かが確認し、その時点ではまだ未作成だったとします。
すると、その「存在しない」という結果がネガティブキャッシュされます。
その後で正しくレコードを追加しても、キャッシュが残っている間は一部環境でまだ見えないことがあります。
これはDNSの「反映が遅い」と感じる典型例のひとつです。
最初にその種類のレコードが存在しなかったため、NODATA がキャッシュされることがあります。
その後で AAAA や MX を追加しても、その否定応答が残っている間は、まだ未設定のように見えることがあります。
これは半分だけ正しい理解です。
通常レコードの TTL を短くしても、ネガティブキャッシュは別の仕組みで保持されます。
つまり、A レコードや CNAME の TTL だけを見ていても、「存在しなかった」という過去の結果がどのくらい残るかまでは判断できません。
NXDOMAIN と NODATA は同じこれは違います。
NXDOMAIN は名前の不在NODATA はレコード種別の不在です。
同じ「見つからない」に見えても、意味も対処も変わります。
NOERROR で answer が空なら必ず NODATAこれも違います。
referral の可能性があるため、authority section の中身まで見て判断する必要があります。
DNSの反映が遅れているように見えるときは、次の順で考えると整理しやすいです。
NXDOMAIN または NODATA がキャッシュされていないか疑う重要なのは、「今は正しく設定されている」ことと、「利用者から正しく見える」ことは別だという点です。
DNSのネガティブキャッシュとは、「その名前は存在しない」「その種類のレコードは存在しない」という否定応答を一定時間保存する仕組みです。
特に重要なのは次の3点です。
NXDOMAIN と NODATA は別物であるDNS運用で「設定したのに見えない」ときは、設定ミスだけでなく、過去の“存在しなかった”結果がまだ残っている可能性を考えることが大切です。
以上、DNSのネガティブキャッシュについてでした。
最後までお読みいただき、ありがとうございました。