DNS にはネガティブキャッシュの仕組みがあり、存在しないドメイン(NXDOMAIN)を問い合わせた時は、そのドメインが存在しないということを一定期間キャッシュしてくれる。
ドメイン追加前にうっかりフライングで新規ドメインを名前解決しようとするとネガティブキャッシュされていまい、ドメイン追加してもキャッシュが expire されるまでは名前解決できなくなってしまう。
一般的な DNS サービスでは、SOA の minimum
値がネガティブキャッシュ期間となる。
Amazon の DNS サービス route 53 はネガティブキャッシュ期間を次のルールで決定している。
The minimum time to live (TTL). This value helps define the length of time that an NXDOMAIN result, which indicates that a domain does not exist, should be cached by a DNS resolver… The duration of negative caching is the lesser of the SOA record’s TTL or the value of the minimum TTL field.
via AWS Documentation ≫ Amazon Route 53 ≫ Developer Guide ≫ What Is Amazon Route 53? ≫ NS and SOA Records that Amazon Route 53 Creates for a Hosted Zone
http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/SOA-NSrecords.html
minimum の設定
AWS Management Console では
Route 53 => Hosted Zones => SOA Record の編集画面にある“TTL(Seconds)” の箇所で設定する。
negative cache の確認
現在の SOA の TTL を確認
$ dig -t soa example.com ; <<>> DiG 9.8.1-P1 <<>> -t soa example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35410 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;example.com. IN SOA ;; ANSWER SECTION: example.com. 900 IN SOA ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 ;; AUTHORITY SECTION: example.com. 172800 IN NS ns-1531.awsdns-63.org. example.com. 172800 IN NS ns-1767.awsdns-28.co.uk. example.com. 172800 IN NS ns-366.awsdns-45.com. example.com. 172800 IN NS ns-578.awsdns-08.net. ;; Query time: 63 msec ;; SERVER: 205.251.193.110#53(205.251.193.110) ;; WHEN: Thu May 22 01:01:39 2014 ;; MSG SIZE rcvd: 226
まず確認すべきは SOA レコード。
example.com. 900 IN SOA ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
- SOA レコードの TTL は 900
- minimum TTL は 86400
となっている。
900 < 86400 なので、NXDOMAIN のネガティブキャッシュ期間は 900 sec となるはず。
登録されていないAレコードを検索
$ dig -t a foo.example.com ; <<>> DiG 9.8.1-P1 <<>> -t a foo.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 24517 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;foo.example.com. IN A ;; AUTHORITY SECTION: example.com. 900 IN SOA ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 ;; Query time: 62 msec ;; SERVER: 205.251.193.110#53(205.251.193.110) ;; WHEN: Thu May 22 01:02:48 2014 ;; MSG SIZE rcvd: 110
存在しない foo.example.com の A レコードを検索。
TTL は 900 となっている。
期待通り。
SOA の TTL を変更
SOA レコードの TTL を route53 デフォルトの 900 から 300 に変えてみる。
$ aws route53 list-resource-record-sets --hosted-zone-id DUMMY { "ResourceRecordSets": [ { ... }, { "ResourceRecords": [ { "Value": "ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400" } ], "Type": "SOA", "Name": "example.com.", "TTL": 300 } ] } $ dig -t a bar.example.com ; <<>> DiG 9.8.1-P1 <<>> -t a bar.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 53567 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;bar.example.com. IN A ;; AUTHORITY SECTION: example.com. 300 IN SOA ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 ;; Query time: 13 msec ;; SERVER: 192.168.11.1#53(192.168.11.1) ;; WHEN: Thu May 22 01:04:23 2014 ;; MSG SIZE rcvd: 110
存在しない bar.example.com の A レコードを検索。
TTL は 900 ではなく 300 となっている。
期待通り。
TTL に大きな値を設定
SOA レコードの TTL を 172800 に変更してみる。
minimum TTL は 86400 なので 86400 < 172800 となり、ネガティブキャッシュの TTL は 86400 となるはずだが、、、
$ aws route53 list-resource-record-sets --hosted-zone-id DUMMY { "ResourceRecordSets": [ { ... }, { "ResourceRecords": [ { "Value": "ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400" } ], "Type": "SOA", "Name": "example.com.", "TTL": 172800 } ] } $ dig -t a baz.example.com ; <<>> DiG 9.8.1-P1 <<>> -t a baz.example.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 5254 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;baz.example.com. IN A ;; AUTHORITY SECTION: example.com. 1200 IN SOA ns-366.awsdns-45.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400 ;; Query time: 277 msec ;; SERVER: 192.168.11.1#53(192.168.11.1) ;; WHEN: Thu May 22 01:09:58 2014 ;; MSG SIZE rcvd: 110
確認すると 1200 となっている。
2006年2月当時のこのへんの情報によると、
最新のDNSキャッシュサーバの実装では、SOAのminimum値がどんなに大きな値でも一定の上限(3600~10800)を超えない範囲の時間を、ネガティブキャッシュの期間として処理しています。
ということだそうなので、 route53 のバックエンドシステムは上限を 1200 にしているのだろう。
references
- rfc : Negative Caching of DNS Queries (DNS NCACHE)
http://tools.ietf.org/html/rfc2308 - DNSのネガティブキャッシュの残存時間(TTL)はどのようにして決まるか
http://d.hatena.ne.jp/hirose31/20130702/1372741570 - wikipedia : negative cache
http://en.wikipedia.org/wiki/Negative_cache