MohamedMouloudj/SDN-IDS
GitHub: MohamedMouloudj/SDN-IDS
基于 SDN 架构的两阶段机器学习入侵检测系统,利用协议专属自编码器进行异常检测并配合随机森林分类器识别攻击类型。
Stars: 2 | Forks: 0
## 概述
本项目是一个端到端框架,用于在软件定义网络 (SDN) 中模拟和观察基于机器学习的入侵检测系统 (IDS)。它提供了一个完整的环境来生成流量、监控网络行为并实时检测恶意攻击。
核心组件包括:
- **Mininet**:模拟网络拓扑、正常主机和攻击者。
- **RYU Controller**:监控网络应用,提取流遥测数据并执行路由规则。
- **机器学习 Pipeline**:采用两阶段流程,利用自编码器 检测异常,并通过随机森林 分类器对特定攻击类型进行分类。
- **Flask Dashboard**:基于 Web 的 UI,用于可视化网络统计信息、记录的攻击和系统历史记录。
本项目是我在 2026 年 01-03 到 01-05 期间于爱立信 实习的成果。
## 要求
1. 在系统全局安装 Python(推荐 python3.10)
2. 在系统全局安装 [主机要求](./hosts_required_packages.txt) 中的包。
3. 运行以下命令以禁用反向路径过滤(针对 LAND_ATTACK)
```
sudo sysctl -w net.ipv4.conf.all.rp_filter=0
sudo sysctl -w net.ipv4.conf.default.rp_filter=0
```
4. 在本项目的根目录下创建 `.env` 文件,并根据需要设置以下值
```
NORMAL_COLLECTION_MODE=
ATTACK_COLLECTION_MODE=
# 在生产环境中将它们都设置为 False
```
## 初始化数据库
```
python3 models.py
```
这应该会创建以下表:
- **History**:存储检测到的攻击事件
- **Packets_dropped**:存储有关整体攻击的一些统计数据(丢弃的数据包计数和字节数)
- **Users**:存储系统用户。用于接口
## RYU Controller 环境
由于与 `eventlet` 存在兼容性限制,RYU 需要一个专用的 Python 3.8 虚拟环境。该环境位于 `ryu-controller/` 文件夹内的 `.ryu-env/` 中。
**激活环境:**
```
cd ryu-controller
source .ryu-env/bin/activate
pip install -r requirements.txt
```
**验证是否使用了正确的 ryu-manager:**
```
which ryu-manager
# 预期: .../ryu-controller/.ryu-env/bin/ryu-manager
```
**运行监控器:**
```
ryu-manager monitor.py
```
## 工作流指南
**阶段 1 - 收集正常流量(暂无模型):**
- 在 [monitor.py](ryu-controller/monitor.py) 中设置 `NORMAL_COLLECTION_MODE = True`
- `_detect_anomaly()` 返回 `(False, 0.0)` - 完全绕过自编码器
- 在 h1/h2/h3 上运行 `traffic_normal.py` 持续 20-30 分钟
- 结果:生成仅包含 `Traffic='Normal'` 行的 `traffic_log.csv`
**阶段 2 - 训练自编码器(离线,在 notebook 中):**
- 打开 [train_autoencoders.ipynb](notebooks/train_autoencoders.ipynb)
- 运行 Pearson 热力图 以决定要删除哪些列
- 更新 `pipeline.py` 文件中的 `AUTOENCODER_FEATURES`、`AUTOENCODER_STD_COLS`、`AUTOENCODER_MM_COLS`,使其与 notebook 中使用的完全一致
- 运行训练单元格 -> 生成 `icmp.onnx`、`tcp.onnx`、`udp.onnx`、`std_{proto}.json`、`mm_{proto}.json`、`autoencoder_features.json`
- 使用打印出的值更新 [monitor.py](ryu-controller/monitor.py) 中的 `THRESHOLD_ICMP`/`TCP`/`UDP`
**阶段 3 - 收集标记的攻击流量(模型已存在):**
- 在 [monitor.py](ryu-controller/monitor.py) 中设置 `NORMAL_COLLECTION_MODE = False` 和 `ATTACK_COLLECTION_MODE = True`(缓解措施保持关闭)
- 在 [monitor.py](ryu-controller/monitor.py) 中取消注释自编码器代码块
- 运行 `run_attack.py` -> 生成 `run_attack_log.json`
- 运行 `label_dataset.py` -> 生成 `traffic_log_labeled.csv`
- 结果:用于 RF/SVM 训练的平衡数据集
**阶段 4 - 训练分类器 + 集成:**
- 在 `traffic_log_labeled.csv` 上训练 RF 和 SVM
- 填充 [monitor.py](ryu-controller/monitor.py) 中的 `_classify_attack()` 存根
- 设置 `NORMAL_COLLECTION_MODE = False` 和 `ATTACK_COLLECTION_MODE = False` 以进行实时 IDS 操作
## 生成正常流量
### 前置条件
#### 1. 确保 `.env` 文件中已开启正常收集模式
```
NORMAL_COLLECTION_MODE = True
ATTACK_COLLECTION_MODE = False
```
#### 2. 如果存在旧的 CSV 文件,请将其删除
```
rm ryu-controller/traffic_log.csv
```
#### 3. 启动 RYU
```
cd ryu-controller
source .ryu-env/bin/activate
pip install -r requirements.txt
ryu-manager monitor.py
```
### 1. 启动 Mininet
```
cd mininet-topo
sudo python3 topo.py
```
### 2. 启动服务
```
http python3 ../services/http_server.py &
ftp python3 ../services/ftp_server.py &
smtp python3 ../services/smtp_server.py &
dns python3 ../services/dns_server.py &
```
### 3. 生成流量
```
h1 python3 ../services/traffic_normal.py &
h2 python3 ../services/traffic_normal.py &
h3 python3 ../services/traffic_normal.py &
```
### 4. 等待
让流量运行至少 30 分钟。从另一个终端监控 CSV 行数:
```
watch -n 10 wc -l ./ryu-controller/traffic_log.csv
```
目标是每个协议至少达到 500 行,然后再停止。
### 5. 停止流量
```
h1 pkill -f traffic_normal.py
h2 pkill -f traffic_normal.py
h3 pkill -f traffic_normal.py
```
### 6. 退出 Mininet
```
exit
sudo mn -c
```
## 生成攻击流量
### 前置条件
#### 1. 确保在 `.env` 中开启了攻击收集模式
```
NORMAL_COLLECTION_MODE = False
ATTACK_COLLECTION_MODE = True
```
#### 2. 如果存在旧的 CSV 文件,请将其删除
```
rm ryu-controller/traffic_log.csv
```
#### 3. 启动 RYU
```
cd ryu-controller
source .ryu-env/bin/activate
pip install -r requirements.txt
ryu-manager monitor.py
```
### 1. 启动 Mininet
```
cd mininet-topo
sudo python3 topo.py
```
### 2. 启动服务
```
http python3 ../services/http_server.py &
ftp python3 ../services/ftp_server.py &
smtp python3 ../services/smtp_server.py &
dns python3 ../services/dns_server.py &
```
### 3. 生成流量
```
h3 python3 ../services/attacks/run_attack.py # For internal attacks
h_ext python3 ../services/attacks/run_attack.py # For external attacks
```
攻击样本将根据攻击类别分别保存为 `csv` 文件。
## Notebooks
所有训练 notebook 都带有 Markdown 单元格 进行了详细的自说明,解释了每个步骤、预处理决策背后的推理以及模型架构的详细信息。阅读它们无需事先设置。
要在本地重新训练模型,请按顺序遵循每个 notebook 中的步骤:
1. `train_autoencoders.ipynb` - 异常检测模型 (ICMP, TCP, UDP)
2. `train_compare_classifiers.ipynb` - RF、SVM 和 XGBoost 比较
您可以在[此驱动器文件夹](https://drive.google.com/drive/folders/1Gm4-iaPYOwlLjYZqSoaxU-h_UOzHFz6h?usp=sharing)中找到我生成的所有模型。
## UI Dashboard
`ui` 模块提供了一个基于 Flask 的 Web 界面,用于 SDN IDS 仪表板。它包括实时统计信息流和用于用户管理的管理员界面。
### 启动 UI
确保您已安装 UI 依赖项(例如 `flask`、`flask-login`、`sqlalchemy`)。请注意,UI 需要 Python 3.11+。
要启动仪表板,请运行:
```
cd ui
uv sync
# 或者直接使用 pip 安装这些包
uv pip install .
uv run ../ui/app.py
```
应用将在 `http://127.0.0.1:5000` 上运行。
对于用户,应该有一个默认创建的管理员:
- Email: admin@gmail.com
- password: admin
您可以在 `models.py` 的代码中更改此设置。我没有扩展应用程序来处理应用程序的正式身份验证,因为这不是本项目的目的。
## 结论
本项目成功演示了在软件定义网络 (SDN) 中集成基于智能异常的入侵检测系统 (IDS)。通过结合 Mininet 进行逼真的网络模拟,RYU 进行流控制,以及两阶段的机器学习 Pipeline(Autoencoder 用于初始异常检测,Random Forest 用于攻击分类),该系统能够有效隔离恶意流量。本项目配备了一个实时 Web 仪表板,可作为研究网络安全概念以及为现代 SDN 架构开发稳健的 AI 驱动缓解技术的综合工具。
标签:Apex, CNCF毕业项目, DDoS攻击, Ericsson实习, Flask, ICMP, LAND攻击, Metaprompt, Mininet, OpenFlow, Python, Python虚拟环境, RF分类器, RYU控制器, SDN, Suricata, TCP, UDP, Web看板, 事件库, 信令拦截, 入侵检测系统, 协议自编码器, 安全数据湖, 安全防御框架, 异常检测, 恶意流量检测, 插件系统, 数据库, 无后门, 机器学习, 流量捕获, 流量监控, 深度包检测, 现代安全运营, 网络仿真, 网络安全, 网络安全分析, 网络安全实验, 网络拓扑, 网络流量分析, 自动化响应, 路由规则, 软件定义网络, 逆向工具, 遥测数据, 配置错误, 随机森林, 隐私保护, 零日攻击防护