开发sFlow 流量分析软件
开源和商业的都不好用,于是开发了一个适合自家场景的软件。
sFlow 流量分析器 – 软件设计和使用说明文档
1. 软件概述
1.1 简介
sFlow 流量分析器是一款基于 Python 开发的网络流量分析工具,用于实时捕获、解析和分析 sFlow v5 协议数据包。该软件能够提取数据包中的实际流量信息(源地址、目标地址、端口等),并提供数据统计、过滤和导出功能。
1.2 主要功能
| 功能模块 | 功能描述 |
|———|———|
| 实时抓包 | 捕获并解析 sFlow v5 协议数据包 |
| 数据统计 | 基于 Agent、源/目标地址、端口聚合统计会话 |
| 数据过滤 | 支持 Agent、源地址、时间范围等多维度过滤 |
| 数据库存储 | 持久化存储数据包和会话信息 |
| CSV 导出 | 导出统计数据为 CSV 文件 |
| 数据清理 | 支持按时间周期自动/手动清理旧数据 |
1.3 技术栈
– **语言**: Python 3.10+
– **GUI 框架**: PyQt5
– **网络库**: Scapy
– **数据库**: SQLite
– **Excel 解析**: xlrd
2. 系统架构
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ sFlow 流量分析器 │
├─────────────────────────────────────────────────────────────┤
│ 主界面 (MainWindow) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 实时抓包页 │ │ 数据统计页 │ │ 系统设置页 │ │
│ │ Live Capture │ │ Statistics │ │ Settings │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 业务逻辑层 │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 数据包解析器 │ │ 会话聚合器 │ │ 过滤器 │ │
│ │ PacketParser │ │ SessionAgg │ │ Filter │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 数据访问层 │
│ ┌──────────────────────┐ │
│ │ DatabaseManager │ │
│ │ (SQLite) │ │
│ └──────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 网络捕获层 │
│ ┌──────────────────────┐ │
│ │ CaptureThread │ │
│ │ (Scapy Sniff) │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2 核心组件说明
2.2.1 数据包解析器 (PacketParser)
负责解析 sFlow v5 协议数据包,提取:
– Agent IP 地址
– 流样本数据(Flow Sample)
– 计数器样本数据(Counter Sample)
– 原始 IP 数据包信息
2.2.2 会话聚合器 (SessionAggregator)
基于以下关键字聚合会话:
– Agent IP
– 源 IP 地址
– 源端口
– 目标 IP 地址
– 目标端口
– 协议类型
2.2.3 数据库管理器 (DatabaseManager)
管理 SQLite 数据库,提供:
– 数据包存储
– 会话存储
– 数据查询
– 数据清理
– CSV 导出
2.2.4 捕获线程 (CaptureThread)
使用 Scapy 进行网络数据包捕获,支持:
– 指定网络接口捕获
– 所有接口捕获
– UDP 6343 端口过滤
3. 数据库设计
3.1 数据库表结构
3.1.1 packets 表(数据包表)
| 字段名 | 类型 | 说明 |
|——-|——|——|
| id | INTEGER | 主键,自增 |
| timestamp | TEXT | 捕获时间 |
| agent_ip | TEXT | sFlow Agent IP |
| agent_line | TEXT | Agent 线路信息 |
| src_ip | TEXT | 源 IP 地址 |
| src_area | TEXT | 源区域 |
| src_port | INTEGER | 源端口 |
| dst_ip | TEXT | 目标 IP 地址 |
| dst_area | TEXT | 目标区域 |
| dst_port | INTEGER | 目标端口 |
| protocol | TEXT | 协议类型 |
| length | INTEGER | 数据包长度 |
| created_at | TEXT | 创建时间 |
3.1.2 sessions 表(会话表)
| 字段名 | 类型 | 说明 |
|——-|——|——|
| id | INTEGER | 主键,自增 |
| agent_ip | TEXT | sFlow Agent IP |
| agent_line | TEXT | Agent 线路信息 |
| src_ip | TEXT | 源 IP 地址 |
| src_area | TEXT | 源区域 |
| src_port | INTEGER | 源端口 |
| dst_ip | TEXT | 目标 IP 地址 |
| dst_area | TEXT | 目标区域 |
| dst_port | INTEGER | 目标端口 |
| protocol | TEXT | 协议类型 |
| packet_count | INTEGER | 数据包数量 |
| total_length | INTEGER | 总流量(字节) |
| first_seen | TEXT | 首次出现时间 |
| last_seen | TEXT | 最后出现时间 |
3.1.3 settings 表(配置表)
| 字段名 | 类型 | 说明 |
|——-|——|——|
| key | TEXT | 配置键 |
| value | TEXT | 配置值 |
3.2 区域映射表 (area.xls)
用于将 IP 地址映射到区域信息,支持 CIDR 格式的最长前缀匹配。
| 列名 | 说明 |
|—–|——|
| address | IP 地址或 CIDR 网段 |
| area | 区域名称 |
3.3 Agent 映射表 (agent.xls)
用于将 Agent IP 映射到线路信息。
| 列名 | 说明 |
|—–|——|
| address | Agent IP 地址 |
| line | 线路名称 |
4. 使用说明
4.1 启动方式
4.1.1 开发模式运行
bash
python sflow_analyzer.py
4.1.2 使用批处理文件
双击运行 debug_sflow.bat
4.1.3 可执行文件运行
运行 dist/sflow_analyzer.exe
4.2 实时抓包页面
4.2.1 界面布局
┌──────────────────────────────────────────────────────────────────┐
│ 接口: [下拉框] 刷新 sFlow Agent: [下拉框] │
│ Source: [输入框] Dest: [输入框] [Start] [Stop] [Clear] │
├──────────────────────────────────────────────────────────────────┤
│ 序号 | 时间 | Agent IP | 源地址 | 源端口 | 目标地址 | 目标端口 │
│ | | | | | | │
└──────────────────────────────────────────────────────────────────┘
4.2.2 操作说明
1. **选择接口**:从下拉框选择要监听的网络接口,或选择”所有接口”
2. **设置过滤条件**:
– **Agent 过滤**:选择特定的 sFlow Agent,或选择”所有 Agent”
– **源地址过滤**:输入源 IP 地址进行过滤
– **目标地址过滤**:输入目标 IP 地址进行过滤
3. **开始捕获**:点击”开始”按钮开始捕获数据包
4. **停止捕获**:点击”停止”按钮停止捕获
5. **清空列表**:点击”清空”按钮清空当前显示的数据包
4.2.3 数据显示
– 最新数据显示在列表顶部
– 最多显示 1000 条数据,超过后自动删除最旧数据
– 状态栏显示当前数据包数量
4.3 数据统计页面
4.3.1 界面布局
┌──────────────────────────────────────────────────────────────────┐
│ sFlow Agent: [下拉框] 时间范围: [下拉框] 源地址过滤: [输入框] │
│ [刷新] [自动刷新(5min)] [导出 CSV] [清空数据库] │
├──────────────────────────────────────────────────────────────────┤
│ 数据包总数: N 会话总数: N │
├──────────────────────────────────────────────────────────────────┤
│ Agent IP | 线路 | 源地址 | 源区域 | 源端口 | 目标地址 | … │
└──────────────────────────────────────────────────────────────────┘
4.3.2 操作说明
1. **Agent 过滤**:选择特定的 sFlow Agent 查看其会话数据
2. **时间范围过滤**:选择时间范围(全部时间、最近1天、7天、30天)
3. **源地址过滤**:输入源 IP 地址进行实时过滤
4. **刷新数据**:点击”刷新”按钮手动刷新统计数据
5. **自动刷新**:勾选”自动刷新(5分钟)”按钮,每5分钟自动刷新
6. **导出 CSV**:点击”导出 CSV”按钮将当前数据导出为 CSV 文件
7. **清空数据库**:点击”清空数据库”按钮删除所有数据
4.3.3 统计字段说明
| 字段 | 说明 |
|—–|——|
| Agent IP | sFlow Agent 的 IP 地址 |
| 线路 | Agent 对应的线路名称(从 agent.xls 映射) |
| 源地址 | 流量的源 IP 地址 |
| 源区域 | 源地址对应的区域(从 area.xls 映射) |
| 源端口 | 源端口号 |
| 目标地址 | 流量的目标 IP 地址 |
| 目标区域 | 目标地址对应的区域(从 area.xls 映射) |
| 目标端口 | 目标端口号 |
| 协议 | 协议类型(TCP/UDP/OTHER) |
| 数据包数量 | 该会话的数据包总数 |
| 总流量 | 该会话的总流量(字节) |
| 首次出现 | 会话首次出现时间 |
| 最后出现 | 会话最后出现时间 |
4.4 系统设置页面
4.4.1 界面布局
┌──────────────────────────────────────────────────────────────────┐
│ 系统设置 │
├──────────────────────────────────────────────────────────────────┤
│ 数据保留期限 │
│ 超过保留期限的数据将被自动清理 │
│ [下拉框: 1天/7天/14天/30天/60天/90天/120天/半年/1年] │
│ [保存设置] [立即清理过期数据] [清空所有数据] │
├──────────────────────────────────────────────────────────────────┤
│ 数据库信息 │
│ 数据包总数: N 会话总数: N [刷新] │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 数据包统计: │ │
│ │ 最近1天: N 最近7天: N 最近14天: N │ │
│ │ 最近30天: N 最近60天: N 最近90天: N │ │
│ │ 最近120天: N 半年: N 1年: N │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 会话统计: │ │
│ │ 最近1天: N 最近7天: N … │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
4.4.2 操作说明
1. **设置数据保留期限**:
– 从下拉框选择数据保留期限
– 点击”保存设置”按钮保存配置
– 超过保留期限的数据将在程序启动时自动清理
2. **立即清理过期数据**:点击”立即清理过期数据”按钮手动执行清理
3. **清空所有数据**:点击”清空所有数据”按钮删除数据库中的所有数据
4. **刷新统计信息**:点击”刷新”按钮更新数据库统计信息
5. 配置文件说明
5.1 area.xls(区域映射表)
用于将 IP 地址映射到区域名称,支持 CIDR 格式。
**文件格式**:Excel 格式(.xls)
**列结构**:
– **address**:IP 地址或 CIDR 网段(如 192.168.1.0/24)
– **area**:区域名称(如 武汉光谷集群)
**匹配规则**:
– 使用最长前缀匹配算法
– 精确 IP 地址优先于网段匹配
5.2 agent.xls(Agent 映射表)
用于将 sFlow Agent IP 映射到线路名称。
**文件格式**:Excel 格式(.xls)
**列结构**:
– **address**:Agent IP 地址
– **line**:线路名称(如 算力网-深圳)
5.3 sflow.db(数据库文件)
SQLite 数据库文件,程序运行时自动创建,存储数据包和会话数据。
6. 常见问题
6.1 无法捕获数据包
**问题描述**:启动捕获后没有显示任何数据包
**可能原因及解决方法**:
1. **未安装 Npcap**:
– 下载并安装 Npcap(https://nmap.org/npcap/)
– 确保安装时勾选 “Install Npcap in WinPcap API-compatible Mode”
2. **防火墙阻止**:
– 检查 Windows 防火墙设置,允许程序访问网络
– 确保 UDP 6343 端口未被阻止
3. **选择的接口不正确**:
– 尝试选择”所有接口”
– 确认 sFlow Agent 发送数据的接口已被选中
6.2 Agent 列表不更新
**问题描述**:新的 sFlow Agent 发送数据后,数据统计页面的 Agent 列表没有显示
**解决方法**:
– 数据统计页面会在每次刷新时自动更新 Agent 列表
– 点击”刷新”按钮手动刷新
– 启用”自动刷新(5分钟)”功能
6.3 区域信息不显示
**问题描述**:数据统计页面的”源区域”和”目标区域”列显示为空
**可能原因及解决方法**:
1. **area.xls 文件不存在**:
– 将 area.xls 文件放在程序同一目录下
2. **IP 地址不匹配**:
– 检查 area.xls 中的 address 列是否包含相关 IP 地址或网段
– 确保使用正确的 CIDR 格式(如 192.168.1.0/24)
6.4 程序启动失败
**问题描述**:双击可执行文件后程序无法启动
**可能原因及解决方法**:
1. **缺少依赖库**:
– 确保已安装所有依赖:`pip install pyqt5 scapy xlrd`
2. **Python 版本不兼容**:
– 使用 Python 3.10 或更高版本
3. **权限不足**:
– 尝试以管理员身份运行程序
6.5 数据统计页面加载缓慢
**问题描述**:数据统计页面加载时间较长
**可能原因及解决方法**:
1. **数据库数据量大**:
– 定期清理过期数据
– 缩短数据保留期限
2. **过滤条件太宽松**:
– 使用时间范围过滤减少数据量
– 使用源地址过滤缩小查询范围
7. 技术支持
7.1 日志输出
程序运行时会在控制台输出调试信息,包括:
– 数据包解析状态
– 错误信息
– 数据库操作日志
7.2 联系信息
如有问题或建议,请联系康哥。
附录:sFlow v5 协议简介
sFlow 是一种网络流量监控协议,用于实时采样和传输网络流量信息。sFlow v5 协议包含以下主要组件:
1. **sFlow Agent**:部署在网络设备上,负责采样流量并发送到 Collector
2. **sFlow Collector**:接收并处理 sFlow 数据包(本软件即为 Collector)
3. **Flow Sample**:包含实际的流量数据(源/目标 IP、端口等)
4. **Counter Sample**:包含接口统计信息(带宽利用率、数据包计数等)
本软件支持解析 sFlow v5 协议中的 Flow Sample 和 Counter Sample,能够提取其中的实际流量信息并进行统计分析。
夜雨聆风