☰
dig命令完全指南:从DNS解析原理到实战排查技巧
2026/10/20 21:52:03 网站建设 项目流程

1. 先从最朴素的问题说起:dig到底是什么怪东西

很多刚接触网络排查的朋友都有这个困惑:明明ping能通、网页能开,为什么大家排查DNS问题的时候,非要用一个看起来有点“冷门”的命令。我第一次在服务器上敲dig的时候,也被满屏的ANSWER SECTION、AUTHORITY SECTION震住了,第一反应是“这东西到底在说什么鬼话”。

dig的全称是domain information groper,翻译过来就是域名信息挖掘机。它跟nslookup是同类工具,但输出信息更加完整、格式更清晰,尤其在排查DNS解析、验证域名记录是否生效、确认权威服务器返回内容这些场景下,dig几乎是碾压级的效率工具。如果你做网站运维、搞云服务部署、写爬虫、搭邮件服务器,或者只是偶尔被域名解析折腾到崩溃,dig都能帮你把“到底是谁在说谎”这个问题直接摊开看。

这篇文章不搞晦涩的理论,我会从安装开始,把dig最常用的查询姿势、参数含义、实践技巧和常见坑全部过一遍。你会看到一个真实的命令行场景里,dig怎么一步步帮你锁死问题根因。

2. dig的核心价值:为什么排查DNS首选它

2.1 一次查询,全链路信息全摆出来

dig跟nslookup最大的区别在于透明度。nslookup给出的信息比较“压缩”,很多底层细节被隐藏了。dig默认会把查询过程涉及的每一层信息都展示出来,包括用的是哪个DNS服务器、查询类型是什么、返回了几条A记录、每条记录的TTL是多少、哪台服务器是权威源。

我用一个生活化类比解释一下:nslookup像你去前台问“XXX在吗”,前台只回你“在”或者“不在”;dig则像你把前台的工作日志直接拿过来翻,不光看到人不在,还能看到打卡记录、休假审批单、代理签收登记。

这种全链路透明对排查疑难问题特别重要。比如你遇到“某些地方能访问,某些地方不能访问”这种经典诡异现象,用dig分别指定两个不同的DNS服务器查询,就能立刻看出是不是DNS缓存出了妖。

2.2 默认输出里的关键模块怎么读

先跑一条最基础的命令,看看默认输出长什么样:

dig example.com

输出会分成几大块,我逐个拆开说:

  • QUESTION SECTION:你问了什么。这里会显示查询的域名和类型,比如example.com. IN A,意思是你想拿这个域名的IPv4地址。
  • ANSWER SECTION:DNS服务器给你的答案。这里就是核心结果,每一行会列出域名、TTL、记录类型和记录值。
  • AUTHORITY SECTION:谁说了算。这里显示的是负责这个域名的权威DNS服务器,排查“解析不一致”的时候看这里。
  • ADDITIONAL SECTION:附加信息,通常是权威服务器的IP地址,方便客户端直接去查询。

第一次看这堆东西不用慌,重点盯ANSWER SECTION里的那几条记录就行。真正干活的时候,这些字段都非常有用,后面我会逐个演示怎么组合使用。

3. 安装与环境准备:三分钟在任意平台跑起来

3.1 Linux和macOS怎么装

dig是bind-utils工具包的一部分,不同系统的安装命令略有区别,我直接列出来:

# Debian / Ubuntu apt-get install dnsutils # CentOS / RHEL / Rocky yum install bind-utils # Fedora dnf install bind-utils # macOS(自带dig,若没有可用Homebrew补装) brew install bind

安装完成后验证一下:

dig -v

正常情况下会输出版本号信息。如果提示找不到命令,大概率是包名没对上,注意是dnsutils不是dnsutil。

3.2 Windows环境怎么凑合用

Windows默认不带dig,但有两个替代路径。一是装WSL,在Linux子系统里直接用;二是用Windows版本的dig,通常可以随某些网络工具包一起拿到。我个人建议直接用WSL,更顺手,避免在Windows命令行里折腾路径和转义问题。

3.3 安装完成后先做个健康自检

装好之后不要直接开始查域名,先跑一条查询本机DNS设置是否正常的命令:

dig +short example.com

如果返回一个IP地址,说明解析链路正常。这个步骤对刚搭建完环境的人尤其推荐,可以先把工具链跑通,后面遇到问题就知道是dig本身的问题,还是DNS配置的问题。

提示:如果在公司内网或者校园网环境,有可能会出现“能ping通但dig超时”的情况,通常是网络策略拦了53端口,先不要怀疑工具坏了。

4. 基础查询实操:从A记录到指定DNS服务器

4.1 直查A记录,看最基本的解析结果

正常情况下,查询一个域名的IPv4地址,直接执行:

dig example.com A

这里A就是记录类型。如果只想看到答案本身、不要一堆花边信息,用+short参数:

dig example.com A +short

输出就干净多了,直接给你IP地址,适合脚本里调用。

4.2 指定DNS服务器:关键时刻的排障法宝

很多时候,系统默认的DNS解析器给出的结果不一定可靠,特别是刚修改过DNS记录,全球生效需要时间,这时候指定一个公共DNS或者直接问权威DNS,就能确认记录到底有没有推上去。

dig @8.8.8.8 example.com A

@后面跟你想用的DNS服务器IP,这是dig最常用的排障姿势之一。我个人排查域名解析延迟时,习惯同时开三个终端分别查询公共DNS、本机DNS和权威DNS,三份结果一对比,问题出在哪一层立刻一目了然。

4.3 查询其他常见记录类型

除了A记录,dig还能查各种其他记录,格式都一样,把最后的类型换掉就行:

记录类型用途命令示例
AIPv4地址dig example.com A
AAAAIPv6地址dig example.com AAAA
CNAME别名记录dig www.example.com CNAME
MX邮件服务器dig example.com MX
NS域名服务器dig example.com NS
TXT文本记录(SPF、DKIM等)dig example.com TXT
SOA权威区域起始记录dig example.com SOA

这里说一个很实用的细节:查MX记录的时候,dig默认会顺带查A记录,所以你可能会在ANSWER SECTION里看到多余条目,这不是bug,是dig默认的“附加查询”优化,目的是让你少跑一条命令。

4.4 批量查询多个域名

有多个域名需要同时确认状态的场景并不少见。一种办法是写个循环脚本,另一种办法是直接一次性把多个域名传给dig:

dig example.com example.org example.net A +short

dig会依次对每个域名执行查询。这种方式写脚本的时候很好用,不用在shell里写循环了。

5. 进阶玩法:dig的隐藏技能与组合拳

5.1 反向解析:从IP查域名

排查日志里的IP时,经常需要知道这个IP对应什么域名。反向解析的写法是:

dig -x 8.8.8.8

输出的PTR记录会告诉你这个IP对应的域名。做邮件服务器反查、CDN节点归属判断时这个很管用。

5.2 追踪完整解析路径

dig的+trace参数是我最喜欢的功能之一。它模拟了一次完整的DNS解析过程:从根域名服务器开始,依次经过顶级域名服务器、权威域名服务器,最终拿到结果。整个过程会把每一跳的耗时和返回情况都展示出来。

dig +trace example.com

这个功能在排查“某域名在某些地区解析异常”时价值极高。有一次我遇到用户反馈某域名一会儿能解析一会儿不能,用+trace顺着链路看,发现某些链路节点超时,根本不是域名本身的问题,而是网络路由到某些DNS服务器时不稳定。

5.3 控制输出细节:短输出、不显示额外信息

如果你只想要答案,不想看一堆附加段,可以用:

dig example.com A +noall +answer

+noall表示全部不显示,+answer只显示答案区。这两个参数搭配起来非常灵活,比如只想看权威服务器信息,就+noall +authority;只想看SOA记录,直接+noall +authority +answer组合。这些参数在脚本里拼接时特别好用,可以做到完全定制化输出。

5.4 调整超时与重试次数

在一些网络环境不佳的服务器上,dig默认的查询超时时间可能会导致误报超时。这时可以手动控制:

dig +timeout=3 +tries=2 example.com

+timeout=3表示每次查询等待3秒,+tries=2表示最多重试2次。写自动化脚本跑定时检查任务时,这个参数能有效避免单次阻塞太久。

5.5 查看DNS服务器响应耗时

dig还有一个隐藏彩蛋:命令结束后,底部会打印查询耗时。比如:

;; Query time: 23 msec

这个数值在对比多个DNS服务器性能时很有说服力。我经常用这个数字告诉同事“换个DNS能快一半”——数据摆出来,比嘴上说一百句都有用。

5.6 查询根区信息或指定域名的全部记录

有些时候你想看一个域名当前配置了哪些类型的记录。最粗暴的方法是挨个查,dig也支持ANY类型,但很多服务器出于安全考虑已经禁用了ANY查询。更实用的做法是直接查SOA,因为SOA记录里包含了整个区域的核心参数:

dig example.com SOA

看输出的serial字段就能判断区域是否有更新。做DNS管理的时候,serial值是个重要参考指标,如果修改了记录但serial没变,说明修改可能没提交成功。

6. 实战场景一:用dig判断域名解析是否已生效

6.1 场景描述

假设你刚在域名服务商后台修改了一条A记录,从旧的1.2.3.4改成新的5.6.7.8,但在本地浏览器访问时发现还是旧IP。这个时候别着急,要用dig冷静排查。

6.2 操作步骤

第一步,直接查本机解析到的结果:

dig example.com A +short

如果返回1.2.3.4,说明本地DNS缓存还没刷新。这时可以加+norec参数,表示关闭递归查询,直接看权威服务器的结果:

dig example.com A +norec @你的权威DNS

这里的权威DNS就是你域名NS记录里指定的那台服务器。如果权威服务器返回的是新的5.6.7.8,说明域名解析改动本身已经生效,只是本地缓存没刷干净。如果权威服务器也返回旧地址,那问题就出在域名服务商那边,可能需要检查提交是否成功。

6.3 重要提示

排查这类问题时,切记不要把本机结果和权威结果混为一谈。很多人在本地执行dig看到旧IP就断定“记录没改成功”,实际上记录早已推到权威,只是本地宽带有自己的缓存。用+norec直查权威,才是对症下药。

7. 实战场景二:用脚本批量检查多个域名解析状态

7.1 场景描述

我维护过几个服务,每个服务会动态分配新的集群节点,需要确认所有域名A记录是否都指向了最新节点IP。手工一条条dig太慢,写个简单的shell脚本就能搞定。

7.2 脚本示例

#!/bin/bash domains=("a.example.com" "b.example.org" "c.example.net") expected_ip="10.20.30.40" for domain in "${domains[@]}"; do resolved_ip=$(dig "$domain" A +short | head -n 1) if [ "$resolved_ip" == "$expected_ip" ]; then echo "$domain -> OK ($resolved_ip)" else echo "$domain -> MISMATCH (got $resolved_ip, expect $expected_ip)" fi done

这个脚本的逻辑很直白:遍历域名列表,取出第一条A记录和期望IP对比,然后输出结果。head -n 1是为了防止多个IP造成干扰。

7.3 脚本进阶优化

如果要检查的域名很多,每次都调用一次dig进程会比较慢。可以改用-f参数从文件读取域名列表,一次启动dig进程批量查询:

dig -f /path/to/domains.txt A +short

domains.txt里每行一个域名,执行后dig会依次查询并输出所有结果。实测下来,批量查询的场景下这种方式比循环快不少,尤其是在域名单特别长的时候。

7.4 关于输出的注意事项

使用-f批量查询有个小坑:输出结果会混在一起,没有明确的分隔线。建议每行加个注释域名,或者在脚本里自己解析标记。更省事的做法还是写循环,虽然稍微慢一点,但可读性好,适合任务量不大、逻辑不复杂的场景。

8. 常见问题与排查思路速查

现象可能原因排查方式
dig查询超时网络不通、53端口被封用telnet测端口连通性
返回结果始终是旧IP本地或递归DNS缓存指定权威DNS查询确认
+short无输出域名不存在或记录类型不对去掉+short查看完整输出
提示dig: command not found工具包未安装回头检查安装步骤
查询所有域名都慢本机DNS服务器配置异常换公共DNS测试
不同网络解析结果不一致DNS劫持或缓存分裂+trace看完整路径

8.1 查询超时第一反应别乱

很多人遇到dig超时就直接断定“网络有问题”,实际排查时应该分步确认。先ping一下DNS服务器的IP,能通说明网络层没问题;再试一下telnet DNS服务器 53,能通说明TCP端口正常。如果ping通但telnet不通,通常是防火墙策略的问题。

8.2 结果不对别急着怀疑DNS配置

有一次我遇到一个很隐蔽的坑:dig查TXT记录返回的内容跟我配置的不一致,折腾了半天才发现是CDN服务商在边缘节点缓存了TXT记录。所以,遇到解析结果和你预想不一样时,不要只盯着域名配置本身,还要考虑中间层的缓存策略。

8.3 TTL的坑

TTL就是一条解析记录在缓存里的存活时间。修改DNS记录后,旧的记录不会立刻消失,而是要等TTL倒计时结束。这个经常被忽略。我自己的习惯是:在改动前先把TTL临时调低到300秒,确认生效后再把TTL改回正常值。这样可以在几分钟内完成切换,而不是等几小时甚至一天。

9. 我的一些实操心得

dig这个工具上手不难,真正的分水岭在于“用它的参数去匹配具体场景”。我见过很多人在排查DNS问题时只会dig 域名,遇到问题一片迷茫;而熟练的人会组合+trace、+norec、@指定服务器、+noall +answer这些参数,三两下就把问题范围缩到最小。

还有一个建议:养成看TTL的习惯。返回结果里的TTL数值不仅告诉你缓存还剩多久,也暗示了当前解析结果的“新鲜度”。如果做DNS切换操作,TTL就是你最需要关注的时间窗口。

另外,写脚本时一定要记得加超时参数,避免个别域名解析卡住导致整批任务阻塞。这个坑我踩过不止一次,有一次凌晨跑批处理任务,就因为某条域名解析迟迟不返回,整个任务队列堵了半天。后来所有涉及DNS查询的脚本我都默认加+timeout=5,再没出过这类问题。

最后想说的是,dig并不神秘,搞懂它的核心逻辑之后,你会习惯性地在排查网络问题时第一个掏出它来。高效排查的习惯,往往就是从一条看似平淡无奇的dig命令开始的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询