私の研究室には、bind9 を実行しているネーム サーバーが 2 つあります。ServerA
には「example.com」のゾーン ファイルがあり、
ServerB には「example.com」のサブゾーンである「sub.example.com」のゾーン ファイルがあります。ServerA
のゾーン ファイルには、サブゾーンに関する 2 つの NS レコードと、次のような 2 つのグルー レコードがあります。
sub IN NS dns1.sub
IN NS dns2.sub
dns1.sub IN A 1.1.1.1
dns2.sub IN A 2.2.2.2
ServerB のゾーン ファイルでは、NS レコードは次のようになります。
@ IN NS dns1
IN NS dns2
dns1 IN A 1.1.1.1
dns2 IN A 3.3.3.3
ServerA のゾーン ファイル内の dns2.sub の A レコードが間違っています (これは意図的に行いました)。3.3.3.3 である必要があります。2
つのネーム サーバーを開始した後、ServerA はゾーン ファイルをキャッシュにロードします (このキャッシュに名前を付ける方法がわからないため、ここでは「ゾーン ファイル キャッシュ」と呼びます)。ServerB も同様にロードします。
ステップ 1: 「dig @ServerA +norecurse sub.example.com」を実行します。
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> @ServerA +norecurse sub.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64332
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 4
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sub.exmample.com. IN A
;; AUTHORITY SECTION:
sub.exmample.com. 60 IN NS dns1.sub.exmample.com.
sub.exmample.com. 60 IN NS dns2.sub.exmample.com.
;; ADDITIONAL SECTION:
dns1.sub.exmample.com. 60 IN A 1.1.1.1
dns2.sub.exmample.com. 60 IN A 2.2.2.2
;; Query time: 1 msec
;; SERVER: 10.82.12.69#53(10.82.12.69)
;; WHEN: 二 5月 28 14:55:50 CST 2019
;; MSG SIZE rcvd: 145
明らかに、RR はゾーン ファイル キャッシュに従って返されます。
ステップ2: 「dig @ServerA +recurse sub.example.com」を実行します。
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> @ServerA +recurse sub.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43819
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sub.exmample.com. IN A
;; AUTHORITY SECTION:
sub.exmample.com. 30 IN SOA dns1.sub.exmample.com. mail.sub.exmample.com. 2019051501 60 60 60 60
;; Query time: 803 msec
;; SERVER: 10.82.12.69#53(10.82.12.69)
;; WHEN: 二 5月 28 15:00:05 CST 2019
;; MSG SIZE rcvd: 100
ServerA のキャッシュをダンプした後、次の結果が得られました。
sub.exmample.com. 26 \-A ;-$NXRRSET
; sub.exmample.com. SOA dns1.sub.exmample.com. mail.sub.exmample.com. 2019051501 60 60 60 60
ステップ3: 「dig @ServerA +recurse c1.sub.example.com」を実行します。c1.sub.example.com は、アドレス 4.4.4.4 を持つ sub.example.com 内のホストの 1 つです。
; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> @ServerA +recurse c1.sub.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15260
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 4
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;c1.sub.example.com. IN A
;; ANSWER SECTION:
c1.sub.example.com. 30 IN A 4.4.4.4
;; AUTHORITY SECTION:
sub.example.com. 30 IN NS dns1.sub.exmample.com.
sub.example.com. 30 IN NS dns2.sub.exmample.com.
;; ADDITIONAL SECTION:
dns1.sub.exmample.com. 30 IN A 1.1.1.1
dns2.sub.exmample.com. 30 IN A 3.3.3.3
;; Query time: 13 msec
;; SERVER: 10.82.12.69#53(10.82.12.69)
;; WHEN: 二 5月 28 15:05:59 CST 2019
;; MSG SIZE rcvd: 171
本当に困惑する点がいくつかあります。1、3
つの手順をすべて実行した後、ServerA のキャッシュに、sub.example.com ゾーンのネーム サーバー dns2 に関する 2 つのリソース レコードがあります。1 つ目はゾーン ファイル キャッシュの「dns2.sub.exmample.com. 3.3.3.3」で、もう 1 つは ServerB から取得した DNS キャッシュの「dns2.sub.exmample.com. 2.2.2.2」です。通常の DNS クライアントとして、どちらを取得すればよいでしょうか。「DNS キャッシュ」の DNS リソース レコードは「ゾーン ファイル キャッシュ」のレコードよりも優先されますか。それともランダムですか。2
、「AUTHORITY SECTION」とはどういう意味ですか。私の意見では、2.2.2.2 は信頼できる回答ではないのですが、なぜ dig は 2.2.2.2 を「AUTHORITY」として扱うのでしょうか。3
、DNS クライアントは取得したすべての回答をキャッシュしますか、それとも「信頼できる」回答のみをキャッシュしますか。4
、DNS リゾルバーはいつ NS レコードを照会しますか。ステップ 2 の後、ServerA のキャッシュに NS レコードがないのはなぜですか?