DNS 解析异常怎么分段排查
解析问题可以拆成三段:本机实际使用的 DNS 配置是否正确、上游 DNS 是否可达并能返回结果、以及查询结果是否被本机解析链路正确处理。实用做法是用直连查询与系统解析两条路径对照:直连 DNS 服务器查询能看到上游返回情况与耗时,用系统解析接口查询则反映应用真实走到的结果。两者结论不一致时,问题通常出在本机配置或被网络管理组件重写的配置上。
基本信息
| 本机配置 | /etc/resolv.conf 中实际生效的服务器地址 |
|---|---|
| 系统解析 | getent hosts 走完整的名称服务切换链路 |
| 直连查询 | dig @服务器 域名 指定某个 DNS 查询 |
| 解析顺序 | /etc/nsswitch.conf 中 hosts 行的顺序 |
| 覆盖风险 | 网络管理组件可能重写 resolv.conf |
典型使用场景
- 能 ping 通 IP 但 ping 不通域名,快速确认是否为解析层问题
- 解析变慢,需要区分是上游响应慢还是本机配置了无效的 DNS 地址
- 内网域名解析异常,核对 DNS 指向与搜索域设置
- 服务器变更网络配置后域名解析失效,确认配置是否被组件重写
- 应用连接外部服务失败,先排除解析问题再查网络
- 批量终端排查解析一致性,找出配置偏离基线的机器
分段验证
分段验证
cat /etc/resolv.conf # 查看实际生效的 DNS 服务器
getent hosts www.example.com # 走系统解析链路的结果
dig @<DNS服务器> www.example.com +stats # 直连指定 DNS,看返回与耗时
dig www.example.com +short # 默认链路的简短结果
grep hosts /etc/nsswitch.conf # 查看 hosts 与 dns 的顺序
ping -c1 www.example.com # 快速验证解析是否正常
cat /etc/hosts | head # 本地静态记录会优先命中
systemd-resolve --status 2>/dev/null | head # 使用解析服务时查看状态
# 网络管理组件接管时 resolv.conf 会被重写:改连接配置而非手工改文件现象与所在环节
| 现象 | 可能环节 | 验证方式 |
|---|---|---|
| IP 通域名不通 | 解析层 | dig 直连与 getent 对照 |
| 解析很慢 | 上游响应或超时叠加 | 看查询耗时与配置的服务器列表 |
| 部分域名失败 | 上游数据或转发策略 | 换服务器直连查询对比 |
| 重启后配置变化 | 配置被组件重写 | 检查管理组件的连接配置 |
| 本地记录优先 | 静态记录命中 | 查看 hosts 文件内容 |
用直连查询与系统解析两条路径同时验证,能快速判断问题在上游还是本机:直连正常而系统解析失败,问题基本在本机配置或被覆盖的设置上。
手工修改 /etc/resolv.conf 可能被网络管理组件覆盖,改动会在重启或重连后失效;应修改对应连接的配置或解析服务的配置,让改动具备持久性。