Linux dig 与 nslookup 使用技巧

7次阅读

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

Linux dig 与 nslookup 使用技巧

dignslookup 都是 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.1nslookup 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 抓包确认实际查询行为。

text=ZqhQzanResources