Wireshark自动化抓包与分析:Shell脚本实例

Wireshark自动化抓包与分析:Shell脚本实例

【免费下载链接】wireshark Read-only mirror of Wireshark's Git repository at https://gitlab.com/wireshark/wireshark. ⚠️ GitHub won't let us disable pull requests. ⚠️ THEY WILL BE IGNORED HERE ⚠️ Upload them at GitLab instead. 【免费下载链接】wireshark 项目地址: https://gitcode.com/gh_mirrors/wi/wireshark

网络故障排查中,手动启动Wireshark抓包常面临时机难把握、数据量庞大等问题。通过Shell脚本整合dumpcap(抓包引擎)与tshark(命令行分析工具),可实现无人值守的流量采集与初步分析。本文以Linux环境为例,提供3个实用脚本模板,覆盖定时抓包、条件触发捕获、多协议批量分析场景,配套讲解关键参数与扩展思路。

核心工具与工作流

Wireshark自动化依赖两个核心组件:

  • dumpcap:轻量级抓包工具,低资源占用适合后台运行,对应源码实现dumpcap.c
  • tshark:命令行分析引擎,支持流量过滤、统计与导出,工具调用示例见tools/indexcap.py

典型自动化流程包含以下阶段: mermaid

基础定时抓包脚本

功能说明

每小时自动捕获指定接口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字段提取捕获时长,避免额外的时间命令调用

高级扩展与最佳实践

性能优化建议

  1. 抓包过滤:使用BPF语法减少捕获量,如dumpcap -f "tcp port 80 and host 192.168.1.1"
  2. 环形缓冲区-b duration:60 -b files:10生成10个60秒文件,自动覆盖旧文件
  3. 后台运行:结合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')

总结与后续改进

本文脚本已覆盖基础自动化需求,进一步优化可考虑:

  1. 集成ELK栈实现分布式日志分析
  2. 添加基于机器学习的异常流量检测(参考tools/indexcap.py的多进程分析框架)
  3. 开发Web管理界面,通过extcap扩展实现远程控制

所有脚本均通过Wireshark 4.0+版本测试,低版本需注意调整tshark的-z参数语法。完整工具链安装指南见README.linux。建议定期同步官方仓库更新,确保协议解析库的时效性。

【免费下载链接】wireshark Read-only mirror of Wireshark's Git repository at https://gitlab.com/wireshark/wireshark. ⚠️ GitHub won't let us disable pull requests. ⚠️ THEY WILL BE IGNORED HERE ⚠️ Upload them at GitLab instead. 【免费下载链接】wireshark 项目地址: https://gitcode.com/gh_mirrors/wi/wireshark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值