downuuship

systemd-resolved 与本地 hosts 的优先级问题

2026-09-15

在 /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 看它到底读了哪个文件。