linux系统无内置dns缓存,需确认systemd-resolved、dnsmasq或nscd是否启用;默认systemd-resolved应使用sudo resolvectl flush-caches清缓存,而非已废弃的systemd-resolve命令。

先确认你有没有 DNS 缓存服务在跑
Linux 内核本身不带 DNS 缓存,所谓“清缓存”其实是清 systemd-resolved、dnsmasq 或 nscd 这类第三方服务的缓存。直接执行 sudo systemd-resolve --flush-caches 却没反应?大概率是服务根本没启用。
- 运行
systemctl is-active systemd-resolved—— 返回active才说明它在干活 - 顺手查下
cat /etc/resolv.conf:如果 nameserver 是127.0.0.53,基本就是systemd-resolved;如果是127.0.0.1,很可能是dnsmasq - 再补一刀:
ps aux | grep -E '(dnsmasq|nscd)',看有没有残留进程
如果全都是 inactive 或空输出,那你系统压根没本地 DNS 缓存——刷新没意义,该等 TTL 过期就等,该重启浏览器就重启。
systemd-resolved 是默认主力,但命令已过时
Ubuntu 20.04+、Debian 11+、Fedora 等主流发行版默认用 systemd-resolved,但它在新版本中已弃用 systemd-resolve 命令(包括 --flush-caches),强行运行会提示 “command not found” 或 “deprecated”。
- 正确做法是:
sudo resolvectl flush-caches(注意是resolvectl,不是旧名) - 或者更稳妥:重启服务
sudo systemctl restart systemd-resolved - 验证是否生效:
resolvectl statistics看Cache current entries是否归零;再跑一次resolvectl query github.com,对比响应时间是否变长(说明没走缓存)
dnsmasq 和 nscd 清缓存就是重启服务
这两个服务不提供“清空缓存”的独立命令,缓存和进程生命周期绑定,重启即重置。
-
dnsmasq:常见于路由器、开发机或手动部署的轻量 DNS 服务,执行sudo systemctl restart dnsmasq -
nscd:老派企业环境可能还在用,专注缓存 NSS 数据(含 DNS),执行sudo systemctl restart nscd - 注意:
nscd默认不缓存 DNS,得检查配置文件/etc/nscd.conf中enable-cache hosts yes是否开启,否则重启也白搭
NetworkManager 会偷偷接管 DNS 配置
在桌面版或使用 NetworkManager 的服务器上(比如 RHEL/CentOS/Fedora),它可能把 DNS 设置推给 systemd-resolved,但自己不刷新缓存——你清了 resolved,下次 DHCP 更新又覆盖回去。
- 推荐组合操作:
sudo systemctl restart NetworkManager→sudo resolvectl flush-caches - 检查软链接是否正常:
ls -l /etc/resolv.conf应该指向/run/systemd/resolve/stub-resolv.conf或类似路径,而不是被硬写死的静态文件 - 如果
/etc/resolv.conf是普通文件且内容固定,那systemd-resolved可能被绕过了,此时清缓存无效,得改配置或切回托管模式
最常被忽略的一点:DNS 缓存不在系统里,就在你浏览器、curl、甚至某些 Go 程序自己的连接池里——服务端清完了,客户端不 reload,照样用旧记录。










