Wireshark自动化抓包与分析:Shell脚本实例
网络故障排查中,手动启动Wireshark抓包常面临时机难把握、数据量庞大等问题。通过Shell脚本整合dumpcap(抓包引擎)与tshark(命令行分析工具),可实现无人值守的流量采集与初步分析。本文以Linux环境为例,提供3个实用脚本模板,覆盖定时抓包、条件触发捕获、多协议批量分析场景,配套讲解关键参数与扩展思路。
核心工具与工作流
Wireshark自动化依赖两个核心组件:
- dumpcap:轻量级抓包工具,低资源占用适合后台运行,对应源码实现dumpcap.c
- tshark:命令行分析引擎,支持流量过滤、统计与导出,工具调用示例见tools/indexcap.py
典型自动化流程包含以下阶段:
基础定时抓包脚本
功能说明
每小时自动捕获指定接口10分钟流量,保存为pcap文件并生成简易统计报告。
实现代码
#!/bin/bash
# 定时抓包脚本 [tools/capture_scheduler.sh]
INTERFACE="eth0"
CAPTURE_DIR="/var/wireshark/captures"
DURATION=600 # 10分钟
INTERVAL=3600 # 1小时
mkdir -p $CAPTURE_DIR
while true; do
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="${CAPTURE_DIR}/capture_${TIMESTAMP}.pcap"
# 后台抓包
dumpcap -i $INTERFACE -a duration:$DURATION -w $FILENAME &
PID=$!
# 等待抓包完成并生成报告
wait $PID
tshark -r $FILENAME -z io,stat,1,"COUNT(tcp.flags.syn) tcp_syn" -z io,stat,1,"COUNT(tcp.flags.reset) tcp_rst" > "${FILENAME}.txt"
echo "Captured ${FILENAME} (size: $(du -h $FILENAME | cut -f1))"
sleep $INTERVAL
done
关键参数解析
-
dumpcap核心选项:
-i指定网络接口,可通过dumpcap -D列出所有接口-a duration:600设置自动停止时间(秒),避免文件过大-w输出文件路径,支持pcapng格式(需添加-P参数)
-
tshark统计功能:
-z io,stat,1生成1秒间隔的IO统计- 自定义计数器语法支持协议字段组合,完整语法参考tshark手册
条件触发式抓包方案
应用场景
当服务器CPU使用率超过80%时自动启动抓包,捕获异常时刻的网络流量。结合系统监控工具实现事件驱动的捕获机制。
实现代码
#!/bin/bash
# 系统资源触发抓包脚本 [tools/trigger_capture.sh]
INTERFACE="eth0"
CAPTURE_DIR="/var/wireshark/triggered"
THRESHOLD=80 # CPU使用率阈值(%)
DURATION=300 # 触发后抓包时长(秒)
mkdir -p $CAPTURE_DIR
while true; do
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d. -f1)
if [ $CPU_USAGE -ge $THRESHOLD ]; then
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILENAME="${CAPTURE_DIR}/cpu_trigger_${TIMESTAMP}.pcap"
echo "CPU usage ${CPU_USAGE}% > ${THRESHOLD}%, starting capture..."
dumpcap -i $INTERFACE -a duration:$DURATION -w $FILENAME
# 分析TCP重传与HTTP错误
tshark -r $FILENAME -Y "tcp.analysis.retransmission or http.response.code >= 500" -T fields -e frame.time -e ip.src -e ip.dst -e tcp.seq -e http.response.code > "${FILENAME}.err"
# 发送告警邮件(需配置mailutils)
echo "High CPU capture completed: ${FILENAME}" | mail -s "Wireshark Alert" admin@example.com
fi
sleep 5 # 检查间隔
done
扩展触发条件
可通过替换CPU监控命令实现多样化触发:
- 网络流量突变:
ifstat 1 1 | awk '/eth0/ {print $1}' - 特定进程启动:
pgrep -x "异常进程名" - 端口连接数:
netstat -an | grep :80 | wc -l
多协议批量分析工具
功能概述
对指定目录下的pcap文件进行批量分析,提取关键协议指标并生成CSV报告。适用于安全审计或周期性流量回顾。
实现代码
#!/bin/bash
# 批量分析脚本 [tools/batch_analyzer.sh]
INPUT_DIR=$1
OUTPUT_FILE="analysis_report_$(date +%Y%m%d).csv"
# 检查输入目录
if [ -z "$INPUT_DIR" ] || [ ! -d "$INPUT_DIR" ]; then
echo "Usage: $0 <pcap_directory>"
exit 1
fi
# 生成CSV表头
echo "filename,start_time,duration,packets,tcp_packets,udp_packets,http_requests,https_connections" > $OUTPUT_FILE
# 遍历所有pcap文件
find $INPUT_DIR -name "*.pcap" | while read PCAP_FILE; do
# 基础统计
BASIC_STATS=$(tshark -r $PCAP_FILE -z io,stat,0 | grep "Duration" | awk '{print $3 "," $5}')
# 协议分布
TCP_COUNT=$(tshark -r $PCAP_FILE -Y "tcp" -c 0 2>/dev/null | grep "packets" | awk '{print $1}')
UDP_COUNT=$(tshark -r $PCAP_FILE -Y "udp" -c 0 2>/dev/null | grep "packets" | awk '{print $1}')
# 应用层统计
HTTP_REQS=$(tshark -r $PCAP_FILE -Y "http.request" -c 0 2>/dev/null | grep "packets" | awk '{print $1}')
TLS_CONNS=$(tshark -r $PCAP_FILE -Y "tls.handshake.type == 1" -c 0 2>/dev/null | grep "packets" | awk '{print $1}')
# 写入CSV
echo "$(basename $PCAP_FILE),$BASIC_STATS,$TCP_COUNT,$UDP_COUNT,$HTTP_REQS,$TLS_CONNS" >> $OUTPUT_FILE
echo "Processed: $(basename $PCAP_FILE)"
done
echo "Report generated: $OUTPUT_FILE"
关键技术点
- tshark计数技巧:使用
-c 0仅统计不输出数据包,结合-Y过滤条件实现高效计数 - 错误抑制:
2>/dev/null屏蔽非致命错误(如部分文件损坏) - 时间计算:通过Duration字段提取捕获时长,避免额外的时间命令调用
高级扩展与最佳实践
性能优化建议
- 抓包过滤:使用BPF语法减少捕获量,如
dumpcap -f "tcp port 80 and host 192.168.1.1" - 环形缓冲区:
-b duration:60 -b files:10生成10个60秒文件,自动覆盖旧文件 - 后台运行:结合systemd创建服务,配置文件示例wireshark-capture.service
安全注意事项
- 捕获文件权限设置为600,避免敏感信息泄露
- 使用
tshark -x时注意过滤敏感字段(如HTTP Cookie) - 生产环境建议采用secrets-types.h中定义的加密存储方案
可视化整合方案
通过Python脚本调用matplotlib生成流量趋势图,示例代码框架:
import pyshark
import matplotlib.pyplot as plt
cap = pyshark.FileCapture('capture.pcap')
timestamps = []
tcp_syn_count = 0
for packet in cap:
timestamps.append(float(packet.sniff_timestamp))
if 'TCP' in packet and hasattr(packet.tcp, 'flags_syn') and packet.tcp.flags_syn == '1':
tcp_syn_count += 1
# 生成图表
plt.plot(timestamps, [tcp_syn_count]*len(timestamps))
plt.savefig('syn_trend.png')
总结与后续改进
本文脚本已覆盖基础自动化需求,进一步优化可考虑:
- 集成ELK栈实现分布式日志分析
- 添加基于机器学习的异常流量检测(参考tools/indexcap.py的多进程分析框架)
- 开发Web管理界面,通过extcap扩展实现远程控制
所有脚本均通过Wireshark 4.0+版本测试,低版本需注意调整tshark的-z参数语法。完整工具链安装指南见README.linux。建议定期同步官方仓库更新,确保协议解析库的时效性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



