使用 Tshark 排除 DNS 查询故障

WiresharkWiresharkBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本次实验中,你将通过实践练习学习使用 Wireshark 的 Tshark 工具来排查 DNS 查询问题。你将使用“udp port 53”过滤器捕获 DNS 流量,使用“dns.qry.name”等显示过滤器分析查询,并使用“dns,tree”选项检查计时统计信息。

本实验将指导你掌握实用技巧,包括隔离 DNS 数据包、可视化查询时间,以及使用“-V”标志提取详细的数据包信息。通过完成这些练习,你将掌握使用专业数据包分析方法诊断 DNS 问题的关键技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL wireshark(("Wireshark")) -.-> wireshark/WiresharkGroup(["Wireshark"]) wireshark/WiresharkGroup -.-> wireshark/interface("Interface Overview") wireshark/WiresharkGroup -.-> wireshark/packet_capture("Packet Capture") wireshark/WiresharkGroup -.-> wireshark/display_filters("Display Filters") wireshark/WiresharkGroup -.-> wireshark/capture_filters("Capture Filters") wireshark/WiresharkGroup -.-> wireshark/packet_analysis("Packet Analysis") wireshark/WiresharkGroup -.-> wireshark/commandline_usage("Command Line Usage") subgraph Lab Skills wireshark/interface -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} wireshark/packet_capture -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} wireshark/display_filters -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} wireshark/capture_filters -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} wireshark/packet_analysis -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} wireshark/commandline_usage -.-> lab-548938{{"使用 Tshark 排除 DNS 查询故障"}} end

使用 -f "udp port 53" 捕获 DNS 流量

在这一步中,你将学习如何使用 Wireshark 的捕获过滤器来捕获 DNS 流量。DNS(域名系统)就像是互联网的电话簿,它将人类可读的域名(如 example.com)转换为机器可读的 IP 地址。大多数 DNS 查询使用 UDP 端口 53,因为这些查询数据量小且速度快,而较大的响应可能会使用 TCP。

  1. 首先,如果你还没有打开 LabEx 虚拟机中的终端,请打开它。所有命令都将在默认工作目录 ~/project 中执行。我们将把捕获的文件保存到这个目录。

  2. 在终端中使用以下命令启动 Wireshark:

wireshark &

& 符号会让 Wireshark 在后台运行,这样你就可以在 Wireshark 保持打开的同时继续使用终端。当你在进行网络分析时需要运行其他命令,这种方式很有用。

  1. 在 Wireshark 的主界面中:

    • 选择你当前活动的网络接口(通常是 eth1)。这会告诉 Wireshark 要监控哪个网络连接。
    • 在捕获过滤器字段中输入:udp port 53。这个过滤器可以确保 Wireshark 只捕获 DNS 流量,减少其他网络活动带来的干扰。
    • 点击鲨鱼鳍图标开始捕获数据包。你会看到界面开始显示网络活动。
  2. 为了生成一些用于测试的 DNS 流量,打开另一个终端并运行:

nslookup example.com

这个命令会让你的系统查询“example.com”的 IP 地址,从而产生我们想要捕获的 DNS 流量。你可以把它想象成打一个测试电话,看看我们的监控是否正常工作。

  1. 在 Wireshark 中,你现在应该能看到捕获到的 DNS 数据包。这些数据包会在主窗口中以行的形式显示,通常会显示查询和响应信息。当你看到足够的流量后,点击红色方块按钮停止捕获。

  2. 保存捕获的文件以便后续分析:

    • 选择“文件” → “另存为”。
    • 将文件保存为 dns_capture.pcapng,保存路径为 ~/project 目录。这种文件格式可以保留所有原始数据包数据,以便进行详细检查。

需要理解的关键点:

  • -f "udp port 53" 是一个捕获过滤器,它只记录 DNS 流量,就像设置了一个专门的麦克风,只监听 DNS 对话。
  • DNS 主要使用 UDP 端口 53,因为它对于小查询来说效率很高,而 TCP(传输控制协议)则用于需要可靠传输的较大响应。
  • 捕获的文件包含原始形式的网络数据包,我们将在后续步骤中对其进行分析,以确切了解 DNS 解析过程中发生了什么。

使用 -Y "dns.qry.name" 过滤查询

在这一步中,你将学习如何使用 Wireshark 的显示过滤器来过滤 DNS 查询。DNS(域名系统)就像是互联网的电话簿,它将人类可读的域名转换为机器可读的 IP 地址。在排查网络问题时,检查 DNS 流量可以揭示重要线索。

我们将重点关注 dns.qry.name 字段,该字段专门显示 DNS 查询中所请求的域名。当你需要检查与特定网站或服务相关的流量时,这在我们上一步创建的捕获文件中特别有用。

  1. 首先,让我们在 Wireshark 中打开之前保存的捕获文件。命令末尾的 & 符号会让命令在后台运行,这样你就可以继续使用终端:
wireshark ~/project/dns_capture.pcapng &
  1. 在 Wireshark 的显示过滤器栏(工具栏正下方的空白字段)中,输入以下精确过滤器,以仅查看针对“example.com”的 DNS 查询:
dns.qry.name == "example.com"

这个严格相等过滤器 (==) 将仅显示查询的域名与“example.com”完全匹配的数据包。

  1. 若要查看所有 DNS 查询,而不考虑所请求的域名,只需单独使用字段名:
dns.qry.name

这将显示所有包含 DNS 查询名称的数据包,有助于你了解网络上正在查询哪些域名。

  1. 若要更全面地查看 DNS 查询(请求)和响应,可以使用此检查 DNS 响应标志的过滤器:
dns.flags.response == 0 || dns.flags.response == 1

在这里,dns.flags.response == 0 显示查询(请求),而 dns.flags.response == 1 显示响应。

  1. 有时,你可能想查找与某个特定组织或服务相关的所有查询。可以使用“contains”运算符来过滤部分域名匹配:
dns.qry.name contains "example"

这将匹配任何包含“example”的域名,例如“example.com”、“test.example.org”或“example.net”。

需要理解的关键点:

  • -Y 是 Wireshark 的显示过滤器选项(相当于在过滤器栏中输入内容)
  • dns.qry.name 是 DNS 数据包中的一个特定字段,包含正在查询的域名
  • 显示过滤器可通过隐藏不相关的数据包,帮助你专注于特定的流量模式
  • 过滤器可以使用不同的比较运算符:
    • == 用于精确匹配
    • != 用于排除
    • contains 用于部分匹配
  • DNS 协议包含标志,用于区分查询 (response == 0) 和响应 (response == 1)

使用 -z dns,tree 分析时间

DNS(域名系统)就像是互联网的电话簿,它将人类可读的域名转换为机器可读的 IP 地址。在排查网络问题时,分析 DNS 响应时间可以揭示性能瓶颈。在这一步中,我们将使用 Wireshark 内置的统计功能和 -z dns,tree 选项来测量 DNS 服务器对查询的响应速度。

  1. 在开始之前,请确保 Wireshark 没有运行。我们将从终端分析一个预先捕获的 DNS 流量文件。命令末尾的 & 符号可让你在 Wireshark 运行时继续使用终端:
wireshark -z dns,tree ~/project/dns_capture.pcapng &
  1. 一个名为“DNS Statistics”的新窗口将打开,以树形结构显示三个主要信息:

    • 所有 DNS 查询及其对应的响应
    • 每个查询获得响应所需的时间
    • 每个域名被请求的频率
  2. 让我们仔细查看统计信息列:

    • “Count”表示你的系统查询每个域名的次数
    • “Average”显示每个域名的典型响应时间
    • “Min”和“Max”显示最佳和最差情况下的响应时间
  3. 为了在分析中看到更多有趣的数据,让我们生成新的 DNS 查询。打开一个新的终端窗口并运行以下常见的查询命令:

nslookup google.com
nslookup labex.io
  1. 运行这些命令后,返回“DNS Statistics”窗口并点击“Reload”,以使用你刚刚生成的新查询更新统计信息。

需要记住的关键概念:

  • -z dns,tree 命令可激活 Wireshark 的专业 DNS 分析模式
  • 响应时间测量有助于找出速度较慢的 DNS 服务器或网络延迟
  • 树形视图将相关查询分组在一起,便于分析
  • 在有新的 DNS 活动后,务必重新加载捕获文件以查看最新统计信息

使用 -V 显示结果

在这一步中,你将了解如何使用 Wireshark 的详细模式(-V 选项)来详细检查 DNS 数据包。在排查 DNS 问题时,查看所有协议细节对于准确了解网络流量中发生的情况至关重要。

  1. 在开始之前,请确保关闭所有打开的 Wireshark 窗口,以免造成混淆。然后执行以下命令,以显示完整的协议细节打开捕获文件:
wireshark -V -r ~/project/dns_capture.pcapng &

-V 标志指示 Wireshark 显示详细输出,展示所有可用的协议信息,而不仅仅是基本的数据包摘要。

  1. 在 Wireshark 界面中,关注中间名为“Packet Details”的面板。以下是查看 DNS 信息的方法:

    • 点击“Domain Name System”旁边的箭头将其展开。
    • 你将看到完整的 DNS 消息结构,包括:
      • 这是查询还是响应。
      • 将请求与回复配对的唯一事务 ID。
      • 指示成功或错误的状态标志。
      • 所有正在交换的资源记录。
  2. 查看 DNS 查询数据包(通常是从客户端发送到服务器)时,请特别注意:

    • 查询类型:这表明正在请求哪种类型的记录(A 表示 IPv4,AAAA 表示 IPv6,MX 表示邮件服务器)。
    • 查询类别:几乎总是“IN”,表示互联网类别。
    • 事务 ID:一个随机数,用于将此查询与其响应进行匹配。
  3. 对于 DNS 响应数据包(从服务器发送到客户端),请检查以下重要字段:

    • 响应代码:“0”表示未发生错误。
    • 答案数量:返回了多少条记录。
    • TTL 值:这些 DNS 答案可以缓存的时长。
    • 实际数据:例如查询 A 记录时的 IP 地址。
  4. 若要保存此详细分析结果,以便日后查看或与同事分享,请运行以下命令:

tshark -V -r ~/project/dns_capture.pcapng > ~/project/dns_analysis.txt

这将创建一个文本文件,其中包含捕获文件的所有详细输出。

需要记住的关键概念:

  • -V 选项可显示每个数据包的完整协议解析信息。
  • 你可以查看 DNS 协议栈的每一层。
  • 在诊断复杂的 DNS 问题时,这种详细程度是必要的。
  • 可以结合过滤器(如 dns),在查看完整细节的同时专注于特定的数据包。

总结

在本次实验中,你学习了如何使用 Wireshark 的 Tshark 工具来排查 DNS 查询问题。本练习展示了如何使用 UDP 端口 53 过滤器捕获 DNS 流量,并通过 dns.qry.name 等针对性的显示过滤器分析查询。

你练习了使用 nslookup 生成测试流量,并保存捕获文件以进行分析,从而深入了解了 DNS 协议的行为以及 Wireshark 在隔离特定域名请求方面的强大过滤功能。这些技能对于网络故障排查和与 DNS 相关的调查至关重要。