Tshark 抓包利器

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 sfecptcp 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"

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注