Существует RFC, посвященный этой теме: RFC 2308 - Отрицательное кэширование DNS-запросов (DNS NCACHE) .
Соответствующий раздел для чтения - 5 - Кэширование отрицательных ответов, в котором говорится:
Как и обычные ответы, отрицательные ответы имеют время жить (TTL). Поскольку в разделе ответов нет записи, к которой может быть применен этот TTL, TTL должен переноситься другим методом. Это делается путем включения записи SOA из зоны в раздел полномочий в ответе. Когда авторитетный сервер создает эту запись, его TTL берется из минимума поля SOA.MINIMUM и TTL SOA. Этот TTL уменьшается аналогично обычному кэшированному ответу и при достижении нуля (0) указывает, что кэшированный отрицательный ответ НЕ ДОЛЖЕН использоваться снова.
Во-первых, давайте определим SOA.MINIMUM
TTL и SOA, описанные в 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:
$ 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 имеют разные значения как для SOA TTL, так и для отрицательных значений TTL. В этом случае отрицательный TTL of 300
ниже, чем SOA TTL of 21600
. Поэтому AUTHORITY SECTION
при возврате NXDOMAIN
ответа сервер Google должен использовать нижнее значение в записи SOA :
$ 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
секунды.
Приведенный выше пример также демонстрирует, как легко получить разные ответы на один и тот же запрос. Ответ, который в конечном итоге использует отдельный распознаватель кэширования, заключается в том, какой авторитетный namserver был запрошен.
В моем тестировании я также заметил, что некоторые рекурсивные (кэширующие) преобразователи не возвращают a 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
ответов.
Глоссарий: