Há uma RFC dedicada a este tópico: RFC 2308 - Armazenamento em cache negativo de consultas DNS (DNS NCACHE) .
A seção relevante a ser lida é 5 - Caching Negative Answers, que afirma:
Como respostas normais, as respostas negativas têm um tempo de vida (TTL). Como não há registro na seção de respostas à qual esse TTL possa ser aplicado, o TTL deve ser carregado por outro método. Isso é feito incluindo o registro SOA da zona na seção de autoridade da resposta. Quando o servidor autoritativo cria esse registro, seu TTL é obtido no mínimo do campo SOA.MINIMUM e TTL do SOA. Este TTL diminui de maneira semelhante a uma resposta em cache normal e ao atingir zero (0) indica que a resposta em cache negativa NÃO DEVE ser usada novamente.
Em primeiro lugar, vamos identificar o SOA.MINIMUM
e SOA TTL descrito no RFC. O TTL é o número antes do tipo de registro IN
( 900
segundos no exemplo abaixo). Enquanto o mínimo é o último campo no registro ( 86400
segundos no exemplo abaixo).
$ 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)
)
Agora vamos ver alguns exemplos, a serverfault.com
zona é ilustrativa, pois possui servidores autoritativos de dois provedores diferentes configurados de maneira diferente.
Vamos encontrar os servidores de nomes com autoridade para a 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.
Em seguida, verifique o registro SOA usando um servidor de nomes 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
A partir disso, podemos ver que o TTL do registro SOA é 900
segundos enquanto o valor TTL negativo é 86400
segundos. O valor SOA TTL de 900
é menor, portanto esperamos que esse valor seja usado.
Agora, se consultarmos um servidor autoritativo em busca de um domínio inexistente, obteremos uma resposta sem resposta e com um registro SOA na seção de autoridade:
$ 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 um resolvedor recursivo (em cache) recebe essa resposta, ele analisa o registro SOA no AUTHORITY SECTION
e usa o TTL desse registro para determinar quanto tempo deve armazenar em cache o resultado negativo (nesse caso, 900
segundos).
Agora vamos seguir o mesmo procedimento com um servidor de nomes do 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
Você pode ver que os servidores de nomes do Google têm valores diferentes para os valores SOA TTL e Negative TTL. Nesse caso, o TTL negativo de 300
é menor que o SOA TTL de 21600
. Portanto, o servidor do Google deve usar o valor mais baixo no AUTHORITY SECTION
registro SOA ao retornar uma NXDOMAIN
resposta:
$ 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 esperado, o TTL do registro SOA na NXDOMAIN
resposta é 300
segundos.
O exemplo acima também demonstra como é fácil obter respostas diferentes para a mesma consulta. A resposta que um resolvedor de armazenamento em cache individual acaba usando é a que servidor de nomes autoritativo foi consultado.
Nos meus testes, também observei que alguns resolvedores recursivos (cache) não retornam um AUTHORITY SECTION
com um registro SOA com um TTL decrescente para solicitações subsequentes, enquanto outros o fazem.
Por exemplo, o resolvedor de cloudflare faz (observe o decrescente 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
Enquanto o resolvedor padrão em um AWS VPC responderá com uma seção de autoridade apenas na primeira solicitação:
$ 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 resposta aborda o comportamento das NXDOMAIN
respostas.
Glossário: