DNS解析异常排查
约 959 字大约 3 分钟
2026-08-29
域名解析不出、解析到错误 IP、时好时坏——这类问题用 dig / nslookup 分层测试,很快就能定位是本地配置、本地 DNS 还是权威解析的问题。端口通但域名不通的场景,与测试端口连通性互为补充。
第一步:看解析结果
在服务器或本地终端执行:
# 查询域名的 A 记录
dig example.com +short
# 或使用 nslookup
nslookup example.com
# 追踪完整解析链路
dig example.comdig 输出最底部 SERVER 一行显示这次查询用的是哪台 DNS,ANSWER SECTION 是解析结果。结果为空或报 NXDOMAIN 说明域名记录不存在或被拦截;有结果但 IP 不对,进入下一步分层定位。
第二步:分层定位问题在哪一层
DNS 解析链路是:本机缓存 → 本地 DNS(resolv.conf)→ 权威 DNS。逐层对比结果,就能锁定故障层:
# 1. 直接问公共 DNS(跳过本地 DNS 与缓存)
dig example.com @223.5.5.5 +short
dig example.com @8.8.8.8 +short
# 2. 查看本机正在使用的 DNS
cat /etc/resolv.conf公共 DNS 结果正确,本地结果错误
问题在本地 DNS 配置:
resolv.conf里指向的 DNS 不可用或被改动,临时修复:echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf测试恢复后,做永久化处理(见下文"resolv.conf 被自动重置")。
公共 DNS 结果也错误 / NXDOMAIN
问题在权威解析(域名解析记录本身):
- 登录域名解析控制台,核对 A 记录 / CNAME 是否配置正确、是否被误删。
- 域名是否到期未续费——到期域名会被暂停解析。
- 记录正确却始终查不到,用
dig example.com NS检查 NS 服务器指向是否与解析平台一致。
时好时坏、部分人正常部分人异常
多为缓存未同步:
- 修改解析记录后,全球缓存按 TTL 时间逐步刷新,等满一个 TTL 周期再判断(默认常为 600 秒)。
- 检查解析平台上是否残留了多条不一致的记录(同主机名同时存在 A 和 CNAME、或多条指向不同 IP 的 A 记录)。
- 本地验证时清掉系统缓存:Windows 执行
ipconfig /flushdns,Linux 重启nscd/systemd-resolved。
resolv.conf 被自动重置
手动改好的 /etc/resolv.conf 重启或换网后又变回去——这是 NetworkManager 或 cloud-init 等网络管理服务自动覆写的。两种永久化方案:
方案一:锁定文件(简单直接)
# 改好 resolv.conf 后锁定,禁止自动覆写
sudo chattr +i /etc/resolv.conf需要再修改时用 chattr -i 解锁。锁定前确认该服务器不会自动切换网络环境,否则新的 DNS 信息将无法写入。
方案二:改上游配置(推荐长期使用)
- Debian/Ubuntu:编辑
/etc/systemd/resolved.conf,设置DNS=223.5.5.5 119.29.29.29,然后sudo systemctl restart systemd-resolved。 - CentOS/RHEL:编辑网卡配置(如
/etc/sysconfig/network-scripts/ifcfg-eth0)追加PEERDNS=no,阻止其覆写 resolv.conf。
相关的 IP 地址、网关配置方法见Linux服务器手动修改IP。
快速验证技巧
用 hosts 临时绕过 DNS
解析迟迟不生效、又急着验证服务时,把域名与正确 IP 写进本机 hosts 临时顶上:
- Linux:
/etc/hosts追加一行1.2.3.4 example.com - Windows:
C:\Windows\System32\drivers\etc\hosts
验证通过后记得删掉,避免域名以后改了 IP 本机却不跟着更新。
- 怀疑解析请求被劫持或丢弃:抓包看 53 端口的请求与应答,参见tcpdump抓包入门。
- 域名解析正常、部分用户访问被阻断,多为境内访问未备案域名的拦截,参见ICP备案说明。
- 跨运营商访问异常与解析无关,参见跨运营商网络互联说明指南。
