你刚改完 /etc/hosts 文件,或者换了新DNS服务器,网页却还是打不开、域名解析不对?别急着重启系统,Linux 本身不自带“一键清DNS”按钮,但不同发行版用的DNS服务不同,清理方式也得对症下药。
先看你的系统用的是哪个DNS服务
打开终端,输入下面命令:
systemctl list-units | grep -i dns
常见结果有:systemd-resolved(Ubuntu 17.10+、Debian 10+、Fedora 默认)、dnsmasq(部分老版本Ubuntu或路由器级Linux)、或者干脆没运行任何本地DNS服务(直接走路由器或ISP DNS)。
情况一:用 systemd-resolved(最常见)
这是目前主流桌面版 Linux 的默认DNS管理器。刷新缓存只需一条命令:
sudo systemd-resolve --flush-caches
或者(新版 systemd 推荐写法):
sudo resolvectl flush-caches
验证是否清干净了?可以查一下当前缓存状态:
resolvectl statistics
看到 “Cache hits” 归零或明显下降,基本就OK了。
情况二:用了 dnsmasq
比如某些定制版系统或公司内网环境。重启服务即可刷新缓存:
sudo systemctl restart dnsmasq
如果提示服务未启用,说明你没装或没开它,跳过这步。
情况三:压根没本地DNS服务(直连上游)
比如你只是改了 /etc/resolv.conf,把 nameserver 换成 114.114.114.114 或 8.8.8.8,那其实没有“本地缓存”可刷——每次请求都实时发给上游DNS。但浏览器或应用自己可能有缓存,这时需要:
- 关掉再重开浏览器(Chrome/Firefox 都会缓存DNS几秒到几分钟)
- 终端里用
ping -c 1 example.com或dig example.com测试真实解析结果,绕过应用层缓存
顺手检查 hosts 是否生效
改了 /etc/hosts 却不生效?除了DNS缓存,还要确认:systemd-resolved 默认是读取 hosts 的,但如果你手动改过 /etc/nsswitch.conf,请确保这一行是:
hosts: files resolve [!UNAVAIL=return] dns
其中 files 就代表优先查 /etc/hosts。不是的话,用 sudo nano /etc/nsswitch.conf 改回来保存即可。
小技巧:快速测试DNS是否刷新成功
别光等网页加载,用这条命令最直接:
getent ahostsv4 www.baidu.com
它会绕过所有缓存,强制走当前配置的DNS链路,返回真实IP。对比改之前和之后的结果,一目了然。