TShark:基础知识

TShark 是一款开源的命令行网络流量分析工具。它由 Wireshark 的开发者创建,并具备 Wireshark 的大部分功能。它通常被用作 Wireshark 的命令行版本。然而,它也可以像 tcpdump 一样使用。因此,它是进行全面数据包分析的首选工具。

分析技巧

命令行数据包分析提示

TShark 是一款基于文本的工具,适用于数据恢复、深度数据包分析以及脚本自动化。这种强大的功能和灵活性源于其自身的特性。命令行界面由于生成/处理后的数据可以流水线式地传输给其他工具,因此可以使用这些工具。下面列出了数据包分析中最常用的工具。

Tool/Utility Purpose and Benefit
capinfos 该程序可提供指定捕获文件的详细信息。建议在开始调查之前查看捕获文件的摘要。
grep 有助于搜索纯文本数据。
cut 有助于从指定的数据源中截取部分数据行。
uniq 过滤重复的行/值。
nl 查看显示的行数。
sed 流媒体编辑器。
awk 用于辅助模式搜索和处理的脚本语言。

主要参数

主要参数I

命令行界面和参数

TShark 是一款基于文本(命令行)的工具。因此,对获取的结果进行深入且连续的分析非常容易。它内置了多个选项,可帮助分析人员开展此类调查。然而,了解参数至关重要;你需要掌握内置选项及其相关参数,才能控制输出,避免被 TShark 的详细输出信息淹没。下表解释了最常用的参数。请注意,TShark 需要超级用户权限才能嗅探实时流量并列出所有可用接口。

参数 说明 示例
-h 显示帮助信息,列出 TShark 最常用的功能和命令选项。 tshark -h
-v 显示 TShark 和底层 Wireshark 的版本信息。 tshark -v
-D 列出当前系统中可用于抓包的网络接口(网卡)。 tshark -D
-i 指定用于抓包的网络接口,可以使用接口编号或接口名称。 tshark -i 1``tshark -i ens55
无参数 在默认网络接口上实时抓取并显示网络流量,功能类似于 tcpdump tshark

让我们查看给定虚拟机中 TShark 实例的版本信息。

嗅探

网络嗅探是 TShark 的核心功能之一。一台计算机节点可以拥有多个网络接口,这些接口允许主机与网络通信并嗅探网络流量。特定的接口可能与特定的任务/作业相关联。因此,选择嗅探接口的功能可以帮助用户确定并设置合适的嗅探接口。

让我们来看看给定环境中可用的接口

嗅探可以指定接口,也可以不指定。如果指定了接口,TShark 会使用该接口嗅探流量。 如果没有指定接口,TShark 会使用第一个可用的接口,通常在终端中显示为 1。 不指定接口参数相当于默认 -i 1使用默认的嗅探接口。还可以使用 - i 参数设置不同的嗅探接口。TShark 总会在嗅探开始时回显所使用的接口名称。

主要参数II

参数 说明 示例
-r 读取抓包文件(Input)。不进行实时抓包,而是分析已经保存的 .pcap.pcapng 文件。 tshark -r demo.pcapng
-c 指定处理的数据包数量。达到指定数量后自动停止抓包或读取。 tshark -c 10
-w 将抓取到的网络流量保存到文件中(Output),便于后续使用 Wireshark 或 TShark 分析。 tshark -w sample-capture.pcap
-V 详细模式(Verbose)。显示每个数据包的完整协议解析信息,类似 Wireshark 的「Packet Details」窗口。 tshark -V
-q 静默模式(Quiet)。不在终端显示每个数据包的内容,常用于统计分析或配合其他参数使用。 tshark -q
-x 以十六进制(Hex)和 ASCII 格式显示数据包原始内容。适合查看数据包的底层字节数据。 tshark -x

读取捕获文件

TShark 还可以处理 PCAP 文件。可以使用-r参数来处理文件并分析数据包。还可以使用参数来限制显示的数据包数量-c

写入数据

TShark 还可以将嗅探到的或过滤后的数据包写入文件。可以使用该-w参数将嗅探到的流量保存到文件。此选项有助于分析人员从文件/流量中提取特定数据包并保存以供进一步分析。它还允许分析人员仅与更高级别的调查人员共享可疑数据包/范围。

显示数据包字节数

TShark 可以以十六进制和 ASCII 格式显示数据包详情。可以使用参数查看数据包转储-x。 使用此参数后,所有数据包都将以十六进制和 ASCII 格式显示。因此,可能难以一眼发现异常,所以在减少数据包数量后使用此选项会更加高效。

详细信息

TShark 默认的数据包处理和嗅探操作仅提供一行信息,不显示详细内容。这种默认方式便于追踪已处理/嗅探的数据包数量;不过,TShark 也可以根据指令为每个数据包提供详细信息。详细信息的显示方式与 Wireshark 的"数据包详情面板"类似。由于详细信息会显示大量的数据包详情,因此建议仅对特定数据包使用此选项,而不是对一系列数据包使用。

详细模式会提供完整的数据包详情,这使得分析变得困难(每个数据包都会产生冗长而复杂的终端输出)。然而,它仍然有助于进行深入的数据包分析和脚本编写,这也是 TShark 的优势所在。请记住,详细模式的最佳使用时机是在过滤数据包之后。你可以将上面的输出与下面的屏幕截图进行比较,看看有哪些脚本编写、数据包提取和关联分析的机会!

查看第 9 个数据包的"窗口大小值"是多少?

ini 复制代码
tshark -r demo.pcapng -Y frame.number==9 -V | grep "window size"  

查看第 25 个数据包的"Ack"值是多少?

ini 复制代码
tshark -r demo.pcapng -Y frame.number==9 -V | grep "Ack*"  

捕获条件参数

TShark 可以配置为统计数据包数量并在特定点停止,或者以循环结构运行。最常用的参数说明如下。

参数 条件类型 说明 达到条件后的行为 示例
-a Autostop(自动停止) 定义单次抓包的停止条件 停止抓包并退出 见下方
-b Ring Buffer(环形缓冲区) 定义循环抓包条件 创建新文件并继续抓包 见下方

-a 自动停止(Autostop)

参数 功能 说明 示例
-a duration:X 按时间停止 抓包 X 秒后自动停止 tshark -w test.pcap -a duration:60
-a filesize:X 按文件大小停止 文件达到 X KB 后停止抓包 tshark -w test.pcap -a filesize:1000
-a files:X 按文件数量停止 达到 X 个输出文件后停止 tshark -w test.pcap -a filesize:1000 -a files:3

-b 环形缓冲区(Ring Buffer)

参数 功能 说明 示例
-b duration:X 按时间切换文件 每 X 秒创建一个新抓包文件并继续抓包 tshark -w test.pcap -b duration:60
-b filesize:X 按文件大小切换文件 文件达到 X KB 后创建新文件继续抓包 tshark -w test.pcap -b filesize:1000
-b files:X 限制文件数量 达到 X 个文件后覆盖最旧文件并继续抓包 tshark -w test.pcap -b filesize:1000 -b files:3

捕获条件参数仅在"捕获/嗅探"模式下有效。如果尝试读取数据,将会收到错误消息

数据包过滤参数

TShark 中的数据包过滤分为两个维度:实时(捕获)过滤和捕获后(显示)过滤。这两个维度可以通过两种不同的方法进行过滤:使用预定义的语法或 Berkeley 数据包过滤器

过滤器类型 中文说明 使用阶段 作用 是否可在抓包过程中修改
捕获过滤器(Capture Filter) 实时过滤规则,只捕获并保存符合条件的流量。 抓包前 减少保存到文件的数据包数量,降低存储和处理开销。 ❌ 不可以,需要在开始抓包前设置
显示过滤器(Display Filter) 抓包后过滤规则,仅控制哪些数据包显示出来。 抓包后分析 不影响原始数据,只减少当前可见的数据包,方便分析。 ✅ 可以随时修改

捕获过滤器用于在捕获文件中仅保留特定类型的流量,而不是所有流量。捕获过滤器的过滤功能有限,其目的是按范围、协议和方向进行过滤。这听起来像是批量/原始过滤,但它仍然能够生成文件大小合理的有序捕获文件。显示过滤器则会在不修改数据包的情况下深入分析捕获文件。

参数 目的
-f 捕获过滤器。与BPF语法和 Wireshark 的捕获过滤器。
-Y 显示过滤器。与Wireshark 的显示过滤器相同。

捕获过滤器

可以点击此处阅读更多关于捕获过滤器语法的信息。

TShark 捕获过滤器限定符(Qualifier)速查表

限定符类型 可用选项 中文说明 示例
Type(目标类型) host 按主机 IP 或主机名过滤 tshark -f "host 10.10.10.10"
net 按网段过滤 tshark -f "net 10.10.10.0/24"
port 按单个端口过滤 tshark -f "port 80"
portrange 按端口范围过滤 tshark -f "portrange 80-100"
Direction(方向) src 仅匹配源地址/源端口 tshark -f "src host 10.10.10.10"
dst 仅匹配目标地址/目标端口 tshark -f "dst host 10.10.10.10"
Protocol(协议) arp ARP 协议 tshark -f "arp"
ether 以太网(MAC)过滤 tshark -f "ether host F8:DB:C5:A2:5D:81"
icmp ICMP 协议 tshark -f "icmp"
ip IPv4 协议 tshark -f "ip"
ip6 IPv6 协议 tshark -f "ip6"
tcp TCP 协议 tshark -f "tcp"
udp UDP 协议 tshark -f "udp"
ip proto <编号> 按 IP 协议号过滤 tshark -f "ip proto 1"

使用terminator终端实例,在单个终端中实现分屏显示。

  • 首先,在终端-1中运行给定的 TShark 命令,开始嗅探流量。
  • 然后,在 Terminal-2 中运行给定的 curl 命令来制造网络噪声。
  • 在终端 1 中查看嗅探到的数据包结果

可以使用下表练习 TShark 捕获过滤器。

过滤类型 说明 产生测试流量 捕获过滤器
Host Filtering 捕获与指定主机之间的所有流量 curl google.com tshark -f "host google.com"
IP Filtering 捕获与指定 IP 地址之间的所有流量 nc 10.10.10.10 4444 -vw 5 tshark -f "host 10.10.10.10"
Port Filtering 捕获与指定端口相关的流量 nc 10.10.10.10 4444 -vw 5 tshark -f "port 4444"
Protocol Filtering 捕获指定协议的流量 nc -u 10.10.10.10 4444 -vw 5 tshark -f "udp"

包含 SYN 字节的数据包数量是多少?

bash 复制代码
tshark -r demo.pcapng -Y "tcp.flags.syn==1" | wc -l

发送到 IP 地址"10.10.10.10"的数据包数量是多少?

bash 复制代码
tshark -r demo.pcapng -Y "ip.dst==10.10.10.10" | wc -l

包含 ACK 字节的数据包数量是多少?

bash 复制代码
tshark -r demo.pcapng -Y "tcp.flags.ack==1" | wc -l

显示筛选器

可以参考官方的显示过滤器参考文档。

TCP 过滤器
过滤条件 说明 示例
tcp 所有 TCP 包 tshark -r demo.pcapng -Y 'tcp'
tcp.port == 80 源或目标端口 80 tshark -r demo.pcapng -Y 'tcp.port == 80'
tcp.srcport == 80 源端口 80 tshark -r demo.pcapng -Y 'tcp.srcport == 80'
tcp.dstport == 80 目标端口 80 tshark -r demo.pcapng -Y 'tcp.dstport == 80'
tcp.len > 0 有负载数据的 TCP 包 tshark -r demo.pcapng -Y 'tcp.len > 0'
tcp.window_size_value TCP 窗口大小字段 tshark -r demo.pcapng -Y 'tcp.window_size_value > 10000'
TCP Flags 过滤器
过滤条件 含义 示例
tcp.flags.syn == 1 SYN 包 tshark -r demo.pcapng -Y 'tcp.flags.syn == 1'
tcp.flags.ack == 1 ACK 包 tshark -r demo.pcapng -Y 'tcp.flags.ack == 1'
tcp.flags.fin == 1 FIN 包 tshark -r demo.pcapng -Y 'tcp.flags.fin == 1'
tcp.flags.rst == 1 RST 包 tshark -r demo.pcapng -Y 'tcp.flags.rst == 1'
tcp.flags.push == 1 PSH 包 tshark -r demo.pcapng -Y 'tcp.flags.push == 1'
tcp.flags.urg == 1 URG 包 tshark -r demo.pcapng -Y 'tcp.flags.urg == 1'
TCP Analysis 过滤器(考试常考)
过滤器 中文含义
tcp.analysis.retransmission TCP 重传
tcp.analysis.fast_retransmission 快速重传
tcp.analysis.spurious_retransmission 多余重传
tcp.analysis.lost_segment 丢失的数据段
tcp.analysis.out_of_order 乱序包
tcp.analysis.duplicate_ack 重复 ACK
tcp.analysis.zero_window 接收窗口为 0
tcp.analysis.window_update 窗口更新
tcp.analysis.keep_alive KeepAlive
tcp.analysis.keep_alive_ack KeepAlive 响应
常见 TCP 组合
过滤条件 含义
tcp.flags.syn == 1 && tcp.flags.ack == 0 第一次握手(SYN)
tcp.flags.syn == 1 && tcp.flags.ack == 1 第二次握手(SYN/ACK)
tcp.flags.ack == 1 && tcp.len == 0 纯 ACK
tcp.flags.fin == 1 连接关闭
tcp.flags.rst == 1 连接重置
tcp.analysis.retransmission TCP 重传
tcp.analysis.lost_segment 丢包
tcp.analysis.duplicate_ack 重复 ACK
IP 过滤器
过滤条件 说明
ip 所有 IPv4 包
ip.addr == 10.10.10.10 源或目标 IP
ip.src == 10.10.10.10 源 IP
ip.dst == 10.10.10.10 目标 IP
ip.ttl < 10 TTL 小于 10
ip.proto == 6 TCP
ip.proto == 17 UDP
ip.proto == 1 ICMP
ICMP 过滤器
过滤条件 说明
icmp 所有 ICMP
icmp.type == 8 Echo Request(Ping 请求)
icmp.type == 0 Echo Reply(Ping 响应)
DNS 过滤器
过滤条件 说明
dns 所有 DNS
dns.flags.response == 0 DNS 查询
dns.flags.response == 1 DNS 响应
dns.qry.type == 1 A 记录
dns.qry.type == 28 AAAA 记录
dns.qry.name contains "google" 查询名称包含 google
HTTP 过滤器
过滤条件 说明
http 所有 HTTP
http.request HTTP 请求
http.response HTTP 响应
http.request.method == "GET" GET 请求
http.request.method == "POST" POST 请求
http.response.code == 200 HTTP 200
http.response.code == 404 HTTP 404
练习题

IP 地址为"65.208.228.223"的数据包数量是多少?

bash 复制代码
tshark -r demo.pcapng -Y 'ip.addr==65.208.228.223' | wc -l

TCP 端口 3371的数据包数量是多少 ?

bash 复制代码
tshark -r demo.pcapng -Y 'tcp.port==3371' | wc -l

源地址为"145.254.160.237"的数据包数量是多少?

bash 复制代码
tshark -r demo.pcapng -Y 'ip.src==145.254.160.237' | wc -l

标记为 Duplicate(重复)*的数据包,它的包号(Frame Number)是多少?

arduino 复制代码
tshark -r demo.pcapng -Y "tcp.analysis.duplicate_ack" -T fields -e frame.number
相关推荐
AlfredZhao3 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao18 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix