在 Tshark 中提取数据包字段

WiresharkBeginner
立即练习

介绍

在本次实验中,你将学习如何使用 Wireshark 的命令行工具 tshark 从网络流量中提取特定的数据包字段。你将练习选择常见的字段,如源 IP (ip.src) 和 TCP 端口 (tcp.port),同时掌握使用 -T fields 和自定义分隔符进行输出格式化。

这些练习将引导你完成数据包捕获、使用 -e 标志提取字段,以及将数据导出为 CSV 格式。你将学习如何组织输出,以提高可读性和便于分析,使用诸如 -E separator=, 配置分隔符和输出重定向等技术。

使用 -e ip.src -e tcp.port 选择字段

在这一步中,你将学习如何使用 Wireshark 的命令行工具 tshark 从网络数据包捕获中提取特定字段。网络数据包包含许多不同的信息片段,而在分析时,我们通常只需要查看特定的字段。在这里,我们将重点关注两个重要的字段:源 IP 地址 (ip.src),它能告诉我们数据包的来源;以及 TCP 端口号 (tcp.port),它能识别正在使用的特定服务或应用程序。

首先,我们需要一些示例网络流量来进行操作。以下命令将生成我们可以捕获的简单 Web 流量:

curl -s http://example.com > /dev/null

现在,让我们使用 tshark 来捕获这些流量。下面的命令将捕获 10 个数据包,并将它们保存到一个名为 sample.pcap 的文件中。.pcap 格式是存储网络流量捕获的标准格式:

tshark -c 10 -w sample.pcap

捕获文件准备好后,我们现在可以提取我们感兴趣的字段了。以下命令读取捕获文件,并仅输出源 IP 地址和 TCP 端口:

tshark -r sample.pcap -T fields -e ip.src -e tcp.port

让我们来详细分析一下这个命令各部分的作用:

  • -r sample.pcap 告诉 tshark 从我们的捕获文件中读取数据
  • -T fields 指定我们希望输出采用字段格式(而不是 XML 或 JSON 等其他格式)
  • -e ip.src 选择源 IP 地址字段
  • -e tcp.port 选择 TCP 端口字段

输出将以制表符分隔的值形式显示,每行代表一个数据包,先显示源 IP,然后显示端口号:

192.168.1.1    443
192.168.1.2    80

为了便于处理,我们可以将输出保存到一个文件中。当处理大量捕获数据或需要进一步处理数据时,这尤其有用:

tshark -r sample.pcap -T fields -e ip.src -e tcp.port > temp.txt
cat temp.txt

> 符号将输出重定向到一个文件,而 cat 命令让我们可以查看该文件的内容。这种方法为我们提供了过滤后数据的永久记录,我们可以在以后参考或使用其他工具进行分析。

使用 -T fields 将输出设置为字段格式

在这一步中,我们将探讨如何自定义 tshark 的输出,使其仅显示我们所需的特定数据包字段。-T fields 选项可以将默认的数据包显示转换为一种更易于处理和分析的结构化格式。

当你首次运行 tshark 而不指定任何字段时,它会显示每个数据包的详细信息,但有时这些信息会让人应接不暇:

tshark -r sample.pcap -c 3

这种默认视图包含了所有可用的数据包详细信息。然而,为了进行有针对性的分析,我们通常只需要几个关键信息。这就是字段提取发挥作用的地方。以下命令展示了如何选择特定的字段:

tshark -r sample.pcap -T fields -e frame.number -e ip.src -e ip.dst -e tcp.port

让我们来详细分析一下这个命令各部分的作用:

  • -T fields 告诉 tshark 我们需要基于字段的输出,而不是默认的数据包摘要
  • -e frame.number 提取数据包在捕获文件中的位置
  • -e ip.src 显示数据包的来源(源 IP)
  • -e ip.dst 显示数据包的去向(目的 IP)
  • -e tcp.port 显示正在使用的网络端口

输出结果是简洁的、以制表符分隔的格式,如下所示:

1    192.168.1.1    192.168.1.2    443
2    192.168.1.2    192.168.1.1    80

当你需要进一步处理数据或将其导入其他工具时,这种格式特别有用。如果你不确定有哪些可用的字段,或者需要验证字段名称,可以搜索完整的字段列表:

tshark -G fields | grep -E 'ip.src|ip.dst|tcp.port'

这个命令可以帮助你找到所有与 IP 地址和 TCP 端口相关的字段,你可以将这些字段纳入你的分析中。

使用 -E separator=, 指定逗号作为分隔符

在这一步中,你将学习如何把 tshark 输出中的字段分隔符从制表符改为逗号。当你需要将数据导入 Excel 等电子表格应用程序,或者使用期望 CSV(逗号分隔值)格式的工具进行分析时,这种修改尤为有用。

首先,让我们回顾一下之前使用的生成制表符分隔输出的基本命令。这有助于你理解我们要做的更改:

tshark -r sample.pcap -T fields -e frame.number -e ip.src -e ip.dst -e tcp.port -c 3

要将此输出转换为 CSV 格式,你可以使用 -E 选项并搭配 separator=,。这会告诉 tshark 在字段之间使用逗号而非制表符:

tshark -r sample.pcap -T fields -e frame.number -e ip.src -e ip.dst -e tcp.port -E separator=, -c 3

下面来详细分析这个命令各部分的作用:

  • -E separator=, 是关键的新增部分,它将分隔符改为逗号
  • 其他所有选项(-r-T fields-e 字段、-c)的功能与之前完全相同
  • 只要所有选项都存在,它们的顺序并不重要

运行此命令后,你会看到如下格式的输出:

1,192.168.1.1,192.168.1.2,443
2,192.168.1.2,192.168.1.1,80
3,192.168.1.3,192.168.1.4,22

为了确认分隔符确实已改为逗号(当你无法从视觉上区分制表符和空格时,这一点尤其有用),你可以将输出通过管道传递给 od -c,它会显示特殊字符:

tshark -r sample.pcap -T fields -e frame.number -e ip.src -E separator=, -c 1 | od -c

这个验证步骤有助于确保你的输出能被 CSV 读取器正确解析,这在为其他工具准备分析数据时至关重要。

使用 > fields.csv 将输出导出到文件

在这一步中,你将学习如何把提取的数据包数据保存到一个 CSV(逗号分隔值)文件中。CSV 是一种简单的文件格式,它以纯文本形式存储表格数据,非常适合在电子表格应用程序或数据处理工具中进行分析。将数据包数据保存到文件中,你就创建了一个可以共享、分析或后续处理的永久记录。

让我们把目前学到的所有内容整合到一个命令中,该命令可以提取多个数据包字段并将其保存到文件中:

tshark -r sample.pcap -T fields -e frame.number -e ip.src -e ip.dst -e tcp.port -E separator=, > fields.csv

下面是各部分的作用:

  • -r sample.pcap 读取你的数据包捕获文件
  • -T fields 告诉 Tshark 你需要基于字段的输出
  • 每个 -e 标志指定一个要提取的字段(数据包编号、源 IP、目的 IP 和端口)
  • -E separator=, 将逗号设置为字段分隔符
  • > fields.csv 将输出重定向到文件,而不是显示在屏幕上

运行此命令后,让我们检查文件是否正确创建:

ls -l fields.csv
head fields.csv

ls -l 命令显示文件的详细信息,而 head 命令显示文件的前几行。输出应该如下所示:

1,192.168.1.1,192.168.1.2,443
2,192.168.1.2,192.168.1.1,80
3,192.168.1.3,192.168.1.4,22

为了让这些数据更易于理解,你可以添加列标题。以下是如何创建一个带有标题的新文件,并将其与数据合并的方法:

echo "Packet,Source,Destination,Port" > headers.csv
cat headers.csv fields.csv > final.csv
mv final.csv fields.csv

这样就创建了一个新版本的 CSV 文件,文件顶部带有描述性的标题,这使得在电子表格应用程序中处理数据变得更加容易。

总结

在本次实验中,你学习了如何使用 Wireshark 的命令行工具 tshark 提取特定的数据包字段。练习内容包括使用 -e 标志选择字段、使用 -T fields 格式化输出,以及将结果保存到文件中进行分析。

你还练习了将多个字段(如 frame.numberip.srctcp.port)组合成结构化的输出。这些技术能让你将原始数据包数据高效地转换为适合网络故障排除的有序格式。