BIND $TTL

DNSのサーバアプリケーションであるBINDを少し勉強中。今までモヤモヤなTTLについて理解した。分かってしまえばスーパー簡単なことだったんだけど。。。

ゾーンデータベースの「$TTL」これが何をしているのか。

よく書いてある解説では、「キャッシュの有効時間」とか言う。自分もこの言葉はしっかりと頭に入っている。しかし、このキャッシュはどこに保存されているかとか、有効時間の長い短いが何に影響してくるのかとか。分からなくていつもモヤモヤしていたのだけど。

キャッシュを保存できるマシンは

  • キャッシュ機能を利用しているDNSサーバ
  • MS Windows

※Linuxをクライアントとして利用している場合、DNSのキャッシュは作成されないので注意。

キャッシュが保存されるタイミングは、問い合わせを行ってDNSサーバから名前とIPアドレスの返信があったとき。そしてその返信パケットの中には、「名前=IPアドレス」だけではなく、「TTL=XXX秒」という情報も送られてくる。この情報を元にキャッシュの有効時間がキャッシュに登録される。登録された名前とIPアドレスはTTLが0になるまで残る。キャッシュが残っている間は、キャッシュが回答してくれるので、上位のDNSへ問い合わせをする必要がなくなり、レスポンスも良くなるし、インターネット・ルートDNSサーバへの負荷を減らしてくれる。

FedoraでBindをインストールしたところTTLのデフォルト値は86400秒であった。ようは1日。このTTLが短すぎると、キャッシュがすぐに消えてしまい問い合せを頻繁に行わなければならなくなるから当然あまり良いことではない。逆に時間が長すぎると、名前は変わらなくてもIPアドレスが変わった場合などに問題が起こる。それはキャッシュにある旧IPアドレスに向けて通信を行おうとしてしまうから。これはキャッシュが消えるのを待つしかない。どこかやたら長いキャッシュ時間で持ってしまったDNSサーバが途中にあるとしたら、通信できない時間はさらに伸びてしまう。

解決するためには、①とりあえず、クライアントはipconfig /flushdnsを行い強制的にキャッシュをクリアする。まあ、ほかのDNSサーバのキャッシュがクリアされない限り意味ないが、切り分けの一歩として。②キャッシュサーバ側はなかなか触れないと思う。が、rndc flushとかやればキャッシュはなくなる。

下が一番重要。DNSの管理者がやるべき内容。

ゾーン管理するDNSサーバ上でIPを変更する2,3日前にTTL値を短く設定しておく。たとえば10分とか。そうするとこのドメインにある公開されたホスト名とIPについては、キャッシュ時間が10分で伝播される。そこでIPを変更する作業を行えば数十分で変更後のホスト名・IPアドレスで登録される。

なぜ2、3日前かは、デフォルトTTLが86400が多いからね。眺めのTTLをすべて消してしまいたいためです。

 

ところで、WIndows上でDNSキャッシュを確認したい場合は「ipconfig /displaydns」、キャッシュをクリアしたい場合は、「ipconfig /flushdns」です。Linux上のDNSサーバのキャッシュを確認したい場合は、「rndc dumpdb」を実行し、named.confに記述したdumpファイルを確認すればよいです。上のほうでも書いてあるけどキャッシュのクリアは「rndc flush」コマンド。