Linux系统修改DNS解析后仍访问旧IP,是因本地缓存未更新;需先用sudo lsof -i :53确认缓存服务类型(systemd-resolved/dnsmasq/nscd),再执行对应清缓存命令:resolvectl flush-caches、pkill -HUP dnsmasq或systemctl restart nscd。

当你修改了域名解析记录或更换了服务器IP,却发现Linux系统仍解析到旧地址,说明本地DNS缓存未更新,需要手动强制清空。
确认当前使用的DNS解析服务
Linux没有统一的DNS缓存机制,不同发行版和配置下可能由systemd-resolved、dnsmasq、nscd或glibc直接管理。先查清你用的是哪一个:
运行 sudo lsof -i :53,观察监听端口53的服务进程名;若输出含 systemd-resolved,则使用systemd解析器;若含 dnsmasq,则用dnsmasq;若查无结果但系统装有nscd,再运行 systemctl is-active nscd 确认其状态。
【必须确认服务类型后再执行对应命令,误用命令可能无效甚至干扰网络】
刷新 systemd-resolved 缓存(Ubuntu 17.04+、Debian 10+、Fedora、Arch等主流新版本)
方法一:使用 resolvectl(推荐,systemd-resolved 的现代接口)
sudo resolvectl flush-caches
方法二:使用已弃用但仍兼容的 systemd-resolve 命令
sudo systemd-resolve --flush-caches
验证是否生效:运行 sudo resolvectl statistics,查看“Cache”区块下的“Current cache size”是否归零或明显减小。
刷新 dnsmasq 缓存(常见于Ubuntu 14.04–16.04、树莓派Raspbian、部分路由器固件)
第一步:向 dnsmasq 进程发送 SIGHUP 信号,触发缓存重载
sudo pkill -HUP dnsmasq
第二步:若上一步报错“no process found”,说明 dnsmasq 未在运行,改用重启服务方式
sudo systemctl restart dnsmasq
注意:某些桌面版Ubuntu通过NetworkManager托管dnsmasq,此时应重启NetworkManager而非dnsmasq本身:sudo systemctl restart NetworkManager
刷新 nscd 缓存(企业级CentOS/RHEL、部分老版Debian,需手动安装启用)
方法1:重启服务(最彻底)
sudo systemctl restart nscd
方法2:仅刷新hosts缓存(不中断服务)
sudo nscd -i hosts
该命令只清空主机名→IP映射缓存,不影响用户/组等其他缓存项,适合生产环境谨慎操作。
无本地缓存服务时的替代方案
很多轻量发行版(如Alpine、minimal CentOS)默认不启用任何DNS缓存服务,此时glibc仅做极短时间(通常
可强制绕过缓存:临时指定DNS服务器查询,例如
dig @8.8.8.8 example.com 或 nslookup example.com 1.1.1.1
这不会“刷新缓存”,但能立即获得权威DNS返回的真实结果,用于诊断是否为缓存导致的问题。











