resolved 体系里的 DNS
systemd 发行版里,DNS 常常不是直接读配置文件,而是交给 systemd-resolved 这个本地解析服务:它接收各网卡的 DNS 配置、按域名分流规则决定向谁查询、并维护缓存。resolvectl 就是它的控制台,能看清每块网卡到底用哪台 DNS、按 resolved 的逻辑解析某个域名、以及缓存与查询统计。
基本信息
| 适用平台 | 启用 systemd-resolved 的发行版(如 Ubuntu 18.04 及以后、部分 Fedora 与 RHEL 版本) |
|---|---|
| 语法 | resolvectl {status | query | statistics | flush-caches} [域名] |
| 相关文件 | /etc/resolv.conf 常为软链,指向 stub 解析地址或 127.0.0.53 |
| 典型场景 | 排查「只有某个网卡的域名解析不了」这类分流问题 |
典型使用场景
- 确认某块网卡实际使用哪台 DNS 服务器,而不是看配置文件猜
- VPN 接入后内网域名解析不了,检查分流域与全局域配置
- 改过 DNS 后清缓存并重新验证解析结果
- 确认解析失败是缓存问题还是上游返回的问题
- 核对多网卡环境下查询走了哪条链路
常用示例
常用示例
resolvectl status # 各网卡 DNS 服务器、搜索域与分流配置
resolvectl query example.com # 按 resolved 的逻辑解析,显示来源与结果
resolvectl query --type=MX example.com # 查询指定记录类型
resolvectl statistics # 缓存命中、失败与查询次数
resolvectl flush-caches # 清空本地缓存(改 DNS 后)
systemctl status systemd-resolved # 确认解析服务本身在运行
cat /etc/resolv.conf # 核对这里指向的是不是本地 stub 地址子命令读法
| 子命令 | 作用 | 关注点 |
|---|---|---|
| status | 查看全局与各网卡的 DNS 配置 | 看每块网卡对应的服务器与分流域 |
| query | 按 resolved 逻辑解析域名 | 输出里会标明结果来源与是否命中缓存 |
| statistics | 缓存与查询统计 | 命中率突然变低往往说明上游不稳定 |
| flush-caches | 清空本地缓存 | 改 DNS 或调试缓存问题后执行 |
| dns / domain | 临时查看或设置单网卡配置 | 临时调整便于快速验证,重启后可能被覆盖 |
resolved 生效时 /etc/resolv.conf 通常是软链,手工编辑它很容易被覆盖;要给某块网卡固定 DNS,应改网卡配置或 resolved 的配置而非这个文件。
排查顺序
- 先用 status 确认目标域名该由哪块网卡、哪台 DNS 负责
- 再用 query 走一遍解析,看是失败还是返回了非预期结果
- 失败但直连上游 DNS 能通,问题多半在本机分流配置或缓存
- 直连上游也不通,继续往网络层与上游服务器方向排查
- 确认修复后用统计与再次查询复核,别只看一次成功
容器里通常没有运行这个解析服务,容器内排查直接看解析配置文件并用独立查询工具更直接。