Tshark 抓包利器
TShark 是 Wireshark 家族中功能强大的命令行工具,专为在网络分析、故障排查和安全审计场景下高效处理数据包而设计。作为 Wireshark 的无图形界面版本,TShark 保留了其强大的协议解析引擎和过滤机制,同时能够运行在无显示器环境的服务器或远程终端中,非常适合自动化脚本、批量处理和大规模流量监控任务。
TShark 支持从实时网络接口捕获数据包,也能读取先前保存的多种格式的抓包文件(如 pcap、pcapng 等),并支持以多种格式(如文本、JSON、PDML 等)输出解析结果。它内置了与 Wireshark 一致的显示过滤器(display filters)和捕获过滤器(capture filters),用户可以通过灵活的表达式精准提取所需流量,如按 IP 地址、端口号、协议类型或特定载荷特征进行筛选。
此外,TShark 还具备解码 TLS 流量、重组 TCP 流、提取文件对象等高级功能,并支持通过 -z 参数生成各类统计报告(如协议分层统计、端点会话列表、HTTP 请求占比等),便于快速掌握网络整体状况。其轻量、可脚本化的特性,使其成为网络运维人员、安全分析师和开发者在持续集成、日志分析和入侵检测流程中不可或缺的底层工具。
简而言之,TShark 将 Wireshark 的图形化分析能力转化为可编程、可集成的命令行接口,在保留专业深度的同时,极大拓展了网络流量分析在自动化和远端场景中的适用边界。
-Y 选项允许用户指定一个显示过滤器(display filter),这个过滤器决定了哪些数据包在 TShark 输出时会被显示或写入文件。
如果显示过滤器提示不支持,说明版本低,建议在 CentOS 8主机上查看。
以下是一些使用 -Y 选项的例子:
显示过滤器举例
显示所有大于 1000 字节的数据包:
$ tshark -ta -nr $pcapFile -Y "frame.len > 1000"
83 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1859 GET /api/widgets HTTP/1.1
94 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1859 GET /api/validate HTTP/1.1
105 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1857 GET /api/hash HTTP/1.1
显示所有 HTTP 请求:
$ tshark -ta -nr $pcapFile -Y "http.request"
6 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1868 GET /api/config/custom.css HTTP/1.1
17 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1878 GET /api/widgets/resources?type=cpu HTTP/1.1
28 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1881 GET /api/widgets/resources?type=memory HTTP/1.1
显示所有 HTTP 答复:
$ tshark -ta -nr $pcapFile -Y "http.response"
52 15:52:13.406946 10.247.9.106 → 10.247.9.104 HTTP 945 HTTP/1.1 200 OK (application/json)
60 15:52:13.407360 10.247.9.106 → 10.247.9.104 HTTP 1001 HTTP/1.1 200 OK (application/json)
URI
-Y '(http.request.uri ~ "/frame.pvt")'
HTTP返回码
"http.response.code == 200"
"!(http.response.code == 200)"
过滤网段
-Y 'ip.addr==10.227.143.0/24'
显示特定 IP 地址的HTTP协议数据包:
$ tshark -ta -nr $pcapFile -Y "ip.addr == 10.247.164.7 and http"
6 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1868 GET /api/config/custom.css HTTP/1.1
9 11:35:53 10.240.20.141 -> 10.247.164.7 HTTP 54 HTTP/1.1 304 Not Modified
17 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1878 GET /api/widgets/resources?type=cpu HTTP/1.1
19 11:35:53 10.240.20.141 -> 10.247.164.7 HTTP 289 HTTP/1.1 200 OK (application/json)
28 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1881 GET /api/widgets/resources?type=memory HTTP/1.1
30 11:35:53 10.240.20.141 -> 10.247.164.7 HTTP 490 HTTP/1.1 200 OK (application/json)
显示包含特定端口的 TCP 数据包:
$ tshark -ta -nr $pcapFile -Y "tcp.port == 3000"
3 11:35:53 10.247.164.7 -> 10.240.20.141 TCP 66 12174 > 3000 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
4 11:35:53 10.240.20.141 -> 10.247.164.7 TCP 66 3000 > 12174 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
5 11:35:53 10.247.164.7 -> 10.240.20.141 TCP 54 12174 > 3000 [ACK] Seq=1 Ack=1 Win=29312 Len=0
6 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1868 GET /api/config/custom.css HTTP/1.1
显示所有 ICMP 数据包:
-Y "icmp"
显示所有DNS 数据包:
-Y "dns"
显示特定源 MAC 地址的所有数据包:
-Y "eth.src == 00:11:22:33:44:55"
特定字符串的 TCP 数据包:
在 tshark 中,默认情况下,过滤表达式是区分大小写的。因此,tcp contains sfecp 和 tcp contains SFECP 会被视为不同的字符串,导致过滤结果不同。
区分大小写
tcp contains
$ tshark -ta -nr $pcapFile -Y "tcp contains GET"
6 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1868 GET /api/config/custom.css HTTP/1.1
17 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1878 GET /api/widgets/resources?type=cpu HTTP/1.1
28 11:35:53 10.247.164.7 -> 10.240.20.141 HTTP 1881 GET /api/widgets/resources?type=memory HTTP/1.1
-Y 'tcp contains "select COLUMN_NAME from information_schema.`COLUMNS`"'
-Y 'tcp contains "/dev-basp-user/modules/authen"'
-Y "tcp contains \"$KEYWORD\""
Wireshark 的显示过滤器本身不支持直接设置不区分大小写的匹配。但是,可以通过以下方法实现不区分大小写的过滤:
方法 1:使用正则表达式(matches)
Wireshark 的显示过滤器支持正则表达式匹配,可以通过 matches 关键字实现不区分大小写的匹配。
tshark -ta -nr $pcapFile -Y 'tcp matches "(?i)sfecp"'
(?i):正则表达式中的标志,表示不区分大小写。matches:用于正则表达式匹配。
方法 2:结合多个过滤器
如果你知道目标字符串可能的大小写形式,可以结合多个 contains 过滤器。
tshark -ta -nr $pcapFile -Y 'tcp contains "sfecp" || tcp contains "SFECP"'
显示源IP与特定字节的数据包
tshark -ta -nr $pcapFile -Y "ip.src==10.227.70.11 and frame.len==64"
三次握手的数据包
$ tshark -ta -nr $pcapFile -Y "tcp.flags.syn == 1 && tcp.flags.ack == 0"
62 11:35:28.359860 10.216.208.160 → 10.247.8.121 TCP 70 58970 → 1080 [SYN] Seq=0 Win=26720 Len=0 MSS=1336 SACK_PERM=1 WS=128
DNS ID
-Y 'dns.id == 0xe94e'
时间范围
-Y '(frame.time >= "Apr 18, 2025 15:44:00") && (frame.time <= "Apr 18, 2025 15:46:00")'
(frame.time >= "Nov 26, 2024 11:50:00")
时间差
请求与回复时间超过 0.1 秒的 DNS 查询
使用 awk 处理输出,过滤出时间差大于 0.1 秒的记录
tshark -r $pcapFile -Y "dns.flags.response == 1" -T fields -e frame.time_delta -e frame.time -e ip.src -e ip.dst -e dns.qry.name | awk '{ if ($1 > 0.1) print $0 }'
帧号
frame.number == 939
帧号及包数量
指定数量比使用帧号指定范围,查询速度快得多。
-c <capture packet count>
Set the maximum number of packets to read when capturing live data. If reading a capture file, set the maximum number of packets to read.
list the first 10 packets
tshark -ta -nr $pcapFile -c 10
tshark -ta -nr $pcapFile -Y "frame.number >= 300000 " -c 10
排除特定端口
!(udp.port == 53)
重传
-Y "tcp.analysis.retransmission"
显示每个数据包的详细信息
tshark -ta -nr $pcapFile -Y '(http.request.uri ~ "/api/agent/checkin")' -V
arp 和 非arp
-Y arp
# 排除arp
-Y "! arp" -Y "not arp"
# 排除arp and vrrp
-Y "! (arp or vrrp)"
过滤mysql协议相关的数据包
-Y mysql
过滤 syslog 协议的数据包
-Y syslog
header=y
显示所有 HTTP 流量的源 IP 地址和 User-Agent 字段,并以竖线 | 分隔字段,同时包含字段名称的标题行。这对于分析 HTTP 请求的来源和使用的浏览器类型非常有用。
-Y 'http' -T fields -E header=y -E separator='|' -e ip.src -e http.user_agent
-T fields -E header=y -E separator='|' -e ip.src -e ip.dst | column -t -s '|'
分析 TCP 流并计算每个流的吞吐量
-z conv,tcp用于生成 TCP 流的统计报告,显示每个 TCP 流的详细信息,包括发送和接收的字节数、数据包数、重传次数等。
tshark -ta -nr $pcapFile -q -z conv,tcp
================================================================================
TCP Conversations
Filter:<No Filter>
| <- | | -> | | Total | Absolute Time | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
10.247.164.7:43933 <-> 10.240.20.141:3000 5 389 6 2293 11 2682 11:39:29 0.0064
10.247.164.7:43929 <-> 10.240.20.141:3000 5 459 6 2325 11 2784 11:39:29 0.0458
10.247.164.7:43925 <-> 10.240.20.141:3000 5 390 6 2299 11 2689 11:39:29 0.0453
10.247.164.7:43919 <-> 10.240.20.141:3000 5 391 6 2299 11 2690 11:39:29 0.0504
10.247.164.7:43917 <-> 10.240.20.141:3000 5 389 6 2296 11 2685 11:39:29 0.0369
10.247.164.7:43931 <-> 10.240.20.141:3000 4 335 6 2293 10 2628 11:39:29 0.0305
10.247.164.7:43927 <-> 10.240.20.141:3000 4 334 6 2296 10 2630 11:39:29 0.0305
10.247.164.7:43923 <-> 10.240.20.141:3000 4 462 6 2315 10 2777 11:39:29 0.0307
10.247.164.7:43915 <-> 10.240.20.141:3000 5 435 5 2251 10 2686 11:39:29 0.0036
100.86.96.156:34138 <-> 10.240.20.141:22 1 82 2 160 3 242 11:39:29 0.0005
10.240.20.141:41963 <-> 100.87.72.161:7788 1 54 1 1618 2 1672 11:39:30 0.0002
================================================================================
流量实际上是 HTTP 但被识别成了 Socks,可以使用 -d 参数强制解码
tshark -nr $pcapFile -d tcp.port==1080,http -Y "http.response.code == 502"