如何用 nslookup / dig 排查 DNS 解析问题?
简化版
排查 DNS 就两个核心工具:nslookup(Windows/Linux 都有,简单)和 dig(Linux/Mac,输出详细,运维首选)。基本用法是 dig example.com 或 nslookup example.com,看域名能不能解析、解析出的 IP 对不对。排查思路:① 先看能否解析出 IP;② 换个 DNS 服务器对比(dig @8.8.8.8 example.com)——换了就正常说明是本地 DNS 问题;③ 指定记录类型查 A/CNAME/MX/NS;④ 用 dig +trace 从根域名逐级追踪,定位是哪一级 DNS 出问题。
详细版
nslookup(简单通用):
nslookup example.com # 查 A 记录(默认)
nslookup example.com 8.8.8.8 # 指定用 8.8.8.8 这个 DNS 服务器查
nslookup -type=MX example.com # 查指定类型(MX/CNAME/NS/TXT...)
输出里 Server 是你用的 DNS 服务器,Address / Name 是解析结果。若出现 Non-authoritative answer,表示结果来自缓存(非权威服务器直接给的)。
dig(详细,运维首选):
dig example.com # 完整解析信息
dig example.com +short # 只输出 IP,干净
dig @8.8.8.8 example.com # 指定 DNS 服务器(@ 后面跟)
dig example.com MX # 查 MX 记录
dig example.com +trace # 从根 → 顶级 → 权威,逐级追踪
dig -x 1.2.3.4 # 反向解析(IP → 域名)
dig 输出的关键区块:
| 区块 | 含义 |
|---|---|
QUESTION SECTION | 你查的是什么 |
ANSWER SECTION | 解析结果(域名 → IP,含 TTL) |
AUTHORITY SECTION | 负责该域的权威 DNS 服务器 |
status: NOERROR | 查询状态(NXDOMAIN=域名不存在) |
Query time | 本次解析耗时 |
排查套路:
dig example.com能否返回正确 IP?dig @8.8.8.8 example.com换公共 DNS 对比——结果不同说明本地 DNS 有问题(缓存/污染/配置)。dig example.com +trace逐级追踪,看断在哪一级。- 状态码
NXDOMAIN= 域名不存在;SERVFAIL= DNS 服务器出错。
完整版教学
一、DNS 排查的核心思路:解析对不对、是谁的锅
DNS 问题的表现通常是「能 ping 通 IP,但用域名访问不了」,或「域名解析到了错误的 IP」。排查 DNS,本质是回答两个问题:
- 域名能不能解析出 IP?(能不能解析)
- 解析出的 IP 对不对、是哪一级 DNS 给的?(谁的锅)
nslookup 和 dig 就是用来回答这两个问题的。前者简单人人会用,后者信息全是运维标配。掌握它俩,DNS 问题基本能定位到具体环节。
二、nslookup:快速看一眼
nslookup 最大的优点是Windows 和 Linux 都自带,随手可用:
$ nslookup example.com
Server: 192.168.1.1 ← 你正在用的 DNS 服务器
Address: 192.168.1.1#53
Non-authoritative answer: ← 结果来自缓存,非权威
Name: example.com
Address: 93.184.216.34 ← 解析出的 IP
- Server 那行告诉你「这次是问的哪个 DNS」——排查时要留意,可能你的 DNS 配置本身就有问题。
Non-authoritative answer表示这个结果是缓存给的(不是直接问权威服务器),这是正常现象。- 想指定 DNS 服务器:
nslookup example.com 8.8.8.8;想查其他记录:nslookup -type=MX example.com。
nslookup 够用来「看一眼解析结果」,但它不显示 TTL、追踪层级等细节,深入排查要上 dig。
三、dig:读懂输出的四个区块
dig 的输出信息量大,学会读四个关键区块就掌握了精髓:
;; QUESTION SECTION: ← ① 你问了什么
;example.com. IN A
;; ANSWER SECTION: ← ② 答案(最重要)
example.com. 3600 IN A 93.184.216.34
└TTL └解析出的 IP
;; AUTHORITY SECTION: ← ③ 谁对这个域名有权威
example.com. 172800 IN NS a.iana-servers.net.
;; Query time: 28 msec ← ④ 解析耗时
;; status: NOERROR ← 状态(在头部 flags 里)
- ANSWER SECTION 是核心——解析出的 IP 和它的 TTL(缓存多久)。没有 ANSWER 就是没解析出来。
- status 是关键状态码:
NOERROR(正常)、NXDOMAIN(域名根本不存在)、SERVFAIL(DNS 服务器处理失败)。 - Query time 帮你判断解析慢不慢。
- 想要干净结果加
+short,只吐 IP,最适合脚本。
四、杀手锏之一:换个 DNS 服务器对比
排查 DNS 最有效的一招是换服务器对比——用 @ 指定一个公共 DNS(如 Google 的 8.8.8.8、阿里的 223.5.5.5)再查一次:
dig example.com # 用系统默认 DNS
dig @8.8.8.8 example.com # 用公共 DNS
对比两次结果:
- 默认 DNS 解析失败/错误,但公共 DNS 正常 → 问题出在你本地/运营商的 DNS(缓存脏了、配置错、或被劫持污染)。解决办法:换 DNS、刷新本地缓存。
- 两个都解析错误 → 可能是域名本身的权威 DNS 配置有问题,或域名过期。
- 两个都正常但网站还打不开 → DNS 没问题,问题在更上层。
这一招能快速把「DNS 问题」进一步细分成「本地 DNS」还是「域名本身」,非常实用。
五、杀手锏之二:+trace 逐级追踪
dig example.com +trace 会模拟完整的递归解析过程,从根域名服务器开始,一级级往下问:根(.) → 顶级域(.com) → 权威服务器(example.com 的 NS),把每一级的应答都打印出来。
它的价值是定位「断在哪一级」:如果追踪到某一级就没有正确返回下一级的 NS,问题就锁定在那一级。比如顶级域能给出 example.com 的权威服务器、但权威服务器不返回 A 记录,就说明域名的权威 DNS 配置有问题(记录没配、或配错)。
六、本地缓存和 hosts:别忽略的两个坑
有时候 dig/nslookup 解析都正常,但浏览器/程序还是访问到错误地址,往往是本地这两层在捣乱:
- 本地 DNS 缓存:系统会缓存解析结果。记录变更后旧缓存还在,就会解析到旧 IP。清缓存:Windows
ipconfig /flushdns,Linux 视服务而定(如systemd-resolve --flush-caches)。 - hosts 文件:
/etc/hosts(Linux/Mac)、C:\Windows\System32\drivers\etc\hosts(Windows)里的静态映射优先级高于 DNS。如果 hosts 里写死了域名→IP,DNS 查得再对也没用。排查诡异解析时一定要看一眼 hosts。
注意:
dig不读 hosts 文件(它直接问 DNS 服务器),而ping、浏览器会读 hosts。所以出现「dig 解析对、但 ping/浏览器解析错」时,第一嫌疑就是 hosts 文件。这是超高频的排查陷阱。
七、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| nslookup | 简单查询域名解析结果 |
| dig | 查看记录、权威、TTL、trace 等细节 |
| host | 轻量查询域名记录 |
dig example.com A
dig +trace example.com
dig @8.8.8.8 example.com
nslookup example.com
host -t MX example.com
DNS 排障要比较“本机解析器、公共解析器、权威解析器”的结果,单看一次查询很容易误判。
- 误区:nslookup 成功就说明业务可访问。 DNS 只解决域名到记录,后续 TCP、TLS、HTTP 仍可能失败。
- 误区:不同 DNS 返回不同 IP 就一定异常。 CDN、智能 DNS 和负载均衡可能按地域、运营商返回不同地址。
- 误区:TTL 为 0 就不会被任何地方缓存。 一些中间层和客户端仍可能有最小缓存或应用内缓存。
- 追问:dig +trace 看什么? 它展示从根到 TLD 再到权威的迭代链路,适合查委派问题。
- 追问:为什么要指定 @server? 可以比较不同递归解析器或直接问权威 DNS,定位缓存污染或同步问题。
- 追问:NXDOMAIN 和 SERVFAIL 区别是什么? NXDOMAIN 表示域名不存在,SERVFAIL 表示解析过程失败。
八、加强记忆
排查 DNS 用 nslookup(简单通用) 和 dig(详细、运维首选)。看 dig 的 ANSWER SECTION(解析出的 IP + TTL) 和 status(NOERROR / NXDOMAIN 域名不存在 / SERVFAIL 服务器失败)。两大杀手锏:dig @8.8.8.8 换 DNS 对比(区分本地 DNS 还是域名本身问题)、dig +trace 从根逐级追踪(定位断在哪一级)。别忘 hosts 文件优先级高于 DNS 且 dig 不读 hosts——「dig 对但 ping/浏览器错」多半是 hosts 在捣乱,配合 ipconfig /flushdns 清缓存。