简介
在这个实验中,你将学习如何使用 tshark,它是强大的网络协议分析工具 Wireshark 的命令行界面。掌握 tshark 可以让你简化网络分析工作流程、自动化任务,并更深入地了解网络流量。
本实验将引导你了解不同的命令行选项和实际场景。它将使你具备有效分析网络捕获文件并解决网络相关问题的技能。与图形界面相比,命令行方式具有显著优势,特别是在处理大型捕获文件或进行自动化分析时。
在这个实验中,你将学习如何使用 tshark,它是强大的网络协议分析工具 Wireshark 的命令行界面。掌握 tshark 可以让你简化网络分析工作流程、自动化任务,并更深入地了解网络流量。
本实验将引导你了解不同的命令行选项和实际场景。它将使你具备有效分析网络捕获文件并解决网络相关问题的技能。与图形界面相比,命令行方式具有显著优势,特别是在处理大型捕获文件或进行自动化分析时。
在这一步中,我们将深入探索使用 Tshark 进行网络流量分析的世界。首先,你将了解什么是 Tshark 以及它为何是网络分析的宝贵工具。然后,我们会弄清楚如何识别你系统上的网络接口,这一点至关重要,因为你需要知道从哪里捕获流量。最后,我们将学习如何使用 Wireshark 的命令行界面 Tshark 来捕获网络流量。
Tshark 本质上是 Wireshark 的命令行版本。虽然 Wireshark 有一个非常适合可视化检查的图形界面,但 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>
替换为实际接口的名称,如 eth0
或 any
。-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 只显示属于某个特定协议或具有特定 IP 地址的数据包。应用显示过滤器的基本语法如下:
tshark -r "<filter_expression>" < input_file > -Y
让我们来分解这个命令的各个部分:
-r <input_file>
:这部分命令指定了 Tshark 应该读取的捕获文件。这就像是告诉 Tshark 在哪里可以找到网络流量数据。-Y "<filter_expression>"
:这指定了你要应用的显示过滤器。过滤表达式是一组规则,用于定义应该选择哪些数据包。以下是一些你可以使用的有用过滤表达式。这些示例涵盖了数据包过滤的不同方面,例如按协议、IP 地址、端口、HTTP 方法、DNS 查询进行过滤,以及组合多个过滤器。
tcp
、udp
、icmp
、http
、dns
。例如,如果你使用 tcp
,Tshark 将只显示使用 TCP 协议的数据包。ip.addr == 192.168.1.1
。此过滤器将只显示源 IP 地址或目的 IP 地址为 192.168.1.1
的数据包。tcp.port == 80
或 tcp.port == 443
。这些过滤器将显示使用 TCP 端口 80 或 443 的数据包。端口 80 通常用于 HTTP 流量,端口 443 用于 HTTPS 流量。http.request.method == "GET"
。此过滤器将只显示使用 GET 方法的 HTTP 请求。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.host
、http.request.method
和 http.request.uri
字段。输出可能如下所示:
example.com GET /index.html
example.com GET /images/logo.png
在这一步中,我们将重点介绍如何以不同格式导出网络流量,并使用 Tshark 进行基本的流量分析。这些技能至关重要,因为它们使你能够与同事共享捕获的数据,或在其他工具中使用这些数据。在本节结束时,你将能够处理不同的文件格式,并从网络流量中提取有价值的信息。
Wireshark 是一款著名的网络协议分析器,它支持多种捕获文件格式。每种格式都有其独特的特点,了解这些特点很重要,因为它们决定了后续如何使用这些数据。
要更改捕获文件的格式,你可以在 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 请求:
tshark -r /home/labex/project/capture.pcapng -z http,tree
此命令按 URI 组织 HTTP 请求,并显示每个 URI 的请求数量。
HTTP/请求:
/index.html 1 个请求
/images/logo.png 2 个请求
除了二进制格式,Tshark 还可以将数据导出为文本格式,这些格式通常更易于分析。
要将捕获文件中的特定字段导出为 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 文件后,你可以使用 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 的高级技巧。这些技巧对于网络分析至关重要,因为它们能让你对网络流量数据执行复杂操作。具体来说,你将学习如何从标准输入(stdin)读取网络流量,以及如何使用管道将 Tshark 与其他命令行工具结合使用。掌握这些技能后,你就能创建强大的网络分析工作流,在处理大量网络数据时节省时间和精力。
在 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)。通过使用过滤器,你可以快速分离出你感兴趣的数据。
让我们创建一个更复杂的管道,对网络捕获数据执行多个操作。这个管道将:
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 可以与其他命令行工具结合使用,以进行更强大的分析。
cat /home/labex/project/capture.pcapng | tshark -r - | grep TCP | wc -l > /home/labex/project/tcp_count.txt
这个管道统计捕获文件中 TCP 数据包的数量。通过使用 grep
查找 TCP 数据包,再使用 wc -l
进行计数,你可以快速了解捕获文件中 TCP 流量的数量。
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 的图形界面具有明显优势。通过掌握这些技术,你提升了网络故障排除和安全分析能力,能够在各种网络环境中更高效地工作。