在Unix和Linux操作系统中,“刷新DNS”这一操作与Windows系统中的ipconfig /flushdns命令有所不同,Windows系统内置了DNS客户端缓存服务,而标准的Unix/Linux内核本身并不包含一个系统级的DNS缓存器,DNS缓存功能通常由特定的服务或守护进程来提供,要“刷新”或“清空”DNS缓存,我们需要识别并管理这些正在运行的服务,本文将详细介绍在不同Unix/Linux发行版中如何管理和刷新DNS缓存。

理解Unix/Linux中的DNS缓存机制
在深入探讨具体命令之前,理解其工作原理至关重要,当您尝试访问一个域名(如www.example.com)时,系统需要通过DNS查询将其解析为IP地址,为了提高效率并减少重复的网络请求,许多Linux发行版会运行一个本地DNS缓存服务,这个服务会记录最近的查询结果,并在下次请求相同域名时直接返回缓存中的IP地址。
当网站的DNS记录发生变更(服务器迁移、更换主机提供商)时,您本地的缓存可能仍然保存着旧的、过时的IP地址,这会导致无法访问网站或被导向错误的服务器。“刷新DNS”——即清空本地缓存——就变得必要,它会强制系统重新向DNS服务器发起查询,获取最新的记录。
常见的DNS缓存服务及其刷新方法
不同的Linux发行版和桌面环境可能使用不同的DNS缓存服务,以下将介绍三种最常见的服务及其对应的刷新方法。
systemd-resolved
这是目前最主流的DNS缓存解决方案,被广泛用于现代Linux发行版,如Ubuntu(18.04 LTS及以后版本)、Debian(9及以后版本)、Fedora和CentOS等。systemd-resolved是systemd系统和服务管理器的一部分,它提供了一个本地DNS存根服务,监听在0.0.53:53地址上。
要清空systemd-resolved的DNS缓存,最直接和推荐的方法是使用resolvectl命令:
sudo resolvectl flush-caches
执行此命令后,systemd-resolved服务会立即清空其内存中的所有DNS缓存条目,在一些较旧的系统上,可能使用systemd-resolve命令,效果相同:
sudo systemd-resolve --flush-caches
另一种稍微“粗暴”但同样有效的方法是重启systemd-resolved服务本身:
sudo systemctl restart systemd-resolved
这会清空缓存并重新加载配置,通常也能解决问题。

dnsmasq
dnsmasq是一个轻量级的网络服务,提供DNS缓存和DHCP服务器功能,它在许多路由器(如使用OpenWrt或DD-WRT的系统)、小型网络环境以及一些Linux桌面环境(如旧版Linux Mint)中非常流行。
要刷新dnsmasq的缓存,您需要向其守护进程发送一个SIGHUP信号,这个信号会指示dnsmasq重新读取其配置文件并清空缓存,最简单的方法是使用killall命令:
sudo killall -HUP dnsmasq
此命令会找到所有名为dnsmasq的进程,并向它们发送HUP信号,之后,dnsmasq的缓存即被清空。
nscd (Name Service Cache Daemon)
nscd是一个更传统的守护进程,用于缓存多种名称服务查询结果,包括主机名(DNS)、用户和组信息等,它在一些企业级发行版或以CentOS/RHEL为基础的系统中较为常见。
要清空nscd中的特定缓存,可以使用其-i(invalidate,使失效)选项,要刷新DNS缓存(即主机名缓存),应使用hosts作为参数:
sudo nscd -i hosts
此命令会立即使nscd中的主机名缓存失效,从而强制后续的查询从新的源头开始。
DNS缓存服务快速参考
为了方便快速查阅,下表小编总结了上述三种主要服务的刷新命令:
| 服务名称 | 常见系统 | 刷新/清空缓存命令 |
|---|---|---|
systemd-resolved |
Ubuntu, Debian, Fedora, CentOS (现代版本) | sudo resolvectl flush-caches |
dnsmasq |
Linux Mint (旧版), 路由器, 轻量级环境 | sudo killall -HUP dnsmasq |
nscd |
CentOS/RHEL (旧版), 企业环境 | sudo nscd -i hosts |
如果系统中没有DNS缓存服务
如果您的系统没有运行上述任何一种DNS缓存服务,那么实际上就没有系统级的DNS缓存可供“刷新”,在这种情况下,应用程序(如网页浏览器)可能会自己实现DNS缓存,Chrome浏览器有自己的内部DNS缓存,要解决这类问题,您可能需要重启特定的应用程序,或者清除浏览器缓存,对于系统层面,由于没有缓存,每次DNS查询都会直接向网络中的DNS服务器发起,因此不存在缓存过时的问题。

如何验证DNS缓存是否已清空
对于使用systemd-resolved的系统,您可以在刷新缓存前后使用以下命令查看缓存统计信息,以验证操作是否成功:
resolvectl statistics
执行后,您会看到一个包含“Cache”信息的列表,在执行flush-caches命令后,再次运行此命令,您会看到“Cache Statistics”中的“Current Cache Size”变为0,或者“Hits”和“Misses”计数器被重置,这表明缓存已被成功清空。
相关问答FAQs
问题1:为什么在Linux上没有一个像Windows那样通用的ipconfig /flushdns命令?
解答: 这源于两者架构设计的根本不同,Windows操作系统将DNS客户端缓存作为其核心网络堆栈的一个内置、标准化的功能,可以提供一个统一的命令来控制它,而Linux和Unix系统遵循模块化和可定制的哲学,DNS缓存并非内核的强制性组件,而是由用户空间的多种可选服务(如systemd-resolved、dnsmasq、nscd等)提供,这种灵活性允许用户根据自己的需求选择最合适的服务,但也意味着不存在一个能适用于所有配置的单一刷新命令,用户必须先确定自己系统上正在使用的是哪个缓存服务,然后才能执行相应的操作。
问题2:我已经刷新了DNS缓存,但仍然无法访问某个网站,可能是什么原因?
解答: 刷新本地DNS缓存只是解决DNS相关问题的第一步,如果问题依旧存在,可能的原因包括:1) /etc/hosts文件:检查本地/etc/hosts文件,其中可能存在对该域名的静态IP映射,它会覆盖DNS查询结果,2) 上游DNS服务器:您使用的网络或ISP的DNS服务器可能尚未更新该域名的记录,存在传播延迟,可以尝试更换为公共DNS(如8.8.8或1.1.1)进行测试,3) 防火墙或安全软件:系统或网络中的防火墙、安全插件可能阻止了对该域名的访问,4) 浏览器缓存:浏览器自身也可能缓存了DNS信息或网页内容,尝试清除浏览器数据或使用无痕模式访问,5) 网络连接问题:最基本的原因,检查您的网络连接是否正常。