Linux无统一清DNS缓存命令,需先确认实际运行的服务:systemd-resolved(用resolvectl flush-caches)、dnsmasq或nscd(均需重启服务),并检查/etc/resolv.conf软链及nameserver配置是否生效。

Linux 没有统一的“清除 DNS 缓存”命令,直接运行 sudo systemd-resolve --flush-caches 很可能报错或完全没效果——因为你系统根本没在跑 systemd-resolved,或者它压根没被配置为实际解析器。
先确认你到底有没有 DNS 缓存服务在运行
内核不缓 DNS,所谓“清缓存”只是清第三方服务的内存数据。不查清楚就操作,90% 是白忙活。
- 运行
systemctl is-active systemd-resolved:返回active才说明它真在工作;若为inactive或failed,resolvectl flush-caches会失败 - 看
/etc/resolv.conf软链目标:ls -l /etc/resolv.conf。只有指向/run/systemd/resolve/stub-resolv.conf(或类似路径),resolvectl刷的缓存才对curl、wget等生效 - 查 nameserver 地址:
cat /etc/resolv.conf | grep nameserver。若显示127.0.0.53,大概率是systemd-resolved;若为127.0.0.1,更可能是dnsmasq - 搜进程:
ps aux | grep -E '(dnsmasq|nscd)'。有输出且状态正常,就得按对应服务处理
systemd-resolved 清缓存必须用 resolvectl,不是 systemd-resolve
systemd-resolve 命令已在 Ubuntu 20.04+、Debian 11+、Fedora 等主流发行版中被标记为废弃,强行调用会提示 command not found 或 deprecated。
- 正确命令是:
sudo resolvectl flush-caches - 更稳妥的做法是重启服务:
sudo systemctl restart systemd-resolved(尤其当你怀疑内部状态异常时) - 验证是否真清了:
resolvectl statistics查看Cache current entries是否归零或明显下降;再跑一次resolvectl query github.com,响应时间变长说明缓存确实失效了 - 注意:
dig和nslookup不走系统解析器,它们直连/etc/resolv.conf里写的 nameserver。如果该地址是127.0.0.53,那看到“旧结果”大概率是上游 DNS 的 TTL 还没过期,不是本地没清掉
dnsmasq 和 nscd 清缓存 = 重启服务
这两个服务不提供“只清缓存不重启”的接口,缓存和进程生命周期强绑定。重启即重置,别想绕开。
-
dnsmasq:常见于桌面环境(NetworkManager 推送)、开发机或路由器。执行sudo systemctl restart dnsmasq即可 -
nscd:默认不缓 DNS,得先检查/etc/nscd.conf里enable-cache hosts yes是否开启;否则重启也白搭。仅需刷 hosts 缓存可用sudo nscd -i hosts - NetworkManager 会偷偷覆盖 DNS 配置:在 RHEL/CentOS/Fedora 或带桌面的 Ubuntu 上,清完
systemd-resolved缓存后,DHCP 更新可能立刻把旧配置又写回去。推荐组合操作:sudo systemctl restart NetworkManager && sudo resolvectl flush-caches
没缓存服务?那就别清了,等 TTL 或重启应用
运行 systemctl is-active systemd-resolved、ps aux | grep dnsmasq、ps aux | grep nscd 全为空或 inactive,说明你的系统是直连上游 DNS——没有本地缓存可清。
- 此时所谓“刷新 DNS”,本质是让应用重新发起请求。可尝试:
getent hosts example.com(走 libc 解析器,受当前 DNS 配置控制) - 浏览器、curl、wget 等多数程序不缓 DNS 结果,但会缓 host 条目(来自
/etc/hosts)。改了 hosts 后,得重启对应进程,或用getent测试 - 真正卡住的往往是上游 DNS 的 TTL。比如记录 TTL 是 300 秒,你就得等 5 分钟,或者联系上游管理员提前降 TTL
最容易被忽略的一点:即使你确认了 systemd-resolved 在运行,也执行了 resolvectl flush-caches,但如果 /etc/resolv.conf 是硬写死的(比如手动改过且没软链),那所有应用还是走那个静态 nameserver,根本不会经过 systemd-resolved。所以每次操作前,先看一眼 ls -l /etc/resolv.conf。


















