Hay un RFC dedicado a este tema: RFC 2308 - Almacenamiento en caché negativo de consultas DNS (DNS NCACHE) .
La sección relevante para leer es 5: almacenamiento en caché de respuestas negativas que establece:
Al igual que las respuestas normales, las respuestas negativas tienen tiempo de vida (TTL). Como no hay un registro en la sección de respuestas a la que se pueda aplicar este TTL, el TTL se debe llevar por otro método. Esto se hace incluyendo el registro SOA de la zona en la sección de autoridad de la respuesta. Cuando el servidor autorizado crea este registro, su TTL se toma del mínimo del campo SOA.MINIMUM y el TTL de SOA. Este TTL disminuye de manera similar a una respuesta en caché normal y al llegar a cero (0) indica que la respuesta negativa en caché NO DEBE usarse nuevamente.
En primer lugar, identifiquemos SOA.MINIMUM
y el SOA TTL descrito en el RFC. El TTL es el número antes del tipo de registro IN
( 900
segundos en el ejemplo a continuación). Mientras que el mínimo es el último campo en el registro ( 86400
segundos en el ejemplo a continuación).
$ 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)
)
Ahora veamos algunos ejemplos, la serverfault.com
zona es ilustrativa ya que tiene servidores autorizados de dos proveedores diferentes que están configurados de manera diferente.
Vamos a encontrar los servidores de nombres autorizados para 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.
Luego verifique el registro SOA usando un servidor de nombres 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
De esto podemos ver que el TTL del registro SOA es 900
segundos, mientras que el valor TTL negativo es 86400
segundos. El valor de SOA TTL 900
es menor, por lo que esperamos que se use este valor.
Ahora, si consultamos un servidor autorizado para un dominio inexistente, deberíamos obtener una respuesta sin respuesta y con un registro SOA en la sección de autoridad:
$ 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
Cuando un resolutor recursivo (almacenamiento en caché) recibe esta respuesta, analizará el registro SOA en el AUTHORITY SECTION
y utilizará el TTL de este registro para determinar cuánto tiempo debe almacenar en caché el resultado negativo (en este caso, 900
segundos).
Ahora sigamos el mismo procedimiento con un servidor de nombres de 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
Puede ver que los servidores de nombres de Google tienen valores diferentes para los valores SOA TTL y Negative TTL. En este caso, el TTL negativo de 300
es menor que el TTL de SOA de 21600
. Por lo tanto, el servidor de Google debe usar el valor más bajo en el AUTHORITY SECTION
registro SOA al devolver una NXDOMAIN
respuesta:
$ 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
Como se esperaba, el TTL del registro SOA en la NXDOMAIN
respuesta es 300
segundos.
El ejemplo anterior también demuestra lo fácil que es obtener diferentes respuestas a la misma consulta. La respuesta que utiliza un solucionador de almacenamiento en caché individual se basa en qué se consultó el servidor de autoridad autorizado.
En mis pruebas, también he observado que algunos resolutivos recursivos (almacenamiento en caché) no devuelven un AUTHORITY SECTION
con un registro SOA con un TTL decreciente para solicitudes posteriores, mientras que otros lo hacen.
Por ejemplo, el solucionador Cloudflare hace (tenga en cuenta la disminución del valor 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
Mientras que el solucionador predeterminado en una VPC de AWS responderá con una sección de autoridad solo en la primera solicitud:
$ 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: Esta respuesta aborda el comportamiento de las NXDOMAIN
respuestas.
Glosario: