使用 Tshark 进行网络流量分析

WiresharkWiresharkBeginner
立即练习

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

简介

在这个实验中,你将学习如何使用 tshark,它是强大的网络协议分析工具 Wireshark 的命令行界面。掌握 tshark 可以让你简化网络分析工作流程、自动化任务,并更深入地了解网络流量。

本实验将引导你了解不同的命令行选项和实际场景。它将使你具备有效分析网络捕获文件并解决网络相关问题的技能。与图形界面相比,命令行方式具有显著优势,特别是在处理大型捕获文件或进行自动化分析时。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL wireshark(("Wireshark")) -.-> wireshark/WiresharkGroup(["Wireshark"]) wireshark/WiresharkGroup -.-> wireshark/installation("Installation and Setup") wireshark/WiresharkGroup -.-> wireshark/packet_capture("Packet Capture") wireshark/WiresharkGroup -.-> wireshark/display_filters("Display Filters") wireshark/WiresharkGroup -.-> wireshark/export_packets("Exporting Packets") wireshark/WiresharkGroup -.-> wireshark/packet_analysis("Packet Analysis") wireshark/WiresharkGroup -.-> wireshark/commandline_usage("Command Line Usage") subgraph Lab Skills wireshark/installation -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} wireshark/packet_capture -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} wireshark/display_filters -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} wireshark/export_packets -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} wireshark/packet_analysis -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} wireshark/commandline_usage -.-> lab-415942{{"使用 Tshark 进行网络流量分析"}} end

使用 Tshark 理解和捕获网络流量

在这一步中,我们将深入探索使用 Tshark 进行网络流量分析的世界。首先,你将了解什么是 Tshark 以及它为何是网络分析的宝贵工具。然后,我们会弄清楚如何识别你系统上的网络接口,这一点至关重要,因为你需要知道从哪里捕获流量。最后,我们将学习如何使用 Wireshark 的命令行界面 Tshark 来捕获网络流量。

什么是 Tshark?

Tshark 本质上是 Wireshark 的命令行版本。虽然 Wireshark 有一个非常适合可视化检查的图形界面,但 Tshark 无需图形显示就能提供相同的核心功能。使用 Tshark,你可以从网络中捕获数据包。数据包就像在网络中传输数据的小信封。它还允许你显示这些数据包的详细信息,例如它们的来源、去向以及携带的数据类型。你可以将捕获的数据保存到文件中,以便日后分析。这个工具在以下几种场景中特别有用:

  • 自动化网络监控:你可以设置脚本定期运行 Tshark,检查是否有任何异常的网络活动。
  • 高效分析大型捕获文件:由于它是一个命令行工具,与一些图形化工具相比,它能更快地处理大量数据。
  • 在没有图形界面的服务器上运行:服务器通常没有图形显示,而 Tshark 可以直接从命令行运行。
  • 将网络分析集成到脚本中:你可以在自己的脚本中使用 Tshark 命令来执行自定义的网络分析任务。

安装 Tshark

在开始使用 Tshark 之前,我们需要确保它已安装在你的系统上。要在使用 apt 包管理器的系统(如 Ubuntu)上安装 Tshark,请在终端中运行以下命令。sudo 部分赋予你管理员权限,apt install 用于安装软件包,-y 会自动对任何提示回答“是”,tshark 是我们要安装的软件包。

sudo apt install -y tshark

识别你的网络接口

在开始捕获网络流量之前,你需要知道要监控哪个网络接口。网络接口就像你的计算机连接到网络的一扇门。要列出系统上所有可用的网络接口,请运行以下命令:

tshark -D

这个命令将显示系统上所有网络接口的列表。输出可能如下所示:

1. eth0
2. eth1
3. lo (回环接口)
4. any (捕获所有接口流量的伪设备)

在我们的实验中,我们将使用 any 接口。这是一个特殊的伪设备,允许我们同时从所有可用的网络接口捕获流量。

捕获网络流量

现在我们知道要使用哪个接口了,让我们开始捕获一些网络流量。使用 Tshark 捕获流量的基本语法如下:

tshark -i <interface> -w <output_file>

以下是各部分的含义:

  • -i <interface>:此选项指定你要从哪个网络接口捕获流量。你可以将 <interface> 替换为实际接口的名称,如 eth0any
  • -w <output_file>:此选项指定你要将捕获的数据包保存到的文件的位置和名称。

首先,让我们创建一个目录来存储捕获的文件。mkdir -p 命令会在目录不存在时创建它,我们将在 /home/labex/project/captures 处创建该目录。

mkdir -p /home/labex/project/captures

现在,让我们开始捕获。我们将使用 any 接口,并将捕获的数据包保存到 /home/labex/project 目录下名为 capture.pcapng 的文件中。

tshark -i any -w /home/labex/project/capture.pcapng

运行此命令后,你将看到输出表明 Tshark 已开始捕获数据包。输出可能如下所示:

正在 'any' 上捕获

为了实际捕获一些有意义的流量,我们需要生成它。打开一个新的终端标签页并运行以下命令。curl 命令用于从服务器传输数据。这里,我们尝试访问网站 https://www.example.com

curl https://www.example.com

生成流量后,回到运行 Tshark 的终端,按 Ctrl + C 停止捕获。你将看到一条消息,指示捕获了多少个数据包。可能如下所示:

正在 'any' 上捕获
捕获到 164 个数据包

检查捕获的文件

为了确保捕获文件已成功创建,我们可以使用 ls -l 命令。此命令列出目录中的文件并显示它们的详细信息。运行以下命令检查捕获文件:

ls -l /home/labex/project/capture.pcapng

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex 24680 1月 27 12:34 /home/labex/project/capture.pcapng

现在,让我们快速查看一下我们捕获的内容。我们将再次使用 Tshark,但这次使用 -r 选项。-r 选项用于读取捕获文件。我们将输出通过管道传递给 head - 10 命令,该命令将显示文件中的前 10 个数据包。

tshark -r /home/labex/project/capture.pcapng | head -10

这个命令将显示详细的数据包信息,包括时间戳(数据包被捕获的时间)、源地址和目的地址(数据包的来源和去向)以及使用的协议。

使用 Tshark 过滤网络流量

在这一步中,我们将探讨如何对网络流量捕获文件应用过滤器。在处理网络流量时,捕获文件可能会非常大,并且包含大量的数据。过滤有助于我们专注于我们感兴趣的特定类型的数据包。这一点至关重要,因为它使我们能够更高效地分析大型捕获文件,并识别相关的流量模式。

理解显示过滤器

Tshark 使用显示过滤器从捕获文件中选择要显示或处理的数据包。可以将这些过滤器看作是告诉 Tshark 你想要查看哪些数据包的一种方式。它们使用特定的语法,根据协议字段定义匹配条件。例如,你可以告诉 Tshark 只显示属于某个特定协议或具有特定 IP 地址的数据包。应用显示过滤器的基本语法如下:

tshark -r "<filter_expression>" < input_file > -Y

让我们来分解这个命令的各个部分:

  • -r <input_file>:这部分命令指定了 Tshark 应该读取的捕获文件。这就像是告诉 Tshark 在哪里可以找到网络流量数据。
  • -Y "<filter_expression>":这指定了你要应用的显示过滤器。过滤表达式是一组规则,用于定义应该选择哪些数据包。

常见显示过滤器示例

以下是一些你可以使用的有用过滤表达式。这些示例涵盖了数据包过滤的不同方面,例如按协议、IP 地址、端口、HTTP 方法、DNS 查询进行过滤,以及组合多个过滤器。

  • 按协议过滤:tcpudpicmphttpdns。例如,如果你使用 tcp,Tshark 将只显示使用 TCP 协议的数据包。
  • 按 IP 地址过滤:ip.addr == 192.168.1.1。此过滤器将只显示源 IP 地址或目的 IP 地址为 192.168.1.1 的数据包。
  • 按端口过滤:tcp.port == 80tcp.port == 443。这些过滤器将显示使用 TCP 端口 80 或 443 的数据包。端口 80 通常用于 HTTP 流量,端口 443 用于 HTTPS 流量。
  • 按 HTTP 方法过滤:http.request.method == "GET"。此过滤器将只显示使用 GET 方法的 HTTP 请求。
  • 按 DNS 查询过滤:dns.qry.name contains "example.com"。此过滤器将显示查询名称包含字符串 "example.com" 的 DNS 数据包。
  • 组合过滤器:tcp.port == 80 and http.request.method == "POST"。此过滤器组合了两个条件。它将只显示使用 TCP 端口 80 且具有 HTTP POST 请求的数据包。

对我们的捕获文件应用过滤器

让我们从过滤捕获文件中的 HTTPS 流量(TCP 端口 443)开始。我们将使用以下命令:

tshark -r /home/labex/project/capture.pcapng -Y "tcp.port == 443"

当你运行此命令时,Tshark 将读取捕获文件 /home/labex/project/capture.pcapng 并应用过滤器 tcp.port == 443。结果,你应该只会看到使用 TCP 端口 443 的数据包,该端口通常用于 HTTPS 流量。输出将包括这些数据包的详细信息,例如源 IP 地址和目的 IP 地址、端口号和数据包标志。以下是输出可能的样子:

  1   0.000000 192.168.1.100 → 93.184.216.34 TCP 74 43210 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
  2   0.023456 93.184.216.34 → 192.168.1.100 TCP 74 443 → 43210 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=128 SACK_PERM=1
  3   0.023789 192.168.1.100 → 93.184.216.34 TCP 66 43210 → 443 [ACK] Seq=1 Ack=1 Win=64240 Len=0
  ...

让我们尝试另一个过滤器来查找 DNS 流量。我们将使用以下命令:

tshark -r /home/labex/project/capture.pcapng -Y "dns"

此命令将仅显示捕获文件中的 DNS 数据包。输出将显示 DNS 查询和响应,包括查询名称和响应 IP 地址等详细信息。以下是输出可能的样子:

  8   0.034567 192.168.1.100 → 8.8.8.8 DNS 82 Standard query 0x1234 A example.com
  9   0.056789 8.8.8.8 → 192.168.1.100 DNS 98 Standard query response 0x1234 A example.com A 93.184.216.34

按类型统计数据包数量

你还可以使用过滤器来统计特定类型的数据包数量。这对于了解捕获文件中的流量概况很有用。例如,要统计 TCP 数据包的数量,我们可以使用以下命令:

tshark -r /home/labex/project/capture.pcapng -Y "tcp" | wc -l

在这个命令中,tshark 读取捕获文件并应用过滤器 tcp。然后,tshark 的输出通过管道 (|) 传递给 wc -l 命令,该命令统计输出中的行数。由于每行代表一个数据包,这就得到了捕获文件中 TCP 数据包的数量。

让我们统计 HTTPS 数据包的数量并将结果保存到一个文件中。我们将使用以下命令:

tshark -r /home/labex/project/capture.pcapng -Y "tcp.port == 443" | wc -l > /home/labex/project/filtered_packet_count.txt

这个命令与上一个命令类似,但我们不是直接显示计数结果,而是将输出重定向 (>) 到一个名为 filtered_packet_count.txt 的文件中。你可以使用以下命令查看结果:

cat /home/labex/project/filtered_packet_count.txt

输出将显示匹配过滤器的数据包数量。例如:

42

提取特定字段

Tshark 可以使用 -T fields-e 选项从数据包中提取特定字段。当你只对数据包中的某些信息感兴趣时,这很有用,例如 HTTP 请求的主机、方法和 URI。以下是一个示例命令:

tshark -r /home/labex/project/capture.pcapng -Y "http" -T fields -e http.host -e http.request.method -e http.request.uri

在这个命令中,tshark 读取捕获文件,应用过滤器 http 以仅选择 HTTP 数据包,然后使用 -T fields 选项指定我们要提取字段。-e 选项用于指定要提取哪些字段。在这种情况下,我们正在提取 http.hosthttp.request.methodhttp.request.uri 字段。输出可能如下所示:

example.com	GET	/index.html
example.com	GET	/images/logo.png

使用 Tshark 分析和导出网络流量

在这一步中,我们将重点介绍如何以不同格式导出网络流量,并使用 Tshark 进行基本的流量分析。这些技能至关重要,因为它们使你能够与同事共享捕获的数据,或在其他工具中使用这些数据。在本节结束时,你将能够处理不同的文件格式,并从网络流量中提取有价值的信息。

理解捕获文件格式

Wireshark 是一款著名的网络协议分析器,它支持多种捕获文件格式。每种格式都有其独特的特点,了解这些特点很重要,因为它们决定了后续如何使用这些数据。

  • pcapng:这是 Wireshark 使用的默认格式。它支持多个接口,并具有高级功能。当你需要捕获复杂的网络场景时,这是一个很好的选择。
  • pcap:经典格式。它与较旧的工具兼容,但与 pcapng 相比,功能较少。如果你需要与旧系统配合使用,这种格式可能是你的首选。
  • csv:逗号分隔值。当你想将数据导入电子表格进行进一步分析时,这种格式非常有用。
  • json:JavaScript 对象表示法。它非常适合进行编程分析,因为编程语言可以轻松解析它。
  • text:纯文本格式,人类可读。当你想在不使用任何特殊工具的情况下快速查看数据时,它很有用。

导出为不同的文件格式

要更改捕获文件的格式,你可以在 Tshark 中使用 -F 选项。一般的命令结构如下:

tshark -r <input_file> -F <format> -w <output_file>

这里,-r 指定输入文件,-F 设置输出格式,-w 定义输出文件。

让我们举个例子,将我们的捕获文件导出为 pcap 格式:

tshark -r /home/labex/project/capture.pcapng -F pcap -w /home/labex/project/export.pcap

当此命令成功运行时,屏幕上不会显示任何输出。要确认导出是否成功,你可以使用 ls 命令列出导出文件的详细信息:

ls -l /home/labex/project/export.pcap

你应该会看到类似以下的输出:

-rw-r--r-- 1 labex labex 22468 1月 27 12:45 /home/labex/project/export.pcap

分析协议统计信息

Tshark 不仅可用于导出文件,还可用于生成有关捕获流量的各种统计信息。让我们探索一些统计分析选项。

协议层次结构统计信息

如果你想查看不同协议在捕获文件中的分布情况,可以使用以下命令:

tshark -r /home/labex/project/capture.pcapng -z io,phs

-z 选项用于指定统计信息类型。在这种情况下,io,phs 代表协议层次结构统计信息。输出将显示协议的层次结构以及每个协议的数据包百分比。

协议层次结构统计信息
|
+ 以太网
  + 互联网协议版本 4
    + 传输控制协议
      + 传输层安全协议
        + 超文本传输安全协议
    + 用户数据报协议
      + 域名系统

会话统计信息

要分析网络中端点之间的会话,可以使用以下命令:

tshark -r /home/labex/project/capture.pcapng -z conv,tcp

此命令专注于 TCP 会话。它显示了涉及的端点、交换的数据包数量以及传输的总字节数等统计信息。

TCP 会话
                                               |       <-      | |       ->      | |     总计     |    相对时间    |   持续时间   |
                                               | 帧数  字节数 | | 帧数  字节数 | | 帧数  字节数 |      开始时间     |              |
192.168.1.100:43210 <-> 93.184.216.34:443          24   18765      18    4532      42    23297       0.000000000        8.2345

HTTP 请求统计信息

如果你的捕获文件包含 HTTP 流量,你可以使用以下命令分析 HTTP 请求:

tshark -r /home/labex/project/capture.pcapng -z http,tree

此命令按 URI 组织 HTTP 请求,并显示每个 URI 的请求数量。

HTTP/请求:
 /index.html                                    1 个请求
 /images/logo.png                               2 个请求

导出为不同的文本格式

除了二进制格式,Tshark 还可以将数据导出为文本格式,这些格式通常更易于分析。

导出为 CSV

要将捕获文件中的特定字段导出为 CSV 文件,可以使用以下命令:

tshark -r /home/labex/project/capture.pcapng -T fields -e frame.number -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport -E header=y -E separator=, > /home/labex/project/tcp_summary.csv

这里,-T fields 指定我们要导出特定字段。-e 选项用于定义我们要导出的字段,如帧编号、源 IP 和目的 IP 以及源 TCP 端口和目的 TCP 端口。-E header=y 为 CSV 文件添加标题,-E separator=, 将分隔符设置为逗号。

检查 CSV 导出文件

将数据导出为 CSV 文件后,你可以使用 head 命令快速查看文件的前几行:

head -5 /home/labex/project/tcp_summary.csv

输出可能如下所示:

frame.number,ip.src,ip.dst,tcp.srcport,tcp.dstport
1,192.168.1.100,93.184.216.34,43210,443
2,93.184.216.34,192.168.1.100,443,43210
3,192.168.1.100,93.184.216.34,43210,443
...

Tshark 高级技巧与管道操作

在这一步中,你将学习 Tshark 的高级技巧。这些技巧对于网络分析至关重要,因为它们能让你对网络流量数据执行复杂操作。具体来说,你将学习如何从标准输入(stdin)读取网络流量,以及如何使用管道将 Tshark 与其他命令行工具结合使用。掌握这些技能后,你就能创建强大的网络分析工作流,在处理大量网络数据时节省时间和精力。

理解 Linux 管道和标准输入

在 Linux 操作系统中,管道(|)是非常实用的功能。它们充当两个命令之间的桥梁,允许你将一个命令的输出作为输入传递给另一个命令。这样,你就可以将多个命令链接在一起,执行更复杂的任务。标准输入(stdin)是程序读取输入的数据流。当你在许多命令行工具中使用 - 符号时,这是向工具发出的信号,表示输入应来自 stdin 而非文件。这为你处理数据提供了更大的灵活性。

从标准输入读取网络流量

Tshark 可以使用 -r - 选项从标准输入读取捕获数据。在你想处理来自其他命令的数据,或者需要实时过滤捕获数据的场景中,这个功能极其有用。你可以将数据通过管道传输到 Tshark,而不是直接从文件读取。

从标准输入读取网络流量的基本语法如下:

cat <input_file> | tshark -r -

让我们用捕获文件来试试。以下命令读取捕获文件并显示所有数据包,类似于运行 tshark -r capture.pcapng

cat /home/labex/project/capture.pcapng | tshark -r -

输出将显示捕获文件中的所有数据包,如下所示:

  1   0.000000 192.168.1.100 → 93.184.216.34 TCP 74 43210 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
  2   0.023456 93.184.216.34 → 192.168.1.100 TCP 74 443 → 43210 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=128 SACK_PERM=1
  ...

在标准输入上进行过滤

从 stdin 读取数据时,你也可以应用过滤器。这能让你专注于特定类型的网络流量。

cat /home/labex/project/capture.pcapng | tshark -r - -Y "tcp.port == 80"

这个命令将仅显示捕获文件中的 HTTP 流量(TCP 端口 80)。通过使用过滤器,你可以快速分离出你感兴趣的数据。

创建网络分析管道

让我们创建一个更复杂的管道,对网络捕获数据执行多个操作。这个管道将:

  1. 读取捕获文件
  2. 过滤出 DNS 流量
  3. 仅提取 DNS 查询名称
  4. 按字母顺序排序
  5. 去除重复项
  6. 将结果保存到文件中
cat /home/labex/project/capture.pcapng | tshark -r - -Y "dns" -T fields -e dns.qry.name | sort | uniq > /home/labex/project/dns_queries.txt

让我们通过运行以下命令来查看结果:

cat /home/labex/project/dns_queries.txt

输出将显示捕获文件中唯一的 DNS 查询名称的排序列表,如下所示:

example.com
www.example.com

将 Tshark 与其他工具结合使用

Tshark 可以与其他命令行工具结合使用,以进行更强大的分析。

使用 grep 统计数据包类型

cat /home/labex/project/capture.pcapng | tshark -r - | grep TCP | wc -l > /home/labex/project/tcp_count.txt

这个管道统计捕获文件中 TCP 数据包的数量。通过使用 grep 查找 TCP 数据包,再使用 wc -l 进行计数,你可以快速了解捕获文件中 TCP 流量的数量。

使用 sed 提取 HTTP 用户代理

cat /home/labex/project/capture.pcapng | tshark -r - -Y "http.user_agent" -T fields -e http.user_agent | sed 's/,/\n/g' > /home/labex/project/user_agents.txt

这个命令提取所有 HTTP 用户代理字符串,将逗号替换为换行符。这使得输出更易读,也更便于分析。

将标准输入的输出保存到文件

让我们将从 stdin 进行 Tshark 分析的完整输出保存到文件中。这样,你以后就可以查看这些数据。

cat /home/labex/project/capture.pcapng | tshark -r - > /home/labex/project/stdin_output.txt

让我们通过运行以下命令来验证内容:

head -5 /home/labex/project/stdin_output.txt

这应该会显示分析结果的前 5 行,类似于:

  1   0.000000 192.168.1.100 → 93.184.216.34 TCP 74 43210 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
  2   0.023456 93.184.216.34 → 192.168.1.100 TCP 74 443 → 43210 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1460 WS=128 SACK_PERM=1
  3   0.023789 192.168.1.100 → 93.184.216.34 TCP 66 43210 → 443 [ACK] Seq=1 Ack=1 Win=64240 Len=0
  4   0.024012 192.168.1.100 → 93.184.216.34 TLSv1.2 192 Client Hello
  5   0.045678 93.184.216.34 → 192.168.1.100 TLSv1.2 1023 Server Hello, Certificate, Server Key Exchange, Server Hello Done

总结

在本次实验中,你学习了如何有效地使用 Wireshark 命令行界面(Tshark)进行网络流量分析。首先,你掌握了 Tshark 的基本概念,并学会了从网络接口捕获网络流量。接着,你探索了如何应用过滤器来聚焦特定类型的流量,这在处理大型捕获文件时至关重要。

你还学会了以不同格式导出网络流量,以便进行共享或进一步分析。此外,你了解了 Tshark 的统计分析功能,从而能够理解网络流量的构成。最后,你掌握了更复杂的技巧,例如从标准输入读取流量,以及通过将 Tshark 与其他命令行工具结合来创建分析管道。在处理大文件、执行自动化分析、在远程服务器上进行分析以及创建可重复的工作流等场景中,这些技能相较于 Wireshark 的图形界面具有明显优势。通过掌握这些技术,你提升了网络故障排除和安全分析能力,能够在各种网络环境中更高效地工作。