在管理和维护CentOS服务器时,网络连接的稳定性至关重要,域名系统(DNS)作为互联网的“电话簿”,负责将人类可读的域名(如www.example.com)解析为机器可读的IP地址,为了加速这一过程并减少网络请求,系统通常会使用DNS缓存,在某些情况下,如DNS记录更新后、遭遇网络钓鱼攻击或排查连接问题时,我们需要手动清除这些缓存,本文将详细介绍如何在CentOS系统中识别并删除DNS缓存,确保您能快速、准确地解决相关问题。

理解CentOS中的DNS缓存机制
与Windows或macOS不同,CentOS本身并不内置一个统一的、默认开启的DNS缓存服务,DNS缓存功能通常由第三方或系统集成的特定服务提供,清除缓存的第一步是确定您的系统上正在运行哪个DNS缓存服务,最常见的服务包括 systemd-resolved、dnsmasq 和 nscd。
识别并清除不同服务的DNS缓存
下面,我们将分步介绍如何检查和清除这三种主流服务的DNS缓存。
处理 systemd-resolved 缓存
systemd-resolved 是现代 systemd 系统中提供网络名称解析的服务,它在 CentOS 7/8/9 等较新版本中非常普遍,它不仅提供DNS缓存,还集成了对LLMNR和MulticastDNS的支持。
检查服务状态
通过以下命令确认 systemd-resolved 服务是否正在运行:
systemctl status systemd-resolved
如果输出中显示 active (running),则表明该服务正在运行。
清除DNS缓存
systemd-resolved 提供了专门的命令行工具 resolvectl 来管理其缓存,执行以下命令即可清空缓存:
sudo resolvectl flush-caches
对于一些较旧的系统版本,可能使用 systemd-resolve 命令:
sudo systemd-resolve --flush-caches
执行成功后,命令不会有任何输出,这表示操作已完成。
验证缓存是否已清除
您可以通过查看统计信息来验证缓存是否已被成功清空:
resolvectl statistics
在输出中,找到 Cache 部分,如果缓存已清除,您会看到 Current Cache Size 的值变为0(或一个非常小的数字)。

处理 dnsmasq 缓存
dnsmasq 是一个轻量级的DNS转发器和DHCP服务器,因其配置简单、资源占用小而被广泛使用,尤其是在虚拟化环境(如libvirt)或小型网络中。
检查服务状态
同样,首先检查 dnsmasq 是否在运行:
systemctl status dnsmasq
清除DNS缓存
dnsmasq 没有直接的“flush”命令,清除其缓存的标准方法是向其发送一个 SIGHUP 信号,这会促使 dnsmasq 重新读取配置文件并清空缓存。
sudo killall -HUP dnsmasq
killall 命令会向所有名为 dnsmasq 的进程发送 HUP 信号。
验证缓存是否已清除
验证 dnsmasq 缓存不像 systemd-resolved 那样直观,您可以通过查看系统日志来确认 dnsmasq 是否收到了信号并重启了,使用 journalctl:
sudo journalctl -u dnsmasq -f
在另一个终端执行 killall 命令后,您应该能在日志中看到相关的重启或清空缓存的信息。
处理 nscd 缓存
nscd (Name Service Cache Daemon) 是一个更传统的守护进程,用于缓存多种名称服务查询,包括主机(DNS)、密码和组信息。
检查服务状态
检查 nscd 服务状态:
systemctl status nscd
清除DNS缓存

nscd 提供了专门的命令行工具来管理其缓存,要清除主机(DNS)缓存,请使用以下命令:
sudo nscd -i hosts
-i 参数表示“invalidate”(使无效),hosts 是指定要清除的缓存类型,您也可以用同样的方式清除其他类型的缓存,sudo nscd -i passwd。
验证缓存是否已清除
与 dnsmasq 类似,可以通过查看日志来确认操作是否成功。
sudo journalctl -u nscd -f
执行清除命令后,日志中会记录相关信息。
DNS缓存服务快速参考表
为了方便您快速查找,下表小编总结了上述三种服务的检查和清除命令。
| 服务名称 | 检查状态命令 | 清除缓存命令 | 备注 |
|---|---|---|---|
systemd-resolved | systemctl status systemd-resolved | sudo resolvectl flush-caches | 现代CentOS系统默认或常见,提供统计信息便于验证。 |
dnsmasq | systemctl status dnsmasq | sudo killall -HUP dnsmasq | 轻量级,常用于虚拟化和小型网络,通过信号清除。 |
nscd | systemctl status nscd | sudo nscd -i hosts | 传统服务,可缓存多种服务,需指定清除类型。 |
如果以上服务均未运行
如果您检查后发现上述服务均未在运行,那么您的CentOS系统很可能没有配置系统级的DNS缓存,在这种情况下,您遇到的DNS解析问题可能源于:
- 应用程序或浏览器缓存:某些应用程序(如Firefox、Chrome)有自己的DNS缓存,尝试清除浏览器缓存或重启应用程序。
- 路由器或上游DNS服务器:您的网络路由器或互联网服务提供商(ISP)的DNS服务器可能缓存了旧记录,您可以尝试更换为公共DNS(如8.8.8.8或1.1.1.1)进行测试。
:检查本地的 /etc/hosts文件,确认没有错误的域名映射条目。
相关问答FAQs
问题1:我已经清除了系统DNS缓存,但访问某个网站时仍然解析到旧的IP地址,这是为什么?
解答: 这是一个常见问题,原因可能不止一个,清除系统缓存后,还需要考虑浏览器缓存,大多数现代浏览器为了加速访问,都会内置DNS缓存,请尝试清除浏览器数据或在隐私模式下访问,您网络中的路由器也可能缓存了DNS记录,重启路由器通常可以解决,问题可能出在上游DNS服务器上,比如您的ISP的DNS服务器还没有更新记录,您可以临时将计算机的DNS服务器设置为公共DNS(如Google的 8.8.8 或Cloudflare的 1.1.1)来验证是否是此原因。
问题2:我应该禁用CentOS上的DNS缓存功能吗?
解答: 这取决于您的具体需求,在大多数情况下,建议启用DNS缓存,它的主要优点是能够显著加快重复访问同一域名的解析速度,降低网络延迟,并减少对外部DNS服务器的请求次数,在某些特定场景下,禁用它可能更有利,在开发或测试环境中,您可能频繁修改DNS记录,并希望这些更改立即生效,此时缓存反而会成为障碍,又或者,在一个对安全性要求极高的环境中,为了防止DNS缓存中毒攻击,可能会选择禁用,对于生产服务器和日常使用,启用缓存利大于弊;对于需要即时DNS更新或特殊安全策略的环境,可以考虑禁用,您可以通过停止并禁用相应的服务(如 sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved)来关闭缓存功能。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复