В моей лаборатории есть два сервера имен, на которых запущен 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
Запись A dns2.sub в файле зоны ServerA неверна (я сделал это намеренно), должно быть 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" в кэше файлов зоны, другая - "dns2.sub.exmample.com. 2.2.2.2" в кэше DNS, который он получил от ServerB. Какую из них я получу, как обычный клиент DNS? Записи ресурсов DNS в "кеше DNS" имеют приоритет над записями в "кеше файлов зоны"? Или случайным образом?
2. Что означает "РАЗДЕЛ AUTHORITY"? По моему мнению, 2.2.2.2 не является авторитетным ответом, почему dig рассматривает 2.2.2.2 как "AUTHORITY"?
3. Клиент DNS будет кэшировать все полученные им ответы или только "авторитетные" ответы?
4. Когда DNS-резолвер будет запрашивать записи NS? Почему после Шага 2 в кэше ServerA нет записей NS?