5.3 tshark 命令行断案:字段导出与自动化


5.3 tshark 命令行断案:字段导出与自动化

同一个案子查十遍,就该把筛法写成脚本。本节讲 tshark 的自动化姿势:两道筛子的参数位、字段导出的格式、统计开关、以及把三者串成勘验流水线的方法。GUI 适合探索,tshark 适合重复——5.2 节的套路清单在这里全部变成可以放进脚本仓库的一行行命令。这也是第 8 章批量分析与第 9 章实时流处理的基础设施。

两道筛子的参数位

tshark 把两道筛子放在两个参数上,语义与 GUI 完全一致(3.1 节"同引擎"的又一次兑现):

# -f:捕获过滤(BPF),只在实时采集时有效 $ tshark -i eth0 -f "tcp port 443" -w https.pcapng # -Y:显示过滤器,作用于已捕获或已读取的帧 $ tshark -r https.pcapng -Y "tls.handshake.type == 1" # -2:两遍解析(3.3 节讲过为什么),需要完整状态的分析加它更稳 $ tshark -r conn.pcapng -2 -Y "tcp.analysis.retransmission"

经典的参数组合拳:-f 管进门、-Y 管上台、-w 存原件、-T fields 出结构化结果。一个完整的断案会话长这样:

$ tshark -r incident.pcapng -Y "dns.flags.rcode > 0" \ -T fields -e frame.time -e dns.qry.name -e dns.flags.rcode -E separator=, 10:15:31.002,api.old-service.cn,3 10:15:33.517,cdn.upstream.io,2 10:15:41.884,api.old-service.cn,3

-T fields 逐字段取数,-e 指定取哪些字段(就是第 4 章解剖过的那些名字),-E separator=, 让输出直接变成 CSV——这一条命令已经完成了"筛选、抽取、格式化"三步,输出可以直接进表格或绘图工具。

字段导出的进阶姿势

# 表头与分隔符,导出即入库 $ tshark -r x.pcapng -Y "http" -T fields \ -e frame.number -e http.request.method -e http.response.code -e frame.time_delta \ -E header=y -E separator=/t -E occurrence=f > http_audit.tsv # JSON 全量导出(字段树整棵带走,供外部程序消费) $ tshark -r x.pcapng -Y "tcp.stream == 3" -T json > stream3.json # 单字段多值时的聚合策略:occurrence=a 把多值聚成一格 $ tshark -r dns.pcapng -T fields -e dns.a -E occurrence=a -c 2 93.184.216.34,93.184.216.35

三个细节:-E occurrence=f 取首个值(默认)、a 聚合全部、l 逐值各占一行;/t 分隔符在含逗号载荷(如 Cookie)时救场;JSON 导出体积大,整树带语义,适合下游有程序处理的场合,人读还是 fields 香。

统计开关:一行命令一台仪器

tshark 的 -z 系列把 GUI 的统计面板搬上命令行,勘验流水线的"仪器"部分:

# 会话矩阵:谁和谁说了多少 $ tshark -r x.pcapng -z conv,tcp -q | head -8 ================================================================================ TCP Conversations Filter: | <- | | Index | Flow A | Flow B | Packets | Bytes | ... 0 | 192.168.31.14:52114 <-> 203.0.113.25:443 | 187 | 98422 | 1 | 192.168.31.14:52190 <-> 198.51.100.7:443 | 12 | 4108 | ================================================================================ # IO 时序:按秒聚合的流量曲线(文本柱状) $ tshark -r x.pcapng -z io,stat,1 -q | sed -n '1,12p' =================================================================== | IO Statistics -- interval 1.000 sec | | Col 1: Frames & Bytes | |------------------------------------------------------------------| | Time |frames| bytes | | 0.000-1.000 | 183 | 98211 | | 1.000-2.000 | 1024 | 731004 | <- 突发窗口一目了然 # 协议构成:流量都花在哪些协议上 $ tshark -r x.pcapng -z io,phs -q | head -10 =================================================================== Protocol Hierarchy Statistics Filter: eth frames:41822 bytes:28941122 ip frames:41810 bytes:28933456 tcp frames:39187 bytes:28402117 tls frames:31204 bytes:24110093

三个仪器对应三类问句:会话矩阵答"谁与谁"、IO 时序答"何时多与少"、协议构成答"都是什么"。加上 5.2 节的筛法,一个案子的定量部分就齐了。

把勘验串成流水线

单条命令的威力有限,串起来才是自动化。三个进阶模式:

# 模式一:shell 管道做二次加工——重传最多的十个源地址 $ tshark -r wan.pcapng -Y "tcp.analysis.retransmission" -T fields -e ip.src \ | sort | uniq -c | sort -rn | head 847 10.0.3.17 212 10.0.3.8 41 192.168.31.14 # 模式二:批量处理——对目录里所有 pcap 逐个提指纹 $ for f in /data/capture/*.pcapng; do tshark -r "$f" -Y "tls.handshake.type==1" -T fields -e tls.handshake.extensions_server_name done | sort | uniq -c | sort -rn > sni_census.txt # 模式三:定时值守——每晚跑一遍昨天的环形文件,异常才输出 $ tshark -r yesterday.pcapng -Y "dns.qry.type==16 && len(dns.qry.name)>50" \ -T fields -e frame.time -e dns.qry.name | mail -s "DNS 隧道嫌疑" netops

模式一展示了 tshark 与 Unix 文本工具的天然亲和:字段导出是纯文本,sort 与 uniq 就是免费的聚合器。模式二是"批量勘验"的最小实现,第 8 章会加上并发与分片。模式三把勘验变成值守——无人值守的筛选结果直接进邮箱或告警通道。

⚠️ 自动化的两个坑。其一,-T fields 不会告诉你字段不存在:UDP 流量上导 tcp 字段只会得到空行,脚本要自己校验空值比例。其二,长跑脚本记得加 -n 关闭名称解析(3.4 节的三慢源之一),否则每一帧都可能触发一次反查。

结案要点

  • 参数位-f 门口 BPF、-Y 台上显示过滤、-w 落盘、-T fields 出结构。
  • -E 三件套:separator、header、occurrence,把导出直接变成可入库的数据。
  • -z 三台仪器:会话矩阵、IO 时序、协议构成,各有各的问句。
  • 管道即流水线:字段导出配 sort 与 uniq 就是免费聚合分析。
  • 自动化两坑:空字段不报错、名称解析拖长跑。

筛子的功夫全部到手——人用的、机器用的都有了。下一章处理加密时代的新难题:怎么在合规红线内,让 TLS 流量重新变得可读。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U