DNSのネガティブキャッシュの残存時間(TTL)はどのようにして決まるか
結論からいうと、
です。
以下、詳細。
nxdomain応答の際のSOAのTTLは、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になっている
一方で、古いコンテンツサーバーの実装ではレコードのTTLがSOAのminimumより小さい場合はSOAのminimumがTTLとして返されます。
これはDNSベースのフェイルオーバーを使っているときに問題になることがあります。具体的にいうと、フェイルオーバー用のAレコードのTTLは数秒とか短い値を設定していたのに、SOAのminimumがそれ以上の値であったため、想定より長い時間キャッシュが効いてしまっていて切り替わるまでに時間がかかってしまった、というようなケースです。