내 연구실에는 bind9를 실행하는 두 개의 이름 서버가 있습니다.
ServerA에는 "example.com"에 대한 영역 파일이 있습니다.
ServerB에는 "example.com"의 하위 영역인 "sub.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은 주소가 4.4.4.4인 sub.example.com의 호스트 중 하나입니다.
; <<>> 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. "권한 섹션"은 무엇을 의미합니까? 제 생각에는 2.2.2.2가 권위 있는 답변이 아닌 것 같습니다. 왜 2.2.2.2를 "권한"으로 취급합니까?
3、DNS 클라이언트는 얻은 모든 답변을 캐시합니까, 아니면 "권한 있는" 답변만 캐시합니까?
4、DNS 확인자는 언제 NS 레코드를 쿼리합니까? Step2 이후 ServerA의 캐시에 NS 레코드가 없는 이유는 무엇입니까?