在我的實驗室中,有兩個名稱伺服器運行bind9:
ServerA 有一個「example.com」的區域檔案;
ServerB 有一個「sub.example.com」的區域文件,它是「example.com」的子區域。
在ServerA的區域文件中,有兩個關於子區域的NS記錄和兩個膠水記錄,如下所示:
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。
啟動兩個名稱伺服器後,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是sub.example.com中位址為4.4.4.4的主機之一
; <<>> 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.執行完這三個步驟後,ServerA 的快取中有兩個關於sub.example.com 區域的名稱伺服器dns2 的資源記錄:第一個是「dns2.sub.exmample .com。作為一個普通的 dns 客戶端,我會得到哪一個? 「DNS 快取」中的 DNS 資源記錄優先於「區域檔案快取」中的記錄?
2.「權限部分」是什麼意思?在我看來,2.2.2.2不是權威答案,為什麼dig會將2.2.2.2視為「權威」?
3.DNS客戶端會快取它得到的所有答案還是只快取「權威」答案?
4.DNS解析器什麼時候會查詢NS記錄? Step2之後為什麼ServerA的快取中沒有NS記錄?