dig 是什么
dig 是排查 DNS 的首选命令行工具:它直接构造查询报文并把响应逐段展示出来,既能指定解析器,也能指定记录类型,还能强制走特定传输协议。相比只输出结果的简化命令,它把问题段、答案段与授权段都打印出来,因此既能解答「解析成什么」,也能解答「是谁回答的、为什么是这个答案」。排查解析异常时,先看清楚是哪一段给出了结果,往往比反复刷新解析器更有效。
基本信息
| 定位 | 命令行 DNS 查询工具,常见于 Unix 系系统 |
|---|---|
| 默认行为 | 向系统配置的解析器发起查询,并声明希望递归 |
| 关键能力 | 指定解析器、指定记录类型、强制传输协议、迭代查询 |
| 输出 | 包含问题段、答案段、授权段与统计信息 |
| 注意 | 不读取本地记录文件,与系统解析链路结果可能不同 |
典型使用场景
- 确认某个域名当前解析到什么地址,以及缓存时间是多少
- 指定公共解析器查询,排除本地解析器的缓存干扰
- 直接向权威服务器提问,验证配置是否已经生效
- 逐个类型检查邮件、文本、授权类记录,定位缺失的记录
- 跟踪完整委派链,判断问题出在哪一级
高频用法
高频用法
dig +short example.com A # 只输出结果,适合写脚本
dig @223.5.5.5 example.com MX +noall +answer # 指定解析器,只看答案段
dig -t TXT _dmarc.example.com +short # 按类型查询,常用于邮件相关校验
dig +tcp example.com # 强制使用连接式传输,排查响应被截断的情况
dig +norecurse @ns1.example.com example.com SOA # 直接问权威本身,不要求递归
dig +trace example.com # 从根开始逐级迭代,看清委派链常用参数
| 参数 | 作用 |
|---|---|
| 只输出结果 | 脚本友好,但看不到缓存时间与回答者 |
| 只要答案段 | 去掉问题段与统计,输出更干净 |
| 请求安全扩展 | 一并查看签名相关信息与验证标记 |
| 调整缓冲大小 | 控制单次响应能承载的报文体积 |
| 超时与重试 | 控制等待时长与尝试次数,弱网排查常用 |
| 跳过递归 | 直接向指定服务器提问,验证真实配置 |
排查要点
- 结果里没有答案段,说明该名字没有对应类型的记录,而不是查询失败
- 答案段很短且带别名,说明查询跟随了别名,需要再看一次目标域名
- 带授权段但没有答案,说明这个服务器不是该区域的权威,它在指路
- 响应被截断时改用连接式传输重试,避免拿到不完整结果
dig 不读取本地记录文件,也不走系统解析链路,因此它与系统命令的结果不一致是正常现象:系统命令会优先使用本地记录,dig 只看 DNS 里的真实记录。
迭代查询会直接向根与各级授权服务器发问,部分网络会拦截这类流量,结果为空并不代表域名有问题。迭代结果只反映你这条链路的视角,不能替代身边解析器的真实行为。
四个排查习惯
- 先看答案段有没有内容,再讨论是不是缓存问题,能省掉大量无效猜测
- 怀疑缓存时指定另一个解析器做对比,快速区分是本地影响还是全局问题
- 验证配置是否生效就直接问权威服务器,不要反复刷新本地缓存等待
- 批量查询加上超时与重试参数,避免脚本在弱网环境下长时间挂住