Esiste un RFC dedicato a questo argomento: RFC 2308 - Memorizzazione nella cache negativa delle query DNS (DNS NCACHE) .
La sezione pertinente da leggere è 5: memorizzazione nella cache delle risposte negative che afferma:
Come le risposte normali, le risposte negative hanno il tempo di vivere (TTL). Poiché nella sezione di risposta non è presente alcun record a cui applicare questo TTL, il TTL deve essere portato con un altro metodo. Questo viene fatto includendo il record SOA della zona nella sezione autorità della risposta. Quando il server autorevole crea questo record, il suo TTL viene preso dal minimo del campo SOA.MINIMUM e dal TTL di SOA. Questo TTL diminuisce in modo simile a una normale risposta memorizzata nella cache e al raggiungimento di zero (0) indica che la risposta negativa memorizzata nella cache NON DEVE essere utilizzata nuovamente.
Innanzitutto, consente di identificare il SOA.MINIMUM
TTL SOA e descritto nella RFC. Il TTL è il numero prima del tipo di record IN
( 900
secondi nell'esempio seguente). Mentre il minimo è l'ultimo campo nel record ( 86400
secondi nell'esempio seguente).
$ 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)
)
Ora diamo un'occhiata ad alcuni esempi, la serverfault.com
zona è illustrativa in quanto ha server autorevoli di due diversi provider configurati in modo diverso.
Consente di trovare i nameserver autorevoli per la serverfault.com
zona:
$ 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.
Quindi controlla il record SOA usando un nameserver 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
Da questo possiamo vedere che il TTL del record SOA è 900
secondi mentre il valore TTL negativo è 86400
secondi. Il valore SOL TTL di 900
è inferiore, quindi prevediamo di utilizzare questo valore.
Ora se interrogiamo un server autorevole per un dominio inesistente dovremmo ottenere una risposta senza risposta e con un record SOA nella sezione autorità:
$ 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
Quando un risolutore ricorsivo (memorizzazione nella cache) riceve questa risposta, analizzerà il record SOA nel AUTHORITY SECTION
e utilizzerà il TTL di questo record per determinare per quanto tempo dovrebbe memorizzare nella cache il risultato negativo (in questo caso 900
secondi).
Ora seguiamo la stessa procedura con un nameserver 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
Puoi vedere che i nameserver di Google hanno valori diversi sia per i valori TTL SOA che per quelli TTL negativi. In questo caso il TTL negativo di 300
è inferiore al TTL SOA di 21600
. Pertanto, il server di Google dovrebbe utilizzare il valore più basso nel AUTHORITY SECTION
record SOA quando restituisce una NXDOMAIN
risposta:
$ 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
Come previsto, il TTL del record SOA nella NXDOMAIN
risposta è 300
secondi.
L'esempio sopra mostra anche quanto sia facile ottenere risposte diverse alla stessa query. La risposta che finisce per utilizzare un singolo risolutore di cache è la richiesta a namserver autorevole.
Nei miei test ho anche osservato che alcuni risolutori ricorsivi (memorizzazione nella cache) non restituiscono un AUTHORITY SECTION
con un record SOA con un TTL decrementante per le richieste successive, mentre altri lo fanno.
Ad esempio il risolutore cloudflare fa (notare il valore TTL decrementante):
$ 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
Mentre il resolver predefinito in un VPC AWS risponderà con una sezione di autorità solo alla prima richiesta:
$ 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
Nota: questa risposta risolve il comportamento delle NXDOMAIN
risposte.
Glossario: