DNS の権限移譲とキャッシュの話
訳あって DNS について勉強しなおしていた。
DNS の基礎については、以下の資料がわかりやすい。
- DNS 再⼊⾨ - DNS Summer Days 2013 チュートリアル
その中で一つ疑念が湧いた。あるゾーンのサブドメインを権限移譲するとき、親ゾーンの NS レコードと子ゾーンの NS レコードの記述が違うとどんなことが起きるんだろうか。
つまり、例えばあるドメイン "test.akagi.jp." において、サブドメイン "sub.test.akagi.jp." を別のネームサーバに権限移譲するとき、親ゾーン (移譲元; test.akagi.jp. の権威サーバ) で
sub.test.akagi.jp. IN NS ns2.test.akagi.jp.
と書き、子ゾーン (移譲先; sub.test.akagi.jp. の権威サーバ) で
sub.test.akagi.jp. IN NS ns3.test.akagi.jp.
と書いた場合どうなるか。
素直に考えると、親ゾーンから権限を移譲されるのは ns2 なので、ns3 には当該サブドメインに関するクエリは飛ばないはずである。
しかし、DNS のフルサービスリゾルバにはキャッシュ機能がある。このキャッシュが親と子のどちらの RS (Record Set) を優先するかによって、2回目以降 (キャッシュが使用されるとき) のクエリの結果が変わってくるはずだ。
調査
今回の例では、子ゾーンのネームサーバが権威を持つので、なんとなくそちらが優先されてキャッシュされるような気がする。 調べていると、やはり同じような疑念を抱いている方がいた。
- NS サーバ移転に伴う NS レコードおよびその TTL 変更に関して - inuzの日記
この記事では次のように述べられている。
上位NSに聞くと、Authority として応答するし、自NSに聞くと、Answerとして応答する。
キャッシュサーバでどちらが優先されるのか?
さらに調べていると、以下のような資料を見つけた。
- DNS キャッシュ保持に関する脆弱性 "ghost domain" の研究 - 2012年度 東海大学大学院工学研究科情報理工学専攻 菊池研究室
これによると、キャッシュサーバの動作について、次のように説明されている。
どちらの NS レコードを優先するかは,NS レコードの信頼度 (trustworthiness) によって決まる.DNS のプロトコル仕様を定めた RFC2181 では,子ゾーンの NS レコードを親よりも高い信頼度に設定するように規定されている.
なるほど、優先度と言うものがあるらしい。と言うことで RFC2181 を読んでみると、次のように書かれている。
When considering whether to accept an RRSet in a reply, or retain an RRSet already in its cache instead, a server should consider the relative likely trustworthiness of the various data.
(中略)
Trustworthiness shall be, in order from most to least:
- Data from a primary zone file, other than glue data,
- Data from a zone transfer, other than glue,
- The authoritative data included in the answer section of an authoritative reply.
- Data from the authority section of an authoritative answer,
- Glue from a primary zone, or glue from a zone transfer,
- Data from the answer section of a non-authoritative answer, and non-authoritative data from the answer section of authoritative answers,
- Additional information from an authoritative answer, Data from the authority section of a non-authoritative answer, Additional information from non-authoritative answers.
やはり authoritative answer、つまり子ゾーンの権威サーバによる回答が優先されるようだ。ただし should consider となっているので、実際には実装依存となる。
近いうちに検証してみたい。