読者です 読者をやめる 読者になる 読者になる

DNS の権限移譲とキャッシュの話

訳あって DNS について勉強しなおしていた。

DNS の基礎については、以下の資料がわかりやすい。

その中で一つ疑念が湧いた。あるゾーンのサブドメインを権限移譲するとき、親ゾーンの 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に聞くと、Authority として応答するし、自NSに聞くと、Answerとして応答する。

キャッシュサーバでどちらが優先されるのか?

さらに調べていると、以下のような資料を見つけた。

これによると、キャッシュサーバの動作について、次のように説明されている。

どちらの 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 となっているので、実際には実装依存となる。

近いうちに検証してみたい。