systemd-resolved 与本地 hosts 的优先级问题
在 /etc/hosts 里加了一条记录,ping 能通,但某个程序就是解析不到;或者反过来,hosts 里的条目被 DNS 结果覆盖了。这类问题基本都和 systemd-resolved 有关。
先看谁在处理查询
resolvectl status
cat /etc/resolv.conf
如果 /etc/resolv.conf 指向 127.0.0.53,说明查询走的是 systemd-resolved 的本地存根,而不是直接发给上游 DNS。
hosts 到底优先不优先
优先级由 /etc/nsswitch.conf 里的 hosts: 行决定,默认是:
hosts: files dns
files 在前,意味着先查 /etc/hosts。如果这一行被改成 dns files,hosts 就会被 DNS 覆盖。这是排查时第一个要确认的地方。
缓存导致的“改了没用”
systemd-resolved 有自己的缓存,默认会缓存正向和否定查询。改完 hosts 后如果查询结果没变,先清缓存:
sudo resolvectl flush-caches
验证某个名字最终解析到什么:
resolvectl query example.com
输出里会标明结果来自 /etc/hosts 还是某个 DNS 服务器。
一个容易忽略的点
有些程序不走系统解析器,自己实现 DNS 查询(比如内置了解析库的应用),这类程序会直接读 /etc/resolv.conf 或内置上游,hosts 完全不生效。排查时可以用 strace 看它到底读了哪个文件。