DNS缓存机制全解析:原理、影响与运维实践

发布时间:2026-08-17 16:56:24

上网的时候,我们在浏览器里输入一个域名,网页就能打开。这背后是DNS系统在起作用,它通过分布在全球的各级DNS服务器将域名翻译成可供计算机识别的IP地址。但如果每次用户访问域名,DNS系统都要把这个过程从头走一遍,就会造成极大的资源浪费,也会带来很不好的访问体验。为了解决这个问题,DNS系统引入了缓存机制。接下来,国科云将针对DNS缓存的原理、工作机制、影响和应用实践做一下简单介绍。


一、DNS缓存的基础概念

DNS缓存简单来说就是暂时存储在设备或服务器的内存中的DNS解析结果。当DNS服务器把域名解析成IP地址后,它会把这条记录保存在本地内存。下次再有用户问同一个域名时,服务器直接从缓存里把答案拿出来就行,不用再一级一级地进行全球查询。

DNS缓存的好处有两个。一个是快,从本地拿数据肯定比远程查询快得多。另一个是省资源,权威DNS服务器不用处理那么多重复请求,整体网络负载也降下来了。

缓存在互联网上几乎无处不在。从电脑上的浏览器,到操作系统,再到运营商提供的DNS服务器,每一层都可能有DNS缓存。正是这种多层缓存的存在,让域名解析能够在几十毫秒内完成。

二、DNS缓存的基本原理

1.DNS查询链路

要理解缓存怎么工作,得先知道DNS查询是怎么跑的。

一个理想的DNS解析流程是由递归查询和迭代查询两种方式构成的。


递归查询是客户端想要请求某个域名的IP时,不会自己去查询,而是把查询任务整个交给DNS服务器,DNS服务器要负责查到最终答案再返回来。你的电脑向本地DNS服务器发起的请求,通常就是递归查询。

迭代查询是DNS服务器不给最终答案,只告诉查询者“你去问下一个服务器”。递归DNS在接到客户端的委托后,首先请求根域名服务器,根域名服务器不会直接告诉域名对应的IP,而是告诉下一级的顶级域名服务器地址(如.com、.cn等);递归DNS请求顶级域名服务器,顶级域名服务器同样不知道域名对应的IP,而是告诉域名授权的权威DNS服务器地址;递归DNS服务器请求权威DNS,并从权威DNS处获得最终的解析记录。

但在实际解析场景中,由于DNS缓存的存在,整个DNS解析的过程可能会变得更加复杂。

2.缓存发生的层级和分类

DNS缓存并不是存储在某一个特定的设备中,而是分布在多个层级:

- 浏览器缓存:浏览器自己保存的解析记录,响应最快。Chrome、Edge这些浏览器都有自己的DNS缓存,通常保留几十秒到几分钟。

- 操作系统缓存:由系统的DNS服务维护。Windows有DNS Client Service,Linux有nscd或systemd-resolved。这一层缓存对所有应用程序都生效。

- 本地DNS服务器缓存:通常由网络运营商提供,也叫递归DNS或LDNS。

- 路由器缓存:部分家用路由器也会缓存DNS记录。

查询的时候从最底层(浏览器)开始,逐级往上找,哪一层有缓存就直接用,不用继续往上查。如果各级都没有缓存,就需要委托递归DNS进行全球迭代查询。

3.TTL的本质

TTL是Time To Live的缩写,翻译过来叫“生存时间”。它是每条DNS记录附带的一个数字,单位是秒。

TTL告诉缓存服务器这条记录能存多久。比如一条A记录的TTL设成3600秒,那么缓存服务器拿到这条记录后,就把它在本地保存1小时。这1小时内再有解析请求,直接返回缓存结果。1小时之后,缓存失效,再查询就得重新请求权威服务器。

TTL是权威DNS服务器设置的,随解析结果一起发给递归服务器。递归服务器原则上要遵守这个TTL。但现实中有些运营商为了减轻服务器压力,会无视权威服务器设置的TTL,强行把缓存时间延长到1天甚至更久。

三、缓存的工作机制

1.缓存命中与未命中

缓存命中是指查询的域名在缓存里找到了有效记录,可以直接用。缓存未命中是指缓存里没有要找的记录,或者记录已经过期了,需要发起新的查询。

一个典型的缓存命中场景是这样的:你第一次访问某个网站,DNS服务器查到了IP并把结果缓存下来。几分钟后你再次访问同一个网站,DNS服务器直接从缓存里把IP翻出来给你,整个过程快很多。

缓存的命中率是衡量DNS服务器性能的重要指标。正常情况下的缓存命中率应该在80%以上。

2.缓存更新策略

缓存更新主要有两种方式:被动过期和主动刷新。

被动过期是最常见的方式。缓存记录自带TTL,时间到了自动失效。失效后下次查询触发新的DNS请求,拿到最新数据。这种方式简单可靠,但问题是TTL没到之前,哪怕权威服务器上的数据已经改了,缓存里还是旧的。

主动刷新是缓存服务器在记录过期之前主动去权威服务器查一下,看看数据有没有变化。这样可以在不影响用户查询体验的情况下保持缓存数据的新鲜度。不过主动刷新会增加权威服务器的负担,不是所有DNS服务器都支持。

3.否定缓存

除了正常的解析结果,DNS还把“查不到”的结果也缓存下来,这叫否定缓存。

最常见的是NXDOMAIN,意思是“这个域名不存在”。当权威服务器返回NXDOMAIN时,递归服务器会把这个结果也缓存一段时间。缓存时长由域名SOA记录里指定的否定缓存TTL决定。


否定缓存也有它的价值——如果一个域名确实不存在,没必要每次都去权威服务器确认一遍,直接告诉用户“查不到”就行。但否定缓存也有麻烦。如果某个子域名因为配置错误返回了NXDOMAIN,递归服务器缓存了这个结果,后面即使你把记录补上了,在缓存过期之前用户还是访问不了。

四、缓存带来的影响

1.缓存污染与投毒

缓存污染是指缓存里存了错误的数据。原因可能是权威服务器被篡改,也可能是中间人攻击往解析链路里塞了假数据。

最典型的是DNS缓存投毒攻击。攻击者向递归DNS服务器发送伪造的响应包,服务器信了,把错误的IP地址缓存下来。然后所有使用这台递归服务器的用户都会被带到错误的网站。


攻击者为了延长破坏时间,通常会把伪造响应的TTL设得很长,比如86400秒(24小时)。这样一来,错误记录要在缓存里待上一整天。

防御缓存投毒主要靠DNSSEC(数字签名验证)、端口随机化这些技术手段。

2.修改解析不生效问题

这是运维人员经常碰到的问题。在权威服务器上改了域名解析,但用户访问时还是拿到旧的IP。

原因很简单:中间各层缓存还没过期。你改了权威服务器的记录,但运营商的递归DNS服务器可能还在用缓存里的旧数据。TTL设得越长,这个问题越明显。如果TTL是24小时,那改完记录后最长可能要等24小时才能让所有用户都拿到新数据。

有些运营商还会强制延长缓存时间,最长可能到48小时。这就让问题更严重了。

要解决这个问题,一个常见的做法是在计划变更之前先把TTL调低(比如从24小时调到5分钟),等旧缓存都过期了再做实际变更。

3.对宕机切换的影响

服务器宕机了需要切到备用服务器,这时候缓存就成了障碍。

假如主服务器IP是1.2.3.4,备用服务器是5.6.7.8。你在权威服务器上把A记录从1.2.3.4改成5.6.7.8。但因为各级缓存的存在,在TTL过期之前,大量用户还会被引导到已经宕机的1.2.3.4。

TTL设得越短,切换越快。但TTL设太短又会让权威服务器承受大量查询压力。这是运维中需要权衡的地方。

五、DNS缓存管理实践

1.TTL值的合理设置

TTL没有统一的标准答案,要看具体场景。

对于很少变动的记录,比如企业官网的A记录,可以设长一些,3600秒(1小时)甚至86400秒(24小时)都行。这样可以减少DNS查询次数,加快访问速度。

对于经常变动的记录,比如测试环境、灰度发布用的域名,TTL设短一点,300秒(5分钟)比较合适。

计划做域名迁移或服务器切换之前,建议提前24到48小时把TTL调低。等旧缓存都过期了再执行切换,切完再把TTL调回去。

需要留意的是,有些公共DNS服务商会限制最小TTL,低于30秒的设置可能不生效。另外,把TTL设成1秒并不能做到实时刷新,因为运营商的递归DNS可能有自己的最小缓存限制。

2.DNS缓存刷新

当发现缓存数据有问题时,可以手动刷新缓存。

(1)浏览器缓存:清空浏览历史或者在开发者工具里禁用缓存。

(2)操作系统缓存:

Windows:ipconfig /flushdns

macOS:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Linux:sudo systemd-resolve --flush-caches或sudo resolvectl flush-caches


(3)本地DNS服务器缓存:一般需要重启DNS服务,比如BIND的rndc flush命令。

(4)运营商DNS缓存:普通用户清不掉,只能等TTL自然过期。部分商业DNS服务商提供了主动刷新运营商缓存的接口。

3.通过拨测持续监测缓存

拨测是从多个地点定期发起DNS查询,检查解析结果是否正确、延迟是否正常。

拨测能帮你发现几类问题:某个地区的递归DNS返回了错误的IP(可能被污染了);某个地区的解析延迟突然变高(可能DNS服务器出问题了);权威服务器上的修改在各地生效的情况如何。

通过拨测数据,还可以计算各地递归服务器的缓存命中率。如果命中率异常偏低,说明TTL可能设得太短了。

4.DNS缓存加速

有时候需要绕过缓存直接测试权威服务器上的最新配置。一个简单有效的办法是请求一个随机生成的子域名。

比如你想测试example.com的解析,不直接查example.com,而是查abc123.example.com。因为abc123是随机的,之前没人查过,缓存里肯定没有,所以请求一定会穿透所有缓存层,直达权威服务器。

这个办法在排查缓存相关问题时很好用,能帮你确认权威服务器上的配置到底对不对。不过要注意,如果权威服务器上没有配置这个随机子域名,会返回NXDOMAIN并被缓存下来。大量随机子域名请求也可能被当作攻击。

以上就是有关DNS缓存的介绍。总而言之,DNS缓存对整个DNS解析过程的效率、精度和安全性等影响非常大,因此了解DNS缓存的工作原理、TTL设置方法、监控手段和刷新方法等,对于做好DNS解析管理工作是十分必要的。





推荐阅读:

如何排查DNS解析出错?这四步轻松搞定

DNS分层结构及DNS解析流程

DNS解析TTL值是什么?怎么设置 DNS TTL值?

常见的DNS攻击类型与应对措施盘点

DNS入门学习:DNS缓存的原理和作用

上一篇:DNS解析里的权威应答和非权威应答,到底有什么不一样?
免费试用
联系我们