在SUSE Linux系统中,无论是SUSE Linux Enterprise Server(SLES)还是openSUSE发行版,域名系统(DNS)的解析效率对于网络应用的响应速度至关重要,系统通常会缓存DNS查询结果以减少重复请求带来的延迟,当DNS记录发生变更(如网站迁移服务器、负载均衡调整)或遇到网络连接异常时,这些缓存的旧记录反而会成为问题的根源,掌握如何正确地刷新DNS缓存,是系统管理员和高级用户必备的技能,本文将详细阐述在SUSE系统中识别和刷新DNS缓存的多种方法,并提供故障排除的思路。

识别当前使用的DNS解析服务
在SUSE系统上,刷新DNS缓存的第一步是确定系统正在使用哪个服务来处理DNS解析,不同的服务有着不同的管理命令和缓存机制,最常见的服务包括systemd-resolved、dnsmasq,或者直接由glibc库通过/etc/resolv.conf文件进行解析(无本地缓存)。
检查 systemd-resolved
systemd-resolved是现代Linux发行版中广泛集成的系统服务,它提供网络名称解析,并包含一个本地DNS缓存存根,可以通过以下命令检查其状态:
systemctl status systemd-resolved
如果输出显示active (running),则表明您的系统正在使用systemd-resolved。
检查 dnsmasq
dnsmasq是一个轻量级的网络基础设施服务器,常用于提供DNS缓存和DHCP服务,尤其在小型网络或虚拟化环境中很受欢迎,检查其状态:
systemctl status dnsmasq
同样,如果显示为active (running),则dnsmasq正在管理DNS请求和缓存。
无专用缓存服务
如果以上两个服务都未运行,那么系统很可能没有本地DNS缓存守护进程,应用程序(如浏览器、SSH客户端)会直接读取/etc/resolv.conf文件中定义的DNS服务器地址进行查询,任何缓存都是短暂且存在于应用程序内部的。
针对不同服务的DNS缓存刷新方法
确定了DNS解析服务后,就可以采用对应的命令来刷新缓存。
刷新 systemd-resolved 缓存
如果系统使用systemd-resolved,刷新缓存非常简单直接。systemd-resolved提供了一个专门的管理工具systemd-resolve。

执行以下命令,需要sudo权限,以清空其内存中的所有DNS缓存记录:
sudo systemd-resolve --flush-caches
执行后,该命令不会有任何输出,但缓存已经被清空。
为了验证缓存是否已被成功刷新,可以使用--statistics参数查看缓存统计信息,在刷新前后执行此命令,可以观察到Cache区域的Current Cache Size值会变为0,然后随着新的DNS查询逐渐增长。
sudo systemd-resolve --statistics
刷新 dnsmasq 缓存
对于dnsmasq服务,刷新缓存通常通过重启服务来实现,重启会强制dnsmasq清空其内存中的所有缓存条目,并重新读取其配置文件。
sudo systemctl restart dnsmasq
这是一种“硬”刷新方式,非常有效,也可以通过向dnsmasq进程发送HUP(Hang Up)信号来实现。HUP信号通常会让守护进程重新加载配置并清空缓存,这是一种更“温和”的方式,无需完全重启服务。
sudo kill -HUP $(cat /var/run/dnsmasq/dnsmasq.pid)
注意:dnsmasq.pid文件的具体路径可能因配置而异,可以使用ps aux | grep dnsmasq命令确认进程ID(PID)。
无缓存服务的情况
如果系统没有运行systemd-resolved或dnsmasq,那么理论上不存在一个需要手动刷新的“系统级”DNS缓存,如果遇到DNS解析问题,通常是以下原因:
- 应用程序缓存:某些应用程序(如Web浏览器、Java虚拟机)拥有自己的DNS缓存,最直接的解决方法是重启该应用程序。
- 上游DNS服务器问题:问题可能出在
/etc/resolv.conf中指定的DNS服务器上,而非本地系统。
在这种情况下,可以尝试重启网络服务或网络管理器(如NetworkManager或Wicked),这会促使系统重新获取网络配置,有时也能间接解决一些临时性的解析问题。
sudo systemctl restart NetworkManager # 或者在SLES上 sudo systemctl restart wicked
高级场景与故障排除
有时,即使执行了正确的刷新命令,问题依旧存在,这时需要进行更深入的排查。
systemd-resolved 与 /etc/resolv.conf 的冲突
systemd-resolved默认会管理/etc/resolv.conf文件,将其替换为一个指向其自身存根(stub)的符号链接(/run/systemd/resolve/stub-resolv.conf),这可能导致某些应用无法正确解析,你可以检查这个链接:

ls -l /etc/resolv.conf
如果它指向stub-resolv.conf,但你想让系统直接使用systemd-resolved从网络获取的DNS服务器地址(通常在/run/systemd/resolve/resolv.conf中),可以手动替换这个链接:
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
验证上游DNS记录
当本地缓存刷新后,若问题依旧,应直接查询上游DNS服务器,确认记录是否已在全球生效,可以使用dig或nslookup工具,并指定一个公共DNS服务器(如Google的8.8.8)进行查询:
dig @8.8.8.8 example.com
如果此命令返回的IP仍是旧地址,说明问题在于DNS记录的全球传播尚未完成,需要等待,如果返回的是新地址,但本地应用仍解析到旧地址,那么问题很可能出在应用程序自身的缓存上。
DNS缓存刷新方法小编总结
为了方便快速查阅,下表小编总结了不同情况下的刷新策略:
| DNS服务 | 检查状态命令 | 刷新命令 | 备注 |
|---|---|---|---|
systemd-resolved |
systemctl status systemd-resolved |
sudo systemd-resolve --flush-caches |
现代SUSE版本默认使用,可通过--statistics验证。 |
dnsmasq |
systemctl status dnsmasq |
sudo systemctl restart dnsmasq |
重启服务是最可靠的方法。 |
| 无专用服务 | 服务均未运行 | 重启相关应用或网络服务 | 系统无持久缓存,问题多在应用层或上游DNS。 |
相关问答FAQs
问题1:刷新DNS缓存会对系统性能产生影响吗?
解答: 会有短暂且轻微的影响,刷新DNS缓存后,系统在接下来的一段时间内进行域名查询时,由于本地缓存为空,必须向上游DNS服务器发起请求,这会比直接从缓存读取多花费几十到几百毫秒的时间,随着查询的进行,缓存会迅速重新建立,系统性能很快会恢复正常,相比之下,确保DNS解析的准确性和及时性,这种短暂的性能抖动是完全值得的,尤其是在处理服务器变更或故障排查时。
问题2:为什么我执行了刷新命令,但nslookup或dig命令返回的仍然是旧的IP地址?
解答: 这种情况可能由以下几个原因造成:
- 应用级缓存:您使用的
nslookup或dig工具本身可能存在缓存机制(尽管大多数不会),或者您正在测试的Web浏览器等应用有独立的DNS缓存,请尝试在全新的终端窗口中执行命令,或者直接重启目标应用程序。 /etc/hosts文件覆盖:请检查/etc/hosts文件,确认没有为该域名手动配置了静态的IP地址映射。/etc/hosts文件的优先级高于DNS查询。- 上游DNS未更新:您刷新的只是本地缓存,如果权威DNS服务器上的记录尚未更新,或者您所使用的上游DNS服务器(如公司内部DNS、运营商DNS)尚未同步到最新记录,那么任何查询都会返回旧地址,此时应使用
dig @一个公共DNS 域名来交叉验证。 - 刷新了错误的缓存:请再次确认您系统正在运行的DNS服务,您运行了
systemd-resolved的刷新命令,但系统实际是由dnsmasq在管理DNS,那么操作自然无效,务必先确认服务状态。