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, 包记录, 匹配-动作, 协议检测, 单交换机拓扑, 可见性, 吞吐测试, 学习交换机, 延迟测试, 性能测试, 日志, 流表安装, 网络测量, 网络隔离, 访问控制, 超时, 逆向工具, 防火墙, 集中式控制