在Ubuntu操作系统中,DNS(域名系统)缓存扮演着至关重要的角色,它将最近访问过的域名与其对应的IP地址临时存储起来,以便在后续访问时能够快速响应,减少网络延迟,当你遇到网站无法访问、显示旧版本内容或网络连接出现异常时,清除DNS缓存往往是一个有效且首要的排查步骤,本文将详细介绍在Ubuntu系统中清除DNS缓存的多种方法,并提供相关的诊断与验证技巧。

Ubuntu中的DNS缓存机制
与Windows系统不同,Ubuntu并没有一个统一的、内置的DNS缓存服务,其缓存机制通常由以下几个组件之一或多个共同负责:
- systemd-resolved:这是现代Ubuntu版本(通常是18.04及以后)默认使用的本地DNS解析器和缓存服务,它集成于
systemd套件中,功能强大且配置灵活。 - dnsmasq:一个轻量级的DNS转发器和DHCP服务器,在某些配置中,Network Manager可能会使用
dnsmasq来为本地系统提供DNS缓存功能。 - nscd (Name Service Cache Daemon):一个通用的缓存守护进程,可以缓存多种名称服务(如passwd, group, hosts等)的查询结果,包括DNS。
清除DNS缓存的第一步是确定你的系统正在使用哪项服务。
清除 systemd-resolved 缓存
对于绝大多数现代Ubuntu用户来说,systemd-resolved是正在运行的服务,你可以通过以下步骤来清除其缓存。
打开终端,执行清除命令非常简单:
sudo systemd-resolve --flush-caches
这个命令会立即清空systemd-resolved服务中的所有DNS缓存条目,系统会提示你输入管理员密码。
为了验证缓存是否已被成功清除,你可以使用以下命令查看缓存统计信息:
sudo systemd-resolve --statistics
执行后,你会看到一个统计信息列表,关注Cache部分,如果Current Cache Size显示为0,则表示缓存已被成功清空。

清除 dnsmasq 缓存
如果你的系统是通过dnsmasq来管理DNS缓存的,清除缓存的方法是重启该服务,在终端中执行:
sudo systemctl restart dnsmasq
重启服务会使其释放内存中的所有缓存数据,并在下次查询时重新获取,你可以通过systemctl status dnsmasq来检查该服务是否正在运行,以确认是否应使用此方法。
清除其他缓存服务
对于使用nscd的系统,同样可以通过重启服务来清除缓存:
sudo systemctl restart nscd
为了方便快速查阅,下表小编总结了不同服务的清除命令:
| 服务名称 | 清除命令 | 适用场景 |
|---|---|---|
| systemd-resolved | sudo systemd-resolve --flush-caches |
Ubuntu 18.04 及以后版本默认 |
| dnsmasq | sudo systemctl restart dnsmasq |
由 Network Manager 或手动安装使用 |
| nscd | sudo systemctl restart nscd |
较老系统或特定配置使用 |
超越系统缓存:更全面的清理
有时,问题可能不仅仅出在系统级的DNS缓存上,为了确保彻底解决问题,你还需要考虑以下几个层面:
- 浏览器DNS缓存:像Chrome、Firefox等现代浏览器都有自己的DNS缓存,以提高网页加载速度,清除系统缓存后,最好也清除浏览器的缓存,这通常可以在浏览器的“设置”->“隐私和安全”->“清除浏览数据”中完成。
- 路由器缓存:你的家庭或办公室路由器同样会缓存DNS记录,如果怀疑问题出在这里,最简单的办法是重启路由器。
/etc/hosts文件:检查/etc/hosts文件,这个文件可以手动强制将域名解析到指定IP,如果里面有错误或过时的条目,也会导致访问异常。
验证与诊断
清除缓存后,如何确认DNS解析是否正常?可以使用dig或nslookup这两个强大的命令行工具。
使用dig查询一个域名:

dig google.com
在返回的结果中,你可以看到查询时间、以及该域名对应的权威IP地址,多次执行此命令,如果查询时间显著降低,说明缓存正在正常工作,如果结果中的IP地址是你预期的最新地址,那么问题很可能已经解决。
你可以使用resolvectl status(在较新系统中)或systemd-resolve --status来查看当前系统正在使用的DNS服务器是哪些,这有助于进一步排查问题。
相关问答FAQs
Q1: 为什么我按照步骤清除了DNS缓存,但访问网站时问题依旧存在?
A1: 这种情况通常意味着问题并非由本地DNS缓存引起,请依次排查以下几点:清除你所用浏览器的缓存;重启你的路由器以清除其缓存;检查/etc/hosts文件是否有手动配置的错误条目;考虑可能是你网络服务提供商(ISP)的DNS服务器尚未更新,或者域名本身的DNS记录在全球范围内的传播尚未完成,这需要一些时间。
Q2: systemd-resolved 和 dnsmasq 有什么区别?我应该优先使用哪个?
A2: systemd-resolved是systemd生态系统的一部分,是现代Ubuntu发行版的默认DNS解析器,它不仅提供缓存,还负责管理/etc/resolv.conf文件,并能处理多种DNS协议。dnsmasq则是一个更轻量级、独立的工具,常被用作小网络中的DNS转发器和DHCP服务器,在Ubuntu桌面版中,Network Manager有时会启用dnsmasq作为本地缓存,通常情况下,你应该遵循系统的默认配置,对于Ubuntu 18.04+,默认就是systemd-resolved,因此优先使用其清除命令,除非你有特殊需求(例如搭建复杂的本地网络),否则无需手动安装或切换到dnsmasq。