我的论坛
登录

dig 命令详解

101
  • uvim
    管理员

    你好!很高兴以资深软件工程师的身份为你解答关于 dig 命令的技术细节。

    在日常开发、运维和排查网络故障时,dig (Domain Information Groper) 是我个人最推崇的 DNS 诊断工具。相比于已被逐渐弃用的 nslookup,dig 功能更为强大、输出结构清晰且极其接近 DNS 协议的底层。

    下面我将从基础概念、常用场景、高级用法以及输出解析四个维度为你深度剖析 dig 命令。


    一、 dig 基础与输出结构

    dig 的基本语法如下:

    dig [@server] [domain] [query-type] [options]

    当你执行 dig google.com 时,输出通常分为以下几个部分:

    1. Header(头部信息):显示 dig 版本、状态(如 NOERROR 表示成功)、标志位(qr aa rd ra 等)以及查询 ID。
    2. Global Options(全局选项):默认显示的统计信息,比如使用的协议(UDP/TCP)、端口(53)等。
    3. QUESTION SECTION(查询段):你具体问了什么问题(例如:google.com. IN A)。
    4. ANSWER SECTION(应答段):权威的查询结果,这是我们最关心的(IP 地址、CNAME 等)。
    5. AUTHORITY SECTION(权威段):负责该域名的权威 DNS 服务器是谁。
    6. ADDITIONAL SECTION(附加段):提供辅助信息,比如权威 DNS 服务器对应的 IP 地址(Glue 记录)。
    7. Statistics(统计信息):耗时(Query time)、使用的 DNS 服务器、响应时间和时间戳。


    二、 开发者必备的常用场景(实战演练)

    作为软件工程师,以下场景你一定会经常用到:

    1. 查询 A 记录(获取域名对应的 IP)

    这是最基础的用法。

    dig example.com

    2. 指定特定的 DNS 服务器(排查 DNS 污染或同步延迟)

    默认情况下,dig 使用本地 /etc/resolv.conf 中的 DNS。如果你想测试 Google 的公共 DNS (8.8.8.8) 或 Cloudflare (1.1.1.1):

    dig @8.8.8.8 example.com

    场景:当用户反馈某个新部署的域名无法访问时,用此命令对比本地 DNS 和权威 DNS 的返回结果,判断是否存在缓存污染或未生效。

    3. 查询其他记录类型(MX, TXT, CNAME, NS)

    • MX 记录(邮件服务器):dig example.com MX
    • TXT 记录(常用于 SPF、DKIM 邮件认证或域名所有权验证):dig example.com TXT
    • CNAME 记录(别名解析):dig www.example.com CNAME
    • NS 记录(查看域名托管在哪个 DNS 服务商):dig example.com NS

    4. 反向 DNS 查询(PTR 记录)

    通过 IP 地址查找对应的域名:

    dig -x 8.8.8.8

    场景:在配置邮件服务器或分析服务器访问日志时,验证 IP 的反向解析是否正确。


    三、 高级用法与调优技巧

    1. 追踪完整的解析链路(+trace)

    这是我最喜欢的功能。它会从根域名服务器(.)、顶级域名服务器(如 .com)、权威 DNS 服务器一路向下递归查询,展示完整的解析路径。

    dig +trace example.com

    场景:排查 DNS 解析慢、配置错误或者死循环时,+trace 能让你一目了然地看到是哪一步出了问题。

    2. 简洁输出(+short)

    在编写 Shell 脚本时,我们通常不需要冗长的报文头和尾,只需要结果 IP。

    dig +short example.com
    # 输出: 93.184.216.34

    场景:自动化脚本、CI/CD 流程中动态获取 IP。

    3. 强制使用 TCP 协议查询(+tcp)

    默认情况下,dig 使用 UDP 协议。如果 DNS 响应包过大(超过 512 字节,或启用了 DNSSEC),UDP 可能会被截断(TC 标志位置 1)。

    dig +tcp example.com

    场景:排查由于 UDP 报文过大被防火墙拦截或截断导致的解析失败问题。

    4. 批量查询

    如果你有一个域名列表文件 domains.txt,可以通过循环结合 dig 快速批量处理:

    while read domain; do
        echo "=== $domain ==="
        dig +short $domain
    done < domains.txt

    四、 资深工程师的排查思维总结

    当你在生产环境中遇到 DNS 问题时,建议按照以下步骤使用 dig 进行排查:

    1. 第一步:使用 dig domain.com 查看本地默认 DNS 的解析结果。
    2. 第二步:使用 dig @8.8.8.8 domain.com 对比公共 DNS,排除本地网络或公司内网 DNS 缓存干扰。
    3. 第三步:使用 dig +trace domain.com,检查权威 DNS 的配置是否正确、TTL 是否合理。
    4. 第四步:检查返回的 Status。如果是 NXDOMAIN(域名不存在)、SERVFAIL(DNS 服务器故障),结合 -p 或 +tcp 进一步定位。

    希望这个解答能帮助你更好地掌握 dig 命令。如果在实际开发中遇到了具体的网络疑难杂症,欢迎随时拿出来一起讨论!

  • uvim
    管理员
    #1

    你好!作为一名资深软件工程师,在日常的系统架构、网络排查、域名配置以及 DevOps 实践中,dig(Domain Information Groper)是我工具箱里出场率最高的网络诊断工具之一。

    相比于已被逐渐淘汰的 nslookup,dig 更加灵活、强大,且输出结果更接近 DNS 服务器的真实响应。

    下面我为你准备了一份 dig 的基础到进阶教程,希望能帮你快速掌握这个神兵利器。


    1. 什么是 dig?

    dig 是一个用于查询 DNS(域名系统)名称服务器的灵活工具。它执行 DNS 查找,并显示从被查询的名称服务器返回的响应。

    基本语法:

    dig [@server] [domain] [type]
    • @server:指定要查询的具体 DNS 服务器(例如 @8.8.8.8),不填则使用本地系统默认的 DNS。
    • domain:要查询的域名(例如 google.com)。
    • type:DNS 记录类型(如 A, MX, TXT 等),不填默认查 A 记录。

    2. 核心实战场景(最常用的命令)

    场景一:最简单的查询(查 A 记录)

    获取域名的 IP 地址。

    dig example.com

    输出解读:
    你会看到很多头部信息,重点关注:
    * QUESTION SECTION:你问了什么问题(比如查询 example.com 的 A 记录)。
    * ANSWER SECTION:DNS 服务器给出的答案(IP 地址和 TTL生存时间)。
    * AUTHORITY SECTION:负责该域名的权威 DNS 服务器。
    * ADDITIONAL SECTION:附加信息(如权威服务器对应的 IP)。
    * Query time:查询耗时(毫秒),对性能排查很有用。
    * SERVER:响应这次查询的 DNS 服务器 IP。

    场景二:查询特定类型的 DNS 记录

    在软件开发中,我们经常需要查各种类型的记录:
    * CNAME(别名记录):dig example.com CNAME
    * MX(邮件交换记录):dig example.com MX
    * TXT(文本记录,常用于 SPF/DKIM 验证、SSL 证书验证):dig example.com TXT
    * NS(名称服务器记录):dig example.com NS
    * SOA(起始授权机构记录):dig example.com SOA

    如果要一次性查询所有记录,可以使用 ANY 类型:

    dig example.com ANY

    (注:很多现代 DNS 服务器出于安全考虑会忽略 ANY 请求)

    场景三:指定 DNS 服务器查询

    当怀疑本地 DNS 有缓存污染,或者想测试某个域名在特定 DNS(如 Google 的 8.8.8.8 或 Cloudflare 的 1.1.1.1)上的解析是否生效时,使用 @ 符号:

    # 使用 Google DNS 查询
    dig @8.8.8.8 example.com
    
    # 使用阿里云 DNS 查询
    dig @223.5.5.5 example.com

    场景四:反向 DNS 查询(IP 查域名)

    已知一个 IP 地址,想知道它反向解析到哪个域名:

    dig -x 93.184.216.34

    3. 极简输出模式(开发/脚本自动化神器)

    默认情况下,dig 输出的信息非常冗长,包含大量的注释和统计数据。如果你在写 Shell 脚本,或者只想快速获取结果,可以使用 +short 参数:

    dig +short example.com
    # 输出通常直接就是 IP 地址:
    # 93.184.216.34

    其他常用的控制输出的参数:
    * +noall +answer:只显示 ANSWER SECTION(去掉杂七杂八的头部和尾部)。
    * +nocomments:去掉注释行。


    4. 进阶排查技巧(高级用法)

    技巧一:追踪 DNS 解析链路(+trace)

    这是我排查“为什么我的域名解析不生效”时最常用的命令。它会从根域名服务器(Root)、顶级域名服务器(TLD,如 .com),一直追踪到权威 DNS 服务器的完整解析过程。

    dig +trace example.com

    排查价值:如果某个域名在全球某些地方无法访问,用这个命令可以精准定位是哪一级 DNS 环节出了问题。

    技巧二:强制使用 TCP 协议查询(+tcp)

    默认情况下,DNS 使用 UDP 协议。但如果 DNS 响应包过大(比如包含很多 TXT 记录或 CDN 节点信息),UDP 可能会截断。强制使用 TCP 可以模拟大包传输:

    dig +tcp example.com

    技巧三:查看 TTL 过期时间

    TTL(Time-To-Live)决定了 DNS 缓存的时间。如果你刚修改了 DNS 记录,想看看全球节点缓存刷新了没有,可以通过普通查询观察 ANSWER 节中的秒数(第二个字段)。


    5. 总结:资深工程师的 dig 口诀

    • 查IP:dig domain
    • 查所有:dig domain ANY
    • 指定DNS:dig @8.8.8.8 domain
    • 脚本用:dig +short domain
    • 查错/链路追踪:dig +trace domain

    掌握了这些,你在处理网络故障、CDN 配置、域名迁移以及 SSL 证书配置时,就有了最得力的武器。

    如果有具体的网络排查场景,欢迎随时拿出来讨论!

发表回复

登录后回复