DNSのネガティブキャッシュの残存時間(TTL)はどのようにして決まるか

結論からいうと、

  • 問い合わせた名前が見つからなかった場合のnxdomain応答は当該ドメインSOAレコードが返ってきて、ネガティブキャッシュのTTLはその応答(SOA)のTTLになる

です。


以下、詳細。

nxdomain応答の際のSOATTLは、SOAの(TTLではなく)minimumで指定できることになっています。

SOAのminimumは通常のキャッシュのTTLでは?」と思ったあなた、私もそう覚えてたのですが、1998年に出たRFC 2308 Negative Caching of DNS Queries (DNS NCACHE)で用途が変更されたそうです。

SOAのminimum値の役割


SOAのminimum値は、当初はDNSキャッシュサーバが一度検索したレコードをキャッシュに保持(通常のキャッシュ)しておく期間(単位は秒)として使用されていましたが、RFC 2308で役割が変更され、現在はドメイン名が存在しなかったという情報を保持(ネガティブキャッシュ)する期間(同じく単位は秒)として使用
されています。

http://jprs.jp/tech/dnsuis/info001.html


BIND等の新しめの実装では、SOAがリクエストされた際の応答にはSOAそのもののTTLを返し、nxdomainの際の応答にはSOAそのもののTTLではなくSOAのminimumをTTLとして返すようになっているようです。

$ dig version.bind chaos txt @SFBA.SNS-PB.ISC.ORG
;; ANSWER SECTION:
version.bind.           0       CH      TXT     "9.9.3-S1"

$ dig -t soa isc.org @SFBA.SNS-PB.ISC.ORG
;; ANSWER SECTION:
isc.org.                7200    IN      SOA     ns-int.isc.org. hostmaster.isc.org. 2013070200 7200 3600 24796800 3600
★SOAのTTLは7200、minimumは3600

$ dig -t a blahblahblah.isc.org @SFBA.SNS-PB.ISC.ORG
;; AUTHORITY SECTION:
isc.org.                3600    IN      SOA     ns-int.isc.org. hostmaster.isc.org. 2013070200 7200 3600 24796800 3600
★AUTHORITY SECTIONでSOAの情報が返ってくるが、TTLは(SOAのTTLの)7200ではなくて(SOAのminimumの)3600になっている


一方で、古いコンテンツサーバーの実装ではレコードのTTLSOAのminimumより小さい場合はSOAのminimumがTTLとして返されます。

これはDNSベースのフェイルオーバーを使っているときに問題になることがあります。具体的にいうと、フェイルオーバー用のAレコードのTTLは数秒とか短い値を設定していたのに、SOAのminimumがそれ以上の値であったため、想定より長い時間キャッシュが効いてしまっていて切り替わるまでに時間がかかってしまった、というようなケースです。