Chromium이 1 분 이상 DNS를 캐시하지 않는 이유는 무엇입니까?


27

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를 열면 1 분 안에 IP가 잊혀집니다!

여기에 이미지 설명을 입력하십시오

Chromium이 도메인 DNS 설정의 TTL을 준수하지 않는 이유는 무엇입니까? DNS 데이터가 만료 될 때까지 어떻게 강제로 DNS 데이터를 캐시하도록 할 수 있습니까?


4
"...이 도메인은 26151 초 동안 캐시되어야합니다 ..." -아니요, 도메인 26151 초 동안 캐시 될 수 있습니다. DNS 캐싱은 필수가 아닙니다.
marcelm

답변:


33

Chromium / Chrome은 실제로 1 분 이상 DNS 요청을 캐시하지 않습니다.

흥미롭게도 버그-크롬-문제 164026-DNS TTL이 2011 년 4 월 21 일부터 인정되지 않음

시스템의 유일한 DNS 캐시는 크롬이며 TTL을 준수하지 않습니다. Chrome을 수정하거나 TTL을 올바르게 처리하는 중간 캐시를 추가해야합니다.

2012 년 12 월 4 일 티켓 답변 :

HostCache는 현재 모든 긍정적 결과에 대해 TTL = 60을 가정합니다. 비동기 DNS 리졸버를 사용하여 TTL = max (60s, server_reported_ttl), 즉 최소 60 초를 사용할 계획입니다. 이론적 근거는 캐시 성능을 향상시키는 것입니다. CDN NS가 TTL = 10-20을 제공하고 모든 하위 리소스를 가져 오는 데 30 초 이상 걸리는 경우 종종 한 페이지로드 동안 동일한 호스트 이름을 다시 쿼리해야합니다.

티켓은 2013 년 10 월 10 일에 다음과 같이 마감되었습니다.

CrOS의 Chrome은 TTL = max (60s,> server_reported_ttl)를 준수하는 비동기 DNS 확인자를 사용합니다.

나는 이것을 WontFix (폐기 된 / 의도 된대로 작동)로 닫습니다.

이것은 수년간 알려진 문제였습니다. 내부 DNS 확인자는 DNS 레코드의 TTL을 무시하고 1 분 동안 DNS 요청 만 캐시합니다.

사용자는 몇 년 동안 기본 동작을 변경하는 기능을 요청 해 왔으며 Google은이를 만들지 않았습니다.

과거 chrome://flags에는에서 기능적으로 더 이상 노출되지 않는 내부 DNS 확인자를 비활성화 할 수있었습니다 .

요약하자면, 기능입니다. 예를 들어 의도적으로 기능입니다.

(처음에는 절대로 변경 될 수 없다고 썼습니다. 사실은 아닙니다. 정말로 결정된 사람은 Chromium을 다시 컴파일하거나 Chrome 바이너리를 해킹 할 수 있습니다.).

그래서, adenda과 같이 많은이 문서화 된 증거 구글 엔지니어가 크롬 / IUM에서받은 DNS 응답의 기본 TTL을 존중하려고하지 않습니다.

에서 DNS 쿼리의 네거티브 캐싱 (DNS NCACHE)

긍정적 인 응답을 캐싱하는 것처럼 리졸버가 부정적인 응답을 캐시하는 시간을 제한하는 것이 합리적입니다 ...

리졸버가 DNS 응답 캐싱에 최대 한도를 부과 할 수 있음을 암시하지만 Chrome의 1 분 한도는 너무 낮을 수 있습니다.

추신 : 나는 실제로이 질문에 대답하기 위해 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
흥미롭게도 크롬은 일부 도메인, 예를 들어이 도메인의 TTL을 기반으로 DNS 조회를 캐싱 dougblack.io하므로 전체 규칙이 조금 더 복잡 할 수 있습니다. 그러나 100 개의 도메인 중 99 개가 설명한대로 작동합니다.
the_velour_fog

2
Chrome은 임의의 모양의 DNS 요청을 작성하여 일부 유료 무선 액세스 포인트와 같은 모든 DNS 요청을 가로채는 네트워크에 있는지 확인합니다. 또한 구성에서보고있는 "timeout"값은 1 분의 TTL이 아니라 DNS 서버가 응답하는 1 초의 시간 초과라고 생각합니다.
duskwuff

5
크롬이 dns 캐시를 전혀 사용하지 않는 것은 슬픈 일입니다. 내 NS에서 빠른 변경을 수행하고 dns 캐시를 플러시 할 때마다 크롬은 자체적으로도 수행한다는 점을 항상 명심해야합니다.
Ole K

1
@OleK : 예, Chrome에 자체 DNS 캐시가 있는지도 몰랐습니다. 이것을 지적 해 주셔서 감사합니다.
Mehrdad

2
@OleK-나는 동의하지만, 동시에 짧은 곳 (예 : 60 초 정도)을 볼 수 있습니다 :), 캐시는 좋은 생각입니다 (약간의 네트워크 트래픽을 절약하기 위해). dns 등 작동
Ivanivan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.