NSサーバ移転に伴うNSレコードおよびそのTTL変更に関して
TwitterID:@inuwarumonoというのは僕のことです。
Twitterにて@ockeghemさんというか、徳丸浩さんとNSサーバ移転について
教えて頂いたり意見させて頂いたり、やりとりをさせて頂きましたが
僕の言いたかった事が正しく伝えられなかったことと、僕が正しく理解できて
いなかったことなどを、ブログの形にまとめます。
まずは経緯、背景から触れて、次に争点を整理し、検討を加えて最後にまとめます。
経緯
きっかけは徳丸さんのこのツイートでした。
ONAMAE.COMのレンタルDNSサーバーではNSレコードは変更できない(01.DNSV.JPなど固定)ので、NSレコードのTTLが5分というのは本当に意味ない、と思います
— 徳丸 浩さん (@ockeghem) 3月 8, 2012
これに対して、NSレコードのTTLが5分というのに意味がない点には完全同意ですが、
僕は徳丸さんの言われた意図を誤認して次のようなお返事をしました。
@ockeghem NSレコードは、自NSと上位NSの両方に設定があります。双方でTTLが異なる事はよくある事で、例えばonamae.comは、*.gtld-servers.net. に聞くと2日、dns1.interq.or.jp.に聞くと1日です。
— 犬さんさん (@inuwarumono) 3月 8, 2012
@ockeghem (続き;以下は推測を含みます)。NSレコードは上位NSが応答したNSレコードがキャッシュされる事が多く、自ゾーンのNSレコードのTTLを変更しても、効果がない場合が多くあります。よって、.comなら2日、.jpなら1日と考えるべき、と思っています。
— 犬さんさん (@inuwarumono) 3月 8, 2012
本当に良く読めよって感じですが、「5分に設定してもすぐ切り替わらないから意味がない」という誤認をしました。
そこで、NSがすぐに切り替わらない理由として、上位NSに設定されたTTLがそこに関わっているという事を説明しようとしました。
その後すぐに
@inuwarumono それは承知しておりますが、自NSのNSレコードがいじれないのは引っ越しの時に困るなぁと思います。その前提での話です
— 徳丸 浩さん (@ockeghem) 3月 8, 2012
というお返事を頂き、旧権威DNSサーバ上のNSレコードの設定変更が出来ない点を言われていた事に気づいて、話は終了かと思われたのですがどうですかね。それだと「浸透問題は不可避の現象」と読めますが… RT @inuwarumono: @ockeghem (続き;以下は推測を含みます)。…自ゾーンのNSレコードのTTLを変更しても、効果がない場合が多くあります。よって、.comなら2日、.jpなら1日と考えるべき…
— 徳丸 浩さん (@ockeghem) 3月 8, 2012
このお返事から、その後のやりとりにつながります。
背景
「DNSの浸透問題」
浸透問題には、いくつか種類があって、JPRS森下さんがInternet Week 2011で
説明された以下のスライドが大変わかりやすいので参照させて頂きます。
http://internet.watch.impress.co.jp/img/iw/docs/494/798/html/s08.jpg.html
いくつかある点のうち
- DNSキャッシュサーバで、古いNSレコードがキャッシュされているため、旧権威サーバにレコードを問い合わせてしまう問題
- 古いNSレコードのTTLが、旧権威サーバの設定不備によってリセットされてしまって、DNSキャッシュサーバ上のキャッシュから消えなくなる問題
このあたりが、後の話に関連します。
NSレコード、NSレコードに指定したDNSサーバ名のAレコードの、2重管理問題
ドメイン: example.jp. のNSサーバが、ns1.example.jp., ns2.example.jp. の2つある場合を例に書きます。
上位NS(a.dns.jp.)には、以下のレコードが登録されています。
example.jp. 86400 IN NS ns1.example.jp. example.jp. 86400 IN NS ns2.example.jp. ns1.example.jp. 86400 IN A 192.168.0.1 ns2.example.jp. 86400 IN A 192.168.0.2
.jpドメインの場合、TTLは1日になっていて、これは変更できません。
対して、ns1.example.jp., ns2.example.jp. では移転に備えて10分にしてみた、という状況だと仮定します。
example.jp. 600 IN NS ns1.example.jp. example.jp. 600 IN NS ns2.example.jp. ns1.example.jp. 600 IN A 192.168.0.1 ns2.example.jp. 600 IN A 192.168.0.2
ここで重要なのは、TTLだけが異なる同じ内容のレコードがある、ということです。
一般のDNSサーバは、どちらのNSレコードをキャッシュするのか?という点が大変問題で
後述のTTLをいくら短くしても〜という事の理由になる部分です。
一般のDNSキャッシュサーバがどちらのNSレコードをキャッシュするかというと
上位NSに記載されているNSレコード、つまり長いTTLのものがキャッシュされている
ケースがあります。
悲しいことに僕は、なぜそうなるかを体系的に説明できず、経験的にそうなっている
ケースを知っているというだけで、僕の主張のとても弱い部分です。
上位NSに聞くと、Authority として応答するし、自NSに聞くと、Answerとして応答する。
キャッシュサーバでどちらが優先されるのか?というあたりの理解に乏しいので
上記についての間違いはご指摘頂けると大変ありがたいです。
さて、長くなりましたがここまでを背景とします。
争点
意見の一致を見れなかった部分は2つあると思います。
浸透問題が不可避という点
浸透問題は複数の問題を内包しているので、どの問題が避けられないと言われていたか、僕は理解できていませんでした。
- DNSキャッシュサーバで、古いNSレコードがキャッシュされているため、旧権威サーバにレコードを問い合わせてしまう問題
この点、僕は不可避だと思います(後述)
これは、設定不備を正せば回避可能で、そこに異論はありません。
http://internet.watch.impress.co.jp/docs/event/iw2011/20111201_494798.html
ここで言われているbindの最新版では、この状況でも問題発生しないように、
キャッシュアルゴリズムが改善されているものと読み取りましたが、具体的な内容はまだ調べていません。
(AUTHORITY SECTIONで返ってくるNSをキャッシュに取り込まない、という実装なんじゃないかと想像)
このあたりが僕の中で整理できたのはこの文章を書き始めてからで、
度重なるメンションで徳丸さんの時間を奪ってしまった事をお詫びします。
TTL短縮で、最終的なNS移転完了を短縮できるか
最終的なNS移転完了というのは、旧権威サーバにクエリが来なくなるまで、です。
旧権威サーバにDNSクエリが届かないようになる、というのは言い換えれば
旧権威サーバに向いたNSレコード(またはそのAレコード)のキャッシュが
世の中のDNSキャッシュサーバから消えるときです。
世の中のDNSキャッシュサーバが、example.jp. のNSレコードをキャッシュするまでのシナリオは以下の通りで
受けた問い合わせに対して、(.からjp.のnsレコードを引いた後に) .jpのNSサーバに、example.jp. の NSレコードを問い合わせる。
その結果は上位NSのTTLを伴って
このように応答されます。
世の中のDNSキャッシュサーバは、権威サーバでなく、上位NSに設定されたNSレコードをキャッシュしている事がある、ということです。
ここで重要なのは、上位NSから委譲を受けているはずの権威サーバの設定にかかわらず、NSレコードがキャッシュされている点です。
つまり、権威サーバ上のNSレコードのTTLをどのように変更しようとも、世の中のDNSキャッシュサーバがそれを
キャッシュしてくれるとは限らないということです。
古いNSレコードをキャッシュしているDNSキャッシュサーバは、example.jp.内のレコード、たとえば www.example.jp. を引く場合
このように、古いNSレコードが残っている限り、example.jp.内のレコードは古いNSサーバに問い合わせる事になります。
検討
旧権威サーバでは、自ゾーンについて、以下のように設定しておく事が推奨されます(浸透問題その2の理由)。
example.jp. 86400 IN NS ns3.example.jp. example.jp. 86400 IN NS ns4.example.jp.
この設定がされた状態で、DNSキャッシュサーバからAレコードを問い合わせるクエリが来た場合
旧権威サーバは、新権威サーバに問い合わせを流すような事をするかというと、これはしないと思います。
また、
;; ANSWER SECTION: www.example.jp. 3600 IN A 192.168.0.100 ;; AUTHORITY SECTION: example.jp. 86400 IN NS ns3.example.jp. example.jp. 86400 IN NS ns4.example.jp. ;; ADDITIONAL SECTION: ns3.example.jp. 3600 IN A 192.168.0.3 ns4.example.jp. 3600 IN A 192.168.0.4
このような応答をDNSキャッシュサーバが受け取った時に、これを受け取ったDNSキャッシュサーバは
NSレコードの更新を行うものでしょうか。
DNSキャッシュサーバが、NSレコードの更新を行う事は十分期待できると思いますが
十分減らす事は可能そうだけれど、上位NSが設定した長いTTLによる影響を、
権威サーバ側で短くすることは出来ない、という主張でした。
まとめ
結局僕が言いたかった点は、浸透問題に対してどうということじゃなく、
権威サーバ側でNSレコードのTTLをいじっても無意味です、ということでした。
× TTLを短くすると、早く新権威サーバへの移行が完了する
○ TTLを短くしておいたほうが、より多くのノードに早く新権威サーバを見せる可能性が高まる
ということで、以上になります。
長くてあまりまとまっていないものを読んで頂き、ありがとうございました。
※togetterに時系列で並べてみました
http://togetter.com/li/269765