systemd-resolved 的角色
现代桌面与部分服务器发行版默认由 systemd-resolved 承担本地解析:它在回环地址 127.0.0.53 上提供 stub 解析服务,并把 /etc/resolv.conf 指向这个 stub。真正的上游 DNS 按网络链路分别配置,还会附带 DNSSEC 策略、搜索域与按域名分流的规则。这意味着只读 /etc/resolv.conf 已经看不出真实解析路径,必须用 resolvectl 查每个链路的实际配置与查询来源。
基本信息
| 适用平台 | Ubuntu 18.04 及以上、Debian 10 及以上、Fedora 等 |
|---|---|
| stub 地址 | 127.0.0.53,写在 /etc/resolv.conf 的 nameserver 行 |
| 常用命令 | resolvectl status、query、statistics、flush-caches |
| 日志 | journalctl -u systemd-resolved |
| 配置文件 | /etc/systemd/resolved.conf 及其 drop-in 目录 |
典型使用场景
- 改过 DNS 却不生效:确认是哪条链路在提供解析,而不是只看 resolv.conf
- 解析结果异常:用 query 看答案来自哪个链路与哪台上游
- 怀疑缓存污染:清缓存后重试,对比结果是否变化
- 按域名分流:核对特定内网域是否绑定到正确的 DNS 服务器
- 服务异常排查:看 resolved 日志中的上游超时与校验失败
状态与查询
状态与查询
resolvectl status # 每个链路的当前 DNS 与 DNSSEC 策略
resolvectl query example.com # 走 resolved 解析并显示来源链路
resolvectl query --type=MX example.com # 指定记录类型查询
resolvectl statistics # 缓存命中与未命中、失败次数
resolvectl flush-caches # 清缓存(可能需 sudo)
resolvectl dns eth0 223.5.5.5 # 临时修改某链路的 DNS
journalctl -u systemd-resolved -n 100 --no-pager # 服务日志常见现象判读
| 现象 | 含义 | 处置 |
|---|---|---|
| resolv.conf 里是 127.0.0.53 | 解析走本地 stub | 用 resolvectl 查真实上游 |
| status 里某链路 DNS 为空 | 该链路未下发 DNS | 检查 DHCP 下发或手工指定 |
| query 显示来自错误链路 | 路由与链路优先级不符 | 核对链路 metric 与域绑定 |
| statistics 失败数持续增长 | 上游不可达或超时 | 测试上游直连并看日志 |
| 清缓存后结果变化 | 此前命中陈旧缓存 | 确认上游 TTL 与本地缓存策略 |
/etc/resolv.conf 里的 127.0.0.53 是 resolved 的 stub 地址;直接 dig 这个地址,问的也是 resolved 而不是上游 DNS。
绕过 resolved 直接测上游得到「正常」,并不代表应用可用:应用仍走 stub 链路,必须用 resolvectl query 在真实路径上复现。
容器环境要另算一笔账:容器若使用宿主机的 hosts 与解析配置,问题会与宿主机一致;若容器内自带解析配置文件,则要进入容器内部执行相同的查询命令确认,别在宿主机上验完就下结论。