web-dev-qa-db-ja.com

ChromiumがDNSを1分以上キャッシュしないのはなぜですか?

私はChromiumを使用しており、DNSが予期した時間キャッシュされないという問題があります。 example.comドメインを取ります。 DNS設定によると、このドメインはさらに26151秒間キャッシュされる必要があります。

$ Dig example.com

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

ただし、Chromiumでexample.comを開いてchrome:// net-internals /#dnsを開くと、IPは1分以内に忘れられます。

enter image description here

ChromiumがドメインのDNS設定のTTL=)に準拠しないのはなぜですか?期限切れになるまでDNSデータをキャッシュするように強制するにはどうすればよいですか?

27
user32421

実際、Chromium/ChromeはDNSリクエストを1分以上キャッシュしません。

興味深いことに、 bugs-chromiumから-問題164026-DNS TTL 2011年4月21日以降は認められない

システム内の唯一のDNSキャッシュはchromeにあり、TTLを尊重していません。chromeを修正するか、中間キャッシュを追加する必要があります。ハンドルTTL正しく。

2012年12月4日チケットの回答:

HostCacheは現在、すべての肯定的な結果に対してTTL = 60秒を想定しています。非同期DNSリゾルバーでは、TTL = max(60s、server_reported_ttl)、つまり少なくとも60sを使用する予定です。理論的根拠は、キャッシュのパフォーマンスを向上させることです。 (CDN NSはTTL = 10-20sを提供し、すべてのサブリソースをフェッチするために30秒以上かかる場合、1つのページのロード中に同じホスト名を再クエリする必要があることがよくあります。)

チケットは2013年10月10日に次のように終了しました:

Chrome on CrOSは、TTL = max(60s、> server_reported_ttl)を尊重する非同期DNSリゾルバーを使用します

私はこれをWontFixとしてクローズします(廃止/意図したとおりに機能します)。

これは何年もの間既知の問題でした。内部DNSリゾルバーはDNSレコードのTTL=を無視し、1分間のみDNSリクエストをキャッシュします。

ユーザーは何年もの間、デフォルトの動作を変更する機能を要求してきましたが、Googleがこれを作成したことはありません。

以前は、chrome://flagsで内部DNSリゾルバーを無効にすることができましたが、現在では機能的に公開されていません。

要約すると、それは機能です。これは、仕様によるものです。

(私は最初にそれを変更することはできなかったと書いたが、それは明らかに真実ではない。本当に決心した人はChromiumを再コンパイルするか、Chrome binaries。)をハックできる。).

したがって、アデンダとして:文書化された証拠がたくさんありますGoogleのエンジニアはデフォルトのTTL Chrome/iumでDNS回答を受け取りました。

From DNSクエリのネガティブキャッシング(DNS NCACHE)

肯定的な応答のキャッシュと同様に、リゾルバーが否定的な応答をキャッシュする期間を制限するのが賢明です...

リゾルバーはDNS回答のキャッシュに最大制限を課す可能性がありますが、Googleの1分の制限は、Chromeが低すぎる可能性があります。

追伸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   }
33
Rui F Ribeiro