dig精准可编程适合脚本排错,nslookup交互友好但输出冗长难解析;二者均默认递归查询,但dig不读search域、输出结构化,nslookup易受本地配置干扰。

dig 和 nslookup 都是 linux 下常用的 DNS 查询工具,但它们设计目标、输出格式和适用场景有明显差异。掌握两者的核心用法与典型技巧,能快速定位域名解析问题、验证 DNS 配置或调试 CDN/负载均衡策略。
dig:精准、可编程、适合脚本和排错
dig(Domain Information Groper)功能强大、输出结构清晰,默认使用 udp 查询,支持丰富选项,是运维和自动化脚本的首选。
- 查 A 记录最简写法:
dig example.com(默认查 A 记录) - 指定 DNS 服务器(绕过系统 resolv.conf):
dig @8.8.8.8 example.com A - 只显示答案部分(去噪):
dig +short example.com,适合管道处理,如dig +short www.baidu.com | head -1 - 查看完整响应链(含权威服务器和缓存状态):
dig +trace example.com,模拟递归过程,从根服务器开始逐级查询 - 查 DNSSEC 状态:
dig +dnssec example.com,配合+short可快速判断是否启用签名 - 批量查询多个域名(需配合 shell):
cat domains.txt | xargs -I{} dig +short {}
nslookup:交互式友好,适合快速手动验证
nslookup 更偏向交互式操作,历史久、兼容性好,但输出较冗长、不便于脚本解析。新版系统中已逐步被 dig 替代,但在某些嵌入式或旧环境仍常见。
- 非交互模式直接查:
nslookup example.com(默认用 /etc/resolv.conf 中的 nameserver) - 指定 DNS 服务器:
nslookup example.com 114.114.114.114 - 切换查询类型(进入交互模式后):
nslookup→ 输入set type=mx→ 再输入gmail.com - 查 NS 记录并列出所有权威服务器:
nslookup -type=ns example.com - 禁用递归查询(只问授权服务器):
nslookup -norecurse example.com 8.8.8.8
关键区别与选用建议
两者底层都发 DNS 查询包,但行为逻辑不同:
- dig 不读取 /etc/resolv.conf 的 search 域,而 nslookup 默认会追加 search 域尝试解析(可能造成误判)
- dig 默认不进行递归查询?错——它默认发送 RD=1(Recursion Desired),由上游服务器决定是否递归;nslookup 同理,但交互模式下易混淆
- dig 输出可预测、字段固定,适合 grep/awk 处理;nslookup 输出含提示文字,解析困难
- 排查本地 DNS 缓存问题时,优先用
dig @127.0.0.1或nslookup example.com 127.0.0.1直连本地 resolver - 在容器或 minimal 系统中,若只有 busybox nslookup,可用
nslookup -q=txt o-o.myaddr.l.google.com快速查出口 IP
实用组合技巧
单靠一个命令常不够,结合使用更高效:
- 对比不同 DNS 解析结果(排查污染或调度异常):
for s in 8.8.8.8 114.114.114.114 223.5.5.5; do echo "== $s =="; dig @$s example.com +short; done - 查某域名是否被劫持(比对权威 NS 返回):
先dig +short example.com NS得到权威服务器,再dig @ns1.example.com example.com A直连验证 - 检查 TTL 是否生效:
dig example.com | grep "IN[[:space:]]*A",观察第三列数值变化 - 用 nslookup 快速测 DNS 连通性:
nslookup google.com 8.8.8.8 && echo "OK" || echo "FAIL"
不复杂但容易忽略:始终注意是否用了正确的 DNS 服务器、是否受本地 hosts 或 stub resolver(如 systemd-resolved)干扰。必要时加 -p 53 指定端口,或用 tcpdump -i lo port 53 抓包确认实际查询行为。