No meu laboratório, existem dois servidores de nomes executando o bind9:
o ServerA possui um arquivo de zona para "example.com";
ServerB possui um arquivo de zona para "sub.example.com", que é uma subzona de "example.com".
No arquivo de zona do ServerA, existem dois registros NS sobre a subzona e dois registros de cola como abaixo:
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
No arquivo de zona do ServerB, os registros NS como abaixo:
@ IN NS dns1
IN NS dns2
dns1 IN A 1.1.1.1
dns2 IN A 3.3.3.3
O registro A de dns2.sub no arquivo de zona do ServerA está errado (fiz isso de propósito), deveria ser 3.3.3.3.
Depois de iniciar os dois servidores de nomes, o ServidorA carrega seu arquivo de zona no cache (não sei como nomear esse cache, aqui eu o chamo de "cache de arquivo de zona") e o ServidorB também.
Passo 1: executo "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
obviamente o RR é retornado de acordo com o cache do arquivo de zona.
Passo 2: executo "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
depois de despejar o cache do ServerA, obtive estas coisas:
sub.exmample.com. 26 \-A ;-$NXRRSET
; sub.exmample.com. SOA dns1.sub.exmample.com. mail.sub.exmample.com. 2019051501 60 60 60 60
Etapa 3: executo "dig @ServerA +recurse c1.sub.example.com": c1.sub.example.com é um dos hosts em sub.example.com com endereço 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
Existem alguns pontos que realmente me intrigam:
1、depois de executar todas as três etapas, há dois registros de recursos no cache do ServidorA sobre o servidor de nomes da zona sub.example.com dns2: o primeiro é "dns2.sub.exmample.com. 3.3.3.3 "no cache de arquivo de zona, outro é" dns2.sub.exmample.com "no cache DNS obtido do ServerB. Como um cliente DNS normal, qual irei obter? Os registros de recursos DNS em "cache DNS" têm prioridade sobre os registros em "cache de arquivos de zona" - ou aleatoriamente?
2、O que significa "SEÇÃO DE AUTORIDADE"? na minha opinião, 2.2.2.2 não é a resposta oficial, por que tratar 2.2.2.2 como "AUTORIDADE"?
3. Um cliente DNS armazenará em cache todas as respostas obtidas ou apenas as respostas "autorizadas"?
4. Quando um resolvedor de DNS consultará os registros NS? após a Etapa 2, por que não há registros NS no cache do ServerA?