フルスタックエンジニアを目指して

いろいろやってみるブログ

どうしてDNSのヒントファイルを更新しなければならないのか

少し前のことになりますが、2015年12月1日にh.root-servers.net(H-Root)のIPv4/IPv6アドレスが変更されました。DNSが持っているヒントファイルを更新しなければならなくなったわけですが、なぜ更新しなければいけないか、結局理解できていなかったので調べてみました。

ヒントファイル

DNSが持っているヒントファイル(named.root)をご存知でしょうか。ルートDNS13台の名前とIPが紐づけられているあのファイルです。DNSは、最上位のルートサーバから順に名前を聞いてまわる仕組み上、ルートサーバの情報だけはDNS自身が持ち合わせておかないと問い合わせをすることすらできません。だから、DNSサーバは世界に13あるルートDNSの情報をヒントファイル内に持ち合わせています。

named.root

https://www.internic.net/domain/named.root

 

ヒントファイルを持たないDNSがいる

権威DNSサーバの中には、あえてヒントファイルを持たないDNSサーバがいるそうです。権威DNSであれば、自分の管理するゾーン情報のみに責任を持てばよく、権威DNSサーバ自身が再帰問い合わせをする必要はありません。だから、ヒントファイルを持っている必要がないのです。ヒントファイルの改竄など、セキュリティリスクを低減する意味であえてヒントファイルを持たせないという選択があるそうです。

逆に、キャッシュDNSサーバでは、必ずヒントファイルを持たなければいけません。名前解決要求を受け取り、ルートDNSから再帰的に問い合わせを行うことがキャッシュDNSの役目なので、ルートの存在を知らなければ再帰問い合わせができません。

 

ヒントファイルが必要なのは初回だけ?

DNSは問い合わせた情報をある程度の期間(設定によって異なる)保持するようになっています。であれば、ヒントファイル内の1つルートDNSのIPが変更になったからといって、他の12台のサーバのアドレスは正しいものを保持し続けているわけなので、名前解決の動作的には問題ないのでは?という思いが生まれてきます。

 

ライミング

上記の仕組みをプライミングというそうです。キャッシュDNSは初回問い合わせ時のみ、ヒントファイルから情報を読み込み、いずれかのルートDNSに対して再帰問い合わせを実施します。その際に、最新のルートDNS情報をGETし、その情報をキャッシュとして保持します。だから、もしヒントファイルの内容が古く、一部古いIPアドレス情報がのっていたとしても、プライミングした結果、最新の情報にすべて変更されるので、特に問題なく名前解決が可能となるのです。

 

やっぱりヒントファイル更新しなくても大丈夫?

ライミングの処理により、最新の情報を保持できるのであれば、1つのルートDNSサーバのIPが変わったくらいでヒントファイルの更新をしなくてもよいのではと思ってしまいます。

しかし、ヒントファイルはやはり更新しておいたほうが良いみたいです。

このサイトでは、ヒントファイルの動きについて様々検証しています。その結果、以下のことが判明したと記載されています。

1. hintファイルを読み込ませなくても起動するし、名前解決もできる。
named.confで .(ルート)のzoneをコメントアウトしてnamedを再起動し、ルートのゾーン情報を読み込ませないようにした。
その直後に、 dig @localhost www.yahoo.co.jp を実行したところ、名前解決ができた。
tcpdumpでキャプチャしても、いきなりルートサーバに問い合わせをしている。
ということは、内部的にあらかじめルートサーバの情報が埋め込まれているのかもしれない・・・

2. hintファイルを読み込ませても、その内容はキャッシュしない。 よって回答として返さない。
namedを再起動した直後に、dig @localhost . ns +norecを実行。
しかし、回答がない。
rndc dumpdbをしてもキャッシュをしていない。

3. 最初にルートサーバに問い合わせたときに、回答されたルート情報をキャッシュする。
2の後で、dig @localhost www.yahoo.co.jp を実行。
その後で、dig @localhost . ns +norec を実行したところ、ルートサーバの情報を返した。
rndc dumpdb をしたらキャッシュをしていた。
また、DルートサーバのAレコードを確認したところ、hintファイルにある古い方ではなく、新しい方のIPv4アドレスをキャッシュしていた。

4. hintファイルの中身を1つのルートサーバだけにすると、必ず最初はそこに問い合わせる。
 a.root-servers.netの行だけにしたhintファイルを読み込ませたところ、再起動後に最初に問い合わせに行くのは必ずa.root-servers.netだった。

5. 誤ったhintファイルを読み込ませると、指定したほうに問い合わせた。
 4において、a.root-servers.netのアドレスを存在しないものに書き換えたところ、そちらに問い合わせに行って名前解決に失敗した。(SERVFAIL)
また、アドレスを宅内のルータにしたところ、ほいほいとそちらに問い合わせに行って名前解決に成功した。

6. 中身を空にしたhintファイルを読み込ませたところ、名前解決に失敗した。
 namedを再起動してもエラーは出なかった。 
 しかし、問い合わせを行ったところ、どこにも問い合わせをすることなくすぐに名前解決に失敗した。(SERVFAIL)
 ただし、そのDNSサーバが管理しているドメインの問い合わせは回答を返した。

 

hintファイル ルートヒントファイル 変更 更新 DNS BIND

5などが顕著かと思われますが、ヒントファイルに誤った情報が記載されたままで放置してしまうと、セキュリティリスクを高めることにつながります。名前解決しに来たホストに対して、悪意のある情報を返すことも容易にできてしまうわけです。また、6にあるように、ヒントファイルがからであれば、名前解決に失敗することもわかっているので、ヒントファイルを誤ったままにしておくことは、DNSサービスの停止に追い込む可能性をもはらんでしまうのです。

 

まとめ

今回は、ヒントファイルの更新が必要かどうか調べてみました。

結論から言うと「必要」です。

理由は以下の通り。

  • ヒントファイルが誤った情報を持っていることでセキュリティリスクを高める
  • ヒントファイルが機能しなくなることで、DNSサービスが停止する可能性がある

ただし、例外もあります。

  • キャッシュDNS機能をもたない権威DNSにおいてはヒントファイル自体を持たなくても問題ない。
  • フォワーダー先を指定しているDNSの場合、自身は直接ルートDNSに問い合わせせず、フォワーダー先のDNS再帰問い合わせを実施するので、ヒントファイルを更新しなくても問題ない。

以上のことから、早々に変更する必要はありませんが、少なくともh.root-servers.net(H-Root)の旧IPアドレスが使用できなくなる2016年6月1日までには、すべてのキャッシュDNSサーバのヒントファイルを更新することが推奨されます。

そもそも、ログを覗いたときにエラーを吐き続けられるとつらいですよね。きちんとヒントファイルの更新を行いましょう。

 

参考サイト

h.root-servers.net(H-Root)のIPアドレス変更に伴う設定変更について

hintファイル ルートヒントファイル 変更 更新 DNS BIND

DNS - DNS hintファイルの意味(29363)|teratail