Почему Chromium не кэширует DNS более минуты?

27

Я использую Chromium и у меня проблемы с тем, что DNS не кэшируется в течение ожидаемого времени. Возьмите домен example.com. Согласно настройкам DNS, этот домен должен быть кэширован еще на 26151 секунду:

$ dig example.com

;; ANSWER SECTION:
example.com.        26151   IN  A   93.184.216.34

Однако когда я открываю example.com в Chromium и открываю chrome: // net-internals / # dns, то IP-адрес забывается в течение минуты!

введите описание изображения здесь

Почему Chromium не придерживается TTL настройки DNS домена? Как я могу заставить его кэшировать данные DNS до истечения срока их действия?

user32421
источник
4
«... этот домен должен быть кэширован в течение еще 26151 секунд ...» - Нет, домен может быть кэширован в течение 26151 секунды. Кеширование DNS не является обязательным.
marcelm

Ответы:

33

Chromium / Chrome не кэширует DNS-запросы более минуты.

Интересно, что от ошибок хрома - выпуск 164026 - DNS TTL не соблюдается с 21 апреля 2011

Единственный DNS-кеш в системе находится в Chrome и не поддерживает TTL. Нам нужно либо исправить хром и / или добавить промежуточный кеш, который правильно обрабатывает TTL.

Ответ в билете 4 декабря 2012 года:

HostCache в настоящее время принимает TTL = 60 с для всех положительных результатов. При использовании асинхронного преобразователя DNS мы планируем использовать TTL = max (60 с, server_reported_ttl), т. Е. Как минимум 60 с. Обоснованием является повышение производительности кеша. (Когда CDN NS предоставляет TTL = 10-20 с, а для извлечения всех подресурсов требуется более 30 с, нам часто приходится повторно запрашивать одно и то же имя хоста во время загрузки одной страницы.)

Билет закрыт 10 октября 2013 года как:

Chrome на CrOS использует асинхронный преобразователь DNS, который принимает TTL = max (60 с,> server_reported_ttl)

Я закрываю это как WontFix (устарел / работает как задумано).

Это была известная проблема в течение многих лет; их внутренний DNS-распознаватель игнорирует TTL DNS-записей и кэширует DNS-запросы только в течение 1 минуты.

Пользователи годами запрашивали возможность изменить это поведение по умолчанию, и Google так и не создал ее.

В прошлом вы могли отключить внутренний DNS-преобразователь, в chrome://flagsнастоящее время, который больше не работает.

Подводя итог, можно сказать, что это особенность, например, она делает это по замыслу.

(Первоначально я писал, что это никогда не может быть изменено, что, очевидно, не соответствует действительности. Действительно решительный человек может либо перекомпилировать Chromium, либо взломать двоичные файлы Chrome.).

Итак, в качестве дополнения: существует множество документально подтвержденных доказательств, что инженеры Google не намерены соблюдать TTL по умолчанию в полученных ответах DNS в Chrome / ium.

От отрицательного кеширования DNS-запросов (DNS NCACHE)

Как и в случае кеширования положительных ответов, для резольвера целесообразно ограничить продолжительность кеширования отрицательного ответа ...

Хотя подразумевается, что распознаватель может / должен наложить максимальный лимит на кэширование ответа DNS, 1-минутный лимит в Google Chrome может быть слишком низким.

PS Я на самом деле нашел ответ на вопрос, который беспокоил меня годами, когда я получал статистику Chrome, чтобы ответить на этот вопрос: Chrome: DNS-запросы со случайными DNS-именами: вредоносная программа?

PPS Из приведенного ниже кода очевидно, что отрицательные ответы не кэшируются (TTL = 0).

С https://chromium.googlesource.com/chromium/src/net/dns/host_resolver_impl.cc

  99 // Default TTL for successful resolutions with ProcTask.
 100 const unsigned kCacheEntryTTLSeconds = 60;
 101 
 102 // Default TTL for unsuccessful resolutions with ProcTask.
 103 const unsigned kNegativeCacheEntryTTLSeconds = 0;
 104 
 105 // Minimum TTL for successful resolutions with DnsTask.
 106 const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;

1518   // Called by ProcTask when it completes.
1519   void OnProcTaskComplete(base::TimeTicks start_time,
1520                           int net_error,
1521                           const AddressList& addr_list) {
1522     DCHECK(is_proc_running());
1523 
1524     if (dns_task_error_ != OK) {
1525       base::TimeDelta duration = base::TimeTicks::Now() - start_time;
1526       if (net_error == OK) {
1527         UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackSuccess", duration);
1528         if ((dns_task_error_ == ERR_NAME_NOT_RESOLVED) &&
1529             ResemblesNetBIOSName(key_.hostname)) {
1530           UmaAsyncDnsResolveStatus(RESOLVE_STATUS_SUSPECT_NETBIOS);
1531         } else {
1532           UmaAsyncDnsResolveStatus(RESOLVE_STATUS_PROC_SUCCESS);
1533         }
1534         base::UmaHistogramSparse("Net.DNS.DnsTask.Errors",
1535                                  std::abs(dns_task_error_));
1536         resolver_->OnDnsTaskResolve(dns_task_error_);
1537       } else {
1538         UMA_HISTOGRAM_LONG_TIMES_100("AsyncDNS.FallbackFail", duration);
1539         UmaAsyncDnsResolveStatus(RESOLVE_STATUS_FAIL);
1540       }
1541     }
1542 
1543     if (ContainsIcannNameCollisionIp(addr_list))
1544       net_error = ERR_ICANN_NAME_COLLISION;
1545 
1546     base::TimeDelta ttl =
                                              # always  0 seconds
1547         base::TimeDelta::FromSeconds(kNegativeCacheEntryTTLSeconds);
1548     if (net_error == OK)
                                              # always 60 seconds 
1549       ttl = base::TimeDelta::FromSeconds(kCacheEntryTTLSeconds);  
1550 
1551     // Source unknown because the system resolver could have gotten it from a
1552     // hosts file, its own cache, a DNS lookup or somewhere else.
1553     // Don't store the |ttl| in cache since it's not obtained from the server.
1554     CompleteRequests(
1555         MakeCacheEntry(net_error, addr_list, HostCache::Entry::SOURCE_UNKNOWN),
1556         ttl);
1557   }
Руи Ф Рибейро
источник
4
Для меня интересно, что chrome кэширует DNS-запросы на основе TTL для некоторых доменов, например, для этого домена, dougblack.ioпоэтому, возможно, полные правила немного сложнее. но 99 из ста доменов ведут себя так, как вы описали.
the_velour_fog
2
Chrome делает случайные DNS-запросы, чтобы определить, захватывает ли он все сети DNS-запросов (например, некоторые платные точки беспроводного доступа). Кроме того, я полагаю, что значение «тайм-аут», которое вы смотрите в конфигурации, составляет 1 секунду для ответа DNS-серверов, а не 1-минутный TTL.
duskwuff
5
Печально, что хром делает днс кеш вообще. Всякий раз, когда я делаю быстрые изменения в моем NS и очищаю кэш DNS, я всегда должен помнить, что Chrome делает это самостоятельно.
Оле К
1
@OleK: Да, я понятия не имел, что у Chrome даже есть собственный кеш DNS. Спасибо этой странице за указание на это ...
Mehrdad
2
@OleK - Я согласен, но в то же время я могу видеть, где короткое ... скажем, 60 секунд или около того :), кеш - это хорошая идея (чтобы сэкономить немного сетевого трафика) и все еще позволяет такие вещи, как циклический перебор днс и тд на работу
иваниван