dig更可靠、信息更全,适合排查;nslookup更轻量、交互式强,适合快速查ip或脚本简单调用;两者不互斥,但别用nslookup做权威解析判断。

直接说结论:dig 更可靠、信息更全,适合排查;nslookup 更轻量、交互式强,适合快速查 IP 或脚本里简单调用。两者不互斥,但别用 nslookup 做权威解析判断。
dig 查询 A 记录和指定 DNS 服务器时怎么写
查域名对应的 IPv4 地址,最常用的是 dig example.com A —— 注意 A 必须大写,小写会报错或返回空结果。如果想绕过系统默认 DNS,直接问某个服务器(比如 Google 的 8.8.8.8),加 @ 符号:dig example.com @8.8.8.8。这个写法必须紧挨着,不能有空格,否则会被当成两个参数,dig 会忽略后半部分。
容易踩的坑:
-
dig example.com A @8.8.8.8是错的顺序,dig只认第一个@后面的地址,其余会被丢弃 - 没装
dnsutils(Debian/Ubuntu)或bind-utils(RHEL/CentOS)时,直接报dig: command not found,不是路径问题,是根本没安装 - 用
+short选项(如dig example.com +short)能只输出 IP,但若域名有 CNAME 链,它可能只返回别名,不递归解析到底
nslookup 查 MX 或反向解析时的典型写法
nslookup 默认查 A 记录,要查邮件服务器就用 -type=mx:nslookup -type=mx example.com。注意等号不能省,也不能写成 -q=mx 或 -query=mx,老版本甚至不支持短选项,得用 nslookup -querytype=mx example.com。
反向解析(IP → 域名)直接跟 IP:nslookup 192.0.2.1,它会自动走 PTR 查询。但这里有个隐蔽陷阱:如果当前系统 /etc/resolv.conf 里配置的 DNS 服务器不支持或没配好反向域(比如没指向正确的 in-addr.arpa 授权服务器),结果就是 *** Can't find 1.2.0.192.in-addr.arpa.: Non-existent domain,不代表 IP 没 PTR,只是你问错了服务器。
实用建议:
- 想确认是否真没 PTR,换一个已知支持反查的 DNS,比如
nslookup 192.0.2.1 8.8.8.8 -
nslookup进入交互模式后输入set type=txt再输域名,能连续查不同记录,但脚本里不推荐——交互模式难捕获输出 - 某些嵌入式或最小化系统里
nslookup是 busybox 版本,不支持-type,只能查 A 记录
为什么 dig +trace 和 nslookup -debug 输出差异很大
dig +trace 从根服务器开始逐级向下查询,每跳都显示响应来源和返回的 NS 列表,能看清整个解析链路是否断裂、某级 NS 是否返回错误或超时。而 nslookup -debug(或 -d)只显示一次查询的完整包结构(包括请求头、应答头、原始字节),并不做递归追踪。
这意味着:
- 遇到“域名能 ping 通但网页打不开”,优先跑
dig +trace example.com,看卡在哪一级 NS -
nslookup -debug主要用在怀疑 DNS 报文被篡改、EDNS 支持异常或 TTL 字段异常时,普通排障几乎用不到 -
dig +trace默认用 UDP,遇到大响应(如含大量 DNSSEC 记录)可能截断,加+tcp强制走 TCP:dig +trace +tcp example.com
脚本里该选 dig 还是 nslookup 获取 IP
如果目标只是取一个干净的 IPv4 地址,dig example.com +short | head -n1 比 nslookup example.com | grep "Address:" | tail -n1 | awk '{print $2}' 更稳定。因为 nslookup 输出格式随版本浮动大:有些版本把答案放最后,有些混在中间;而 dig +short 的输出始终是纯 IP(或空),没有标点、无前缀。
但要注意:
-
dig example.com A +short和dig example.com +short效果一样,显式写A并不提升可靠性 - 如果域名只有 AAAA 记录(IPv6),
+short会输出 IPv6 地址,脚本里需额外判断是否含冒号 -
nslookup在 Windows cmd 下也能用,Linux 脚本若需跨平台,反而倾向用它,但得接受解析逻辑不如dig严谨
真正麻烦的从来不是命令怎么敲,而是当 dig @8.8.8.8 example.com 有结果,dig example.com 却超时——这时候问题大概率出在本地 /etc/resolv.conf 配置的 DNS 服务器本身不可达,或者被防火墙拦截了 UDP 53 端口,而不是工具用错了。











