In meinem Labor gibt es zwei Nameserver, auf denen bind9 läuft:
ServerA hat eine Zonendatei für „example.com“;
ServerB hat eine Zonendatei für „sub.example.com“, die eine Unterzone von „example.com“ ist.
In der Zonendatei von ServerA gibt es zwei NS-Einträge über die Unterzone und zwei Glue-Einträge wie unten:
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
In der Zonendatei von ServerB sind die NS-Einträge wie folgt:
@ IN NS dns1
IN NS dns2
dns1 IN A 1.1.1.1
dns2 IN A 3.3.3.3
Der A-Eintrag von dns2.sub in der Zonendatei von ServerA ist falsch (ich habe das mit Absicht gemacht), er sollte 3.3.3.3 sein.
Nach dem Starten der beiden Nameserver lädt ServerA seine Zonendatei in den Cache (ich weiß nicht, wie ich diesen Cache nennen soll, hier nenne ich ihn „Zonendatei-Cache“) und ServerB tut dies ebenfalls.
Schritt 1: Ich führe „dig @ServerA +norecurse sub.example.com“ aus:
; <<>> 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
offensichtlich wird der RR gemäß dem Zonendatei-Cache zurückgegeben.
Schritt 2: Ich führe „dig @ServerA +recurse sub.example.com“ aus:
; <<>> 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
Nachdem ich den Cache von ServerA geleert hatte, erhielt ich Folgendes:
sub.exmample.com. 26 \-A ;-$NXRRSET
; sub.exmample.com. SOA dns1.sub.exmample.com. mail.sub.exmample.com. 2019051501 60 60 60 60
Schritt 3: Ich führe „dig @ServerA +recurse c1.sub.example.com“ aus: c1.sub.example.com ist einer der Hosts in sub.example.com mit der Adresse 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
Einige Punkte bereiten mir wirklich Rätsel:
1. Nach der Ausführung aller drei Schritte gibt es im Cache von ServerA zwei Ressourceneinträge zum Nameserver DNS2 der Zone sub.example.com: Der erste ist „dns2.sub.exmample.com. 3.3.3.3“ im Zonendatei-Cache, der andere ist „dns2.sub.exmample.com. 2.2.2.2“ im DNS-Cache, den er von ServerB erhalten hat. Welchen bekomme ich als normaler DNS-Client? Haben DNS-Ressourceneinträge im „DNS-Cache“ Vorrang vor Einträgen im „Zonendatei-Cache“? Oder zufällig?
2. Was bedeutet der „AUTHORITY SECTION“? Meiner Meinung nach ist 2.2.2.2 nicht die autoritative Antwort. Warum behandelt Dig 2.2.2.2 als „AUTHORITY“?
3. Ein DNS-Client speichert alle Antworten, die er erhält, oder nur die „autoritativen“ Antworten?
4. Wann fragt ein DNS-Resolver die NS-Einträge ab? Warum sind nach Schritt 2 keine NS-Einträge im Cache von ServerA vorhanden?