Có một RFC dành riêng cho chủ đề này: RFC 2308 - Bộ nhớ đệm tiêu cực của các truy vấn DNS (DNS NCACHE) .
Phần có liên quan để đọc là 5 - Bộ đệm Câu trả lời phủ định có ghi:
Giống như câu trả lời bình thường, câu trả lời tiêu cực có thời gian để sống (TTL). Vì không có bản ghi nào trong phần câu trả lời mà TTL này có thể được áp dụng, nên phải thực hiện TTL bằng phương pháp khác. Điều này được thực hiện bằng cách bao gồm bản ghi SOA từ vùng trong phần thẩm quyền của câu trả lời. Khi máy chủ có thẩm quyền tạo bản ghi này, TTL của nó được lấy từ mức tối thiểu của trường SOA.MINIMUM và TTL của SOA. Điều này suy giảm theo cách tương tự với câu trả lời được lưu trong bộ nhớ cache thông thường và khi đạt đến 0 (0) cho thấy câu trả lời phủ định được lưu trong bộ nhớ cache KHÔNG được sử dụng lại.
Trước hết, hãy xác định SOA.MINIMUM
và SOA TTL được mô tả trong RFC. TTL là số trước loại bản ghi IN
( 900
giây trong ví dụ bên dưới). Trong khi mức tối thiểu là trường cuối cùng trong bản ghi ( 86400
giây trong ví dụ bên dưới).
$ 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)
)
Bây giờ hãy xem xét một số ví dụ, serverfault.com
khu vực này có tính minh họa vì nó có các máy chủ có thẩm quyền từ hai nhà cung cấp khác nhau được cấu hình khác nhau.
Cho phép tìm các máy chủ tên có thẩm quyền cho serverfault.com
khu vực:
$ 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.
Sau đó kiểm tra bản ghi SOA bằng máy chủ tên 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
Từ đó, chúng ta có thể thấy rằng TTL của bản ghi SOA là 900
giây trong khi giá trị TTL âm là 86400
giây. Giá trị của SOA 900
là thấp hơn nên chúng tôi hy vọng giá trị này sẽ được sử dụng.
Bây giờ nếu chúng ta truy vấn một máy chủ có thẩm quyền cho một miền không tồn tại, chúng ta sẽ nhận được phản hồi mà không có câu trả lời và với bản ghi SOA trong phần thẩm quyền:
$ 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
Khi trình phân giải đệ quy (bộ đệm) nhận được câu trả lời này, nó sẽ phân tích bản ghi SOA trong AUTHORITY SECTION
và sử dụng TTL của bản ghi này để xác định thời gian lưu bộ đệm kết quả âm tính trong bao lâu (trong trường hợp này là 900
vài giây).
Bây giờ, hãy làm theo quy trình tương tự với máy chủ tên google:
$ 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
Bạn có thể thấy rằng các máy chủ tên google có các giá trị khác nhau cho cả hai giá trị TTL và các giá trị TTL âm. Trong trường hợp này, TTL âm của 300
thấp hơn so với TTL của 21600
. Do đó, máy chủ google nên sử dụng giá trị thấp hơn trong AUTHORITY SECTION
bản ghi SOA khi trả về NXDOMAIN
phản hồi:
$ 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
Như mong đợi, bản ghi TTL của bản ghi SOA trong NXDOMAIN
phản hồi là 300
giây.
Ví dụ trên cũng cho thấy việc dễ dàng nhận được các câu trả lời khác nhau cho cùng một truy vấn. Câu trả lời mà một bộ giải quyết bộ đệm ẩn riêng lẻ kết thúc bằng cách sử dụng máy chủ nam có thẩm quyền đã được truy vấn.
Trong thử nghiệm của tôi, tôi cũng đã quan sát thấy rằng một số bộ giải quyết đệ quy (bộ đệm) không trả về một AUTHORITY SECTION
bản ghi SOA với một bộ giảm dần cho các yêu cầu tiếp theo trong khi các bộ khác làm.
Ví dụ: trình phân giải đám mây thực hiện (lưu ý giá trị TTL giảm dần):
$ 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
Mặc dù trình phân giải mặc định trong VPC AWS sẽ chỉ phản hồi với phần quyền hạn theo yêu cầu đầu tiên:
$ 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
Lưu ý: Câu trả lời này giải quyết hành vi của NXDOMAIN
câu trả lời.
Bảng chú giải: