绑定区域文件缓存和 DNS 缓存

绑定区域文件缓存和 DNS 缓存

在我的实验室中,有两个名称服务器运行 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. 3.3.3.3”,另一个是从 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记录?

相关内容