annanyababu123-star/SDN-Packet-Monitoring-Mininet
GitHub: annanyababu123-star/SDN-Packet-Monitoring-Mininet
一个基于 SDN 的 Mininet 监控与防火墙系统,使用 POX 控制器实现学习交换、协议检测与访问控制。
Stars: 0 | Forks: 0
# SDN 数据包监控与防火墙 — Mininet + POX
## 问题陈述
传统网络缺乏集中控制与可见性。本项目使用 **Mininet** 与 **POX OpenFlow 控制器** 实现一个 **SDN 解决方案**,展示以下功能:
- 通过 OpenFlow 1.0 的 PacketIn/FlowMod 消息实现 **控制器—交换机交互**
- 支持优先级与超时机制的 **匹配—动作流规则设计**
- 基于 MAC 表的 **学习交换机** 行为
- **防火墙 / 访问控制**(选择性 IP 对阻断)
- 带有协议检测与日志记录的 **实时数据包监控**
- 使用 `ping`(延迟)与 `iperf`(吞吐量)进行 **性能测量**
## 网络拓扑
```
h1 (10.0.0.1) ──┐
├── s1 (OVS Switch) ══ POX Controller (127.0.0.1:6633)
h2 (10.0.0.2) ──┤ OpenFlow 1.0
│
h3 (10.0.0.3) ──┘
Firewall Rule: h3 (10.0.0.3) → h1 (10.0.0.1) >>> DROP
```
**理由:** 单交换机拓扑能够清晰地隔离 SDN 控制平面逻辑。三台主机足以演示两种不同的测试场景(允许与阻断)以及回归测试,且不会引入不必要的复杂性。
## 项目文件
| 文件 | 用途 |
|------|------|
| `sdn_controller.py` | 主 POX 控制器 — 学习交换机 + 防火墙 + 日志 |
| `topology.py` | 自定义 Mininet 拓扑(3 台主机、1 台交换机、远程控制器) |
| `run_tests.py` | 自动化测试运行器 — 执行两种场景并捕获结果 |
| `test_results.txt` | 自动化测试的示例输出 |
| `sample_controller_log.txt` | 展示两种场景的控制器日志示例 |
| `screenshots/` | Wireshark 抓包、流表转储、ping 与 iperf 输出 |
## 安装与设置
### 前置条件
```
sudo apt update
sudo apt install mininet python3 iperf -y
git clone https://github.com/noxrepo/pox
```
### 安装控制器模块
```
# 克隆这个仓库
git clone https://github.com//SDN-Packet-Monitoring-Mininet
cd SDN-Packet-Monitoring-Mininet
# 将控制器复制到 POX ext 文件夹
cp sdn_controller.py pox/pox/ext/
```
## 执行步骤
### 步骤 1 — 启动 POX 控制器
打开 **终端 1**:
```
cd pox
python3 pox.py log.level --DEBUG ext.sdn_controller
```
预期输出:
```
══════════════════════════════════════════════════════════
SDN Controller Started — Monitoring + Firewall
Firewall rules (DROP):
10.0.0.3 → 10.0.0.1
══════════════════════════════════════════════════════════
```
### 步骤 2 — 启动 Mininet 拓扑
打开 **终端 2**:
```
sudo python3 topology.py
```
这将创建 3 台主机与 1 台交换机,并连接至远程 POX 控制器。
### 步骤 3 — 运行测试场景
在 Mininet CLI 中:
**场景 1 — 允许转发(h1 ↔ h2):**
```
mininet> h1 ping h2 -c 5
```
**场景 2 — 防火墙阻断(h3 → h1):**
```
mininet> h3 ping h1 -c 5
```
**回归测试 — 确认 h3 仍可访问 h2:**
```
mininet> h3 ping h2 -c 3
```
**吞吐量测试:**
```
mininet> iperf h1 h2
```
**转储流表:**
```
mininet> sh ovs-ofctl dump-flows s1
```
**端口统计:**
```
mininet> sh ovs-ofctl dump-ports s1
```
### 步骤 4 — 自动化测试(可选)
```
sudo python3 run_tests.py
```
自动运行所有场景并将结果保存至 `test_results.txt`。
## 预期输出
### 场景 1 — 转发(允许)
```
h1 -> h2: ping SUCCEEDS (0% packet loss)
Controller log: Action = FORWARD → Port 2 (flow rule installed)
```
### 场景 2 — 防火墙(阻断)
```
h3 -> h1: ping FAILS (100% packet loss)
Controller log: Action = *** BLOCKED by Firewall ***
[FIREWALL] DROP rule installed: 10.0.0.3 → 10.0.0.1
```
### 两次测试后的流表
```
priority=200, ip, nw_src=10.0.0.3, nw_dst=10.0.0.1 → actions=drop
priority=10, ip, nw_src=10.0.0.1, nw_dst=10.0.0.2 → actions=output:2
priority=10, ip, nw_src=10.0.0.2, nw_dst=10.0.0.1 → actions=output:1
```
## SDN 逻辑详解
### 1. PacketIn 事件
当交换机上不存在匹配流规则时,数据包会通过 `PacketIn` 消息转发至控制器。这是所有监控与决策的入口点。
### 2. 防火墙检查(高优先级 = 200)
在任何转发逻辑之前,控制器会检查数据包的 IP 对是否匹配阻断规则。若匹配:
- 数据包被 **丢弃**(不转发)
- 安装一条 **优先级为 200** 的 `ofp_flow_mod` DROP 规则(无动作)
- 后续属于该流的数据包将由交换机直接丢弃,无需控制器参与
### 3. 学习交换机(优先级 = 10)
- **MAC 学习**:将源 MAC 与进入端口记录在 `mac_table` 中
- **已知目的地址**:安装一条转发流规则(优先级 10),空闲超时时间 30 秒,强制超时 120 秒
- **未知目的地址**:泛洪至所有端口,等待回复以学习路径
### 4. 优先级设计
```
Priority 200 → DROP rules (firewall — evaluated FIRST by switch)
Priority 10 → FORWARD rules (learning switch)
```
这确保了阻断流量不会因存在转发规则而被意外放行。
### 5. 流规则超时
- `idle_timeout=30`:若 30 秒内无匹配数据包,规则将被移除(节省内存)
- `hard_timeout=120`:无论是否有流量,120 秒后强制移除规则(促使重新学习,适应拓扑变化)
## 性能观察
| 指标 | 数值 | 说明 |
|------|------|------|
| 首次 ping 延迟 | ~3–5 ms | 需向控制器发送 PacketIn 以建立流规则 |
| 后续 ping 延迟 | ~0.8 ms | 交换机直接通过已安装规则转发 |
| iperf 吞吐量 | ~9.87 Mbps | 接近线路速率(10 Mbps 链路限制) |
| 阻断包丢失率 | 100% | DROP 规则工作正常 |
| 允许包丢失率 | 0% | 转发功能正常 |
**关键观察:** 首次 ping(约 3 ms)与后续 ping(约 0.8 ms)之间的延迟差异,直接体现了 SDN 流规则缓存的价值 —— 控制器开销仅在每个流建立时产生一次。
## 验证与回归测试
| 测试 | 预期结果 | 实际结果 |
|------|----------|----------|
| h1 → h2 ping | 0% 丢包 | ✓ 通过 |
| h3 → h1 ping | 100% 丢包(被阻断) | ✓ 通过 |
| h3 → h2 ping | 0% 丢包(仅阻断 h3→h1) | ✓ 通过 |
| iperf h1↔h2 | ~10 Mbps | ✓ 通过 |
| 流表优先级 | DROP(200) > FWD(10) | ✓ 通过 |
回归测试(h3 → h2)确认防火墙规则是 **选择性** 的 —— 仅阻断定义的特定 IP 对,而非来自 h3 的所有流量。
## 执行证明
请查看 `screenshots/` 文件夹与 `test_results.txt`,其中包含:
- 控制器终端日志(两种场景)
- `ping` 输出(允许与阻断)
- `iperf` 吞吐量结果
- `ovs-ofctl dump-flows s1`(带优先级的流表)
- `ovs-ofctl dump-ports s1`(端口数据包计数与统计)
- Wireshark 抓包(允许流中可见 ICMP 与 ARP 流量;h1 未收到来自 h3 的流量)
## 参考资料
1. Mininet 文档 — http://mininet.org/
2. POX 控制器维基 — https://noxrepo.github.io/pox-doc/html/
3. OpenFlow 1.0 规范 — https://opennetworking.org/wp-content/uploads/2013/04/openflow-spec-v1.0.0.pdf
4. Open vSwitch 文档 — https://www.openvswitch.org/
5. iperf 网络测试工具 — https://iperf.fr/
标签:FlowMod, Iperf, IP对阻断, MAC表转发, Mininet, OpenFlow, OpenFlow 1.0, OVS, PacketIn, Ping, POX, SDN, Streamlit, 优先级, 关键词SEO, 包记录, 匹配-动作, 协议检测, 单交换机拓扑, 可见性, 吞吐测试, 学习交换机, 延迟测试, 性能测试, 日志, 流表安装, 网络测量, 网络隔离, 访问控制, 超时, 逆向工具, 防火墙, 集中式控制