乐于分享
好东西不私藏

开发sFlow 流量分析软件

开发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,能够提取其中的实际流量信息并进行统计分析。