介绍
在这个实验中,你将学习如何使用 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 "<input_file>" -Y "<filter_expression>"
我们来分解一下这个命令的组成部分:
-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。此过滤器将只显示源地址或目的地址为 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 地址、端口号和包标志。以下是输出可能外观的示例:
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 的图形界面具有明显优势。通过掌握这些技术,你提升了网络故障排除和安全分析能力,能够在各种网络环境中更高效地工作。