มี RFC ทุ่มเทให้กับเรื่องนี้คือ: RFC 2308 - แคชเชิงลบของ DNS แบบสอบถาม (DNS NCACHE)
ส่วนที่เกี่ยวข้องในการอ่านคือ5 - แคชคำตอบเชิงลบซึ่งระบุ:
เช่นเดียวกับคำตอบปกติคำตอบเชิงลบมีเวลาอยู่ (TTL) เนื่องจากไม่มีบันทึกในส่วนคำตอบที่สามารถใช้ TTL นี้ได้จึงต้องดำเนินการด้วยวิธีอื่น TTL สิ่งนี้ทำได้โดยการรวมเรกคอร์ด SOA จากโซนในส่วนสิทธิ์ของการตอบกลับ เมื่อเซิร์ฟเวอร์ที่มีสิทธิ์สร้างเรคคอร์ดนี้ TTL จะถูกนำมาจากขั้นต่ำของฟิลด์ SOA.MINIMUM และ TTL ของ SOA การลดลงของ TTL ในลักษณะที่คล้ายกับคำตอบที่แคชปกติและเมื่อถึงศูนย์ (0) หมายถึงคำตอบเชิงลบที่แคชไว้จะต้องไม่ถูกใช้อีกครั้ง
ก่อนอื่นให้ระบุSOA.MINIMUM
และ SOA TTL ที่อธิบายไว้ใน RFC TTL คือหมายเลขก่อนประเภทบันทึกIN
( 900
วินาทีในตัวอย่างด้านล่าง) ในขณะที่ค่าต่ำสุดคือฟิลด์สุดท้ายในบันทึก ( 86400
วินาทีในตัวอย่างด้านล่าง)
$ dig serverfault.com soa @ns-1135.awsdns-13.org +noall +answer +multiline
; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> serverfault.com soa @ns-1135.awsdns-13.org +noall +answer +multiline
;; global options: +cmd
serverfault.com. 900 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. (
1 ; serial
7200 ; refresh (2 hours)
900 ; retry (15 minutes)
1209600 ; expire (2 weeks)
86400 ; minimum (1 day)
)
ตอนนี้ลองมาดูตัวอย่างserverfault.com
โซนเป็นตัวอย่างเนื่องจากมีเซิร์ฟเวอร์ที่เชื่อถือได้จากผู้ให้บริการสองรายที่มีการกำหนดค่าแตกต่างกัน
ให้ค้นหาเนมเซิร์ฟเวอร์สิทธิ์สำหรับserverfault.com
โซน:
$ host -t ns serverfault.com
serverfault.com name server ns-860.awsdns-43.net.
serverfault.com name server ns-1135.awsdns-13.org.
serverfault.com name server ns-cloud-c1.googledomains.com.
serverfault.com name server ns-cloud-c2.googledomains.com.
จากนั้นตรวจสอบบันทึก SOA โดยใช้เนมเซิร์ฟเวอร์ aws:
$ dig serverfault.com soa @ns-1135.awsdns-13.org | grep 'ANSWER SECTION' -A 1
;; ANSWER SECTION:
serverfault.com. 900 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
จากนี้เราจะเห็นได้ว่า TTL ของระเบียน SOA เป็น900
วินาทีในขณะที่ค่าลบ TTL เป็น86400
วินาที ค่า SOA TTL ของ900
ต่ำกว่าดังนั้นเราจึงคาดหวังให้ใช้ค่านี้
ตอนนี้ถ้าเราสอบถามเซิร์ฟเวอร์เผด็จการสำหรับโดเมนที่ไม่มีอยู่เราควรได้รับการตอบสนองโดยไม่มีคำตอบและบันทึก SOA ในส่วนอำนาจ:
$ dig nxdomain.serverfault.com @ns-1135.awsdns-13.org
; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> nxdomain.serverfault.com @ns-1135.awsdns-13.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51948
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;nxdomain.serverfault.com. IN A
;; AUTHORITY SECTION:
serverfault.com. 900 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
;; Query time: 125 msec
;; SERVER: 205.251.196.111#53(205.251.196.111)
;; WHEN: Tue Aug 20 15:49:47 NZST 2019
;; MSG SIZE rcvd: 135
เมื่อตัวแก้ปัญหาแบบเรียกซ้ำ (แคช) ได้รับคำตอบนี้จะแยกวิเคราะห์เรคคอร์ด SOA ในAUTHORITY SECTION
และใช้ TTL ของเรคคอร์ดนี้เพื่อกำหนดระยะเวลาที่แคชผลลัพธ์ที่เป็นค่าลบ (ในกรณีนี้เป็น900
วินาที)
ตอนนี้ให้ทำตามขั้นตอนเดียวกันกับ google nameserver:
$ dig serverfault.com soa @ns-cloud-c2.googledomains.com | grep 'ANSWER SECTION' -A 1
;; ANSWER SECTION:
serverfault.com. 21600 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
คุณจะเห็นว่า google nameservers มีค่าแตกต่างกันสำหรับทั้ง SOA TTL และค่าลบ TTL ในกรณีนี้ TTL เชิงลบของการ300
ต่ำกว่า SOA TTL 21600
ของ ดังนั้นเซิร์ฟเวอร์ google ควรใช้ค่าที่ต่ำกว่าในAUTHORITY SECTION
บันทึก SOA เมื่อส่งคืนการNXDOMAIN
ตอบกลับ:
$ dig nxdomain.serverfault.com @ns-cloud-c2.googledomains.com
; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> nxdomain.serverfault.com @ns-cloud-c2.googledomains.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 25920
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;nxdomain.serverfault.com. IN A
;; AUTHORITY SECTION:
serverfault.com. 300 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
;; Query time: 130 msec
;; SERVER: 216.239.34.108#53(216.239.34.108)
;; WHEN: Tue Aug 20 16:05:24 NZST 2019
;; MSG SIZE rcvd: 143
ตามที่คาดไว้ TTL ของระเบียน SOA ในการNXDOMAIN
ตอบสนองคือไม่300
กี่วินาที
ตัวอย่างข้างต้นยังแสดงให้เห็นว่าการได้รับคำตอบที่แตกต่างจากแบบสอบถามเดียวกันนั้นง่ายเพียงใด คำตอบที่ตัวแก้ไขการแคชแต่ละรายการจบลงด้วยการใช้งานซึ่งลงไปที่การสอบถามเซิร์ฟเวอร์ที่เชื่อถือได้
ในการทดสอบของฉันฉันได้สังเกตเห็นว่าตัวแก้ไขแบบเรียกซ้ำ (แคช) บางตัวไม่ส่งคืนAUTHORITY SECTION
ระเบียน SOA ที่มี TTL ที่ลดลงสำหรับคำขอถัดไปในขณะที่คนอื่นทำ
ตัวอย่างเช่นตัวแก้ไขคลาวด์แฟลทำ (สังเกตค่า TTL ที่ลดลง):
$ dig nxdomain.serverfault.com @1.1.1.1 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 674 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
$ dig nxdomain.serverfault.com @1.1.1.1 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 668 IN SOA ns-1135.awsdns-13.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
ในขณะที่โปรแกรมแก้ไขค่าเริ่มต้นใน AWS VPC จะตอบกลับด้วยส่วนสิทธิ์ในคำขอแรกเท่านั้น:
$ dig nxdomain.serverfault.com @169.254.169.253 | grep 'AUTHORITY SECTION' -A 1
;; AUTHORITY SECTION:
serverfault.com. 300 IN SOA ns-cloud-c1.googledomains.com. cloud-dns-hostmaster.google.com. 1 21600 3600 259200 300
$ dig nxdomain.serverfault.com @169.254.169.253 | grep 'AUTHORITY SECTION' -A 1 | wc -l
0
หมายเหตุ: คำตอบนี้กล่าวถึงพฤติกรรมของNXDOMAIN
คำตอบ
คำศัพท์: