📚 系统全功能详细操作手册(从启动到测试,一步一解释)
🎬 前置准备:环境初始化(所有功能测试前必须执行)
步骤 1:彻底清理残留环境
命令:
bash
运行
sudo mn -c
sudo service openvswitch-switch restart
逐行解释:
sudo mn -c:清理 Mininet 所有残留进程、虚拟交换机和流表。这是 SDN 测试的黄金法则,上一次测试的残留会导致流表冲突、端口占用等诡异问题。sudo service openvswitch-switch restart:重启 Open vSwitch 服务,确保虚拟交换机处于干净状态。
步骤 2:启动完整控制器(加载所有模块)
命令:
bash
运行
ryu-manager fault_recovery.py traffic_scheduler.py traffic_collector.py ddos_protection.py
模块加载顺序解释:
fault_recovery.py:故障自愈模块(最先加载,负责底层状态监测)traffic_scheduler.py:流量调度模块(负责转发和带宽限制)traffic_collector.py:流量采集模块(可选,负责统计流量)ddos_protection.py:DDoS 防护模块(最后加载,负责攻击检测)
预期成功标志:
plaintext
✅ 故障自愈模块已加载
✅ 端口状态实时监测已开启
✅ 流量智能调度模块已加载
✅ 已加载 3 个流量区域配置
✅ DDoS防护模块3.0已加载(配置文件+动态阈值+TCP SYN)
✅ 交换机 1 已接入:ICMP+UDP+TCP 攻击检测已开启
✅ 交换机 1 已接入故障自愈模块
步骤 3:启动自定义校园拓扑
新开一个终端,执行:
bash
运行
sudo mn --custom topology.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
sudo mn --custom ~/sdn_campus/controller/topology.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
关键参数解释:
--custom topology.py:加载我们自定义的校园拓扑--topo mytopo:使用拓扑中定义的mytopo结构port=6653:Ryu 控制器的标准端口,绝对不能写错protocols=OpenFlow13:使用 OpenFlow 1.3 协议,支持所有高级功能
拓扑端口分配说明:
表格
| 区域 | 主机 | 交换机端口 | 带宽限制 |
|---|---|---|---|
| 教学区 | h1-h3 | 1-3 | 100Mbps |
| 科研区 | h4-h6 | 11-13 | 200Mbps |
| 办公区 | h7-h9 | 21-23 | 50Mbps |
🎬 功能 1:DDoS 攻击防护模块(核心功能)
1.1 ICMP 洪水攻击防御(Ping 洪水)
功能说明:检测并封禁发送大量 ICMP Echo Request 数据包的攻击源。
操作步骤
-
在 Mininet 终端执行: bash
运行
mininet> h2 ping -f h1参数解释 :
h2:攻击源(不在白名单里)ping -f:洪水模式,极速发送 ICMP 包
预期结果
-
控制器终端立刻弹出告警 :
plaintext
⚠️⚠️⚠️ 检测到 ICMP DDoS 洪水攻击!⚠️⚠️⚠️ 🔴 攻击源IP:10.0.0.2 📊 攻击速率:5 包/0.5秒 📊 当前动态阈值:5 包/0.5秒 🚫 自动封禁 120 秒 -
Mininet 里
ping卡住,100% 丢包 -
按
Ctrl + C停止攻击
原理说明
- 系统每 0.5 秒统计一次每个 IP 的 ICMP 包数量
- 当数量超过动态阈值(默认 5 包 / 0.5 秒)时,判定为攻击
- 下发优先级 999 的丢弃流表,封禁攻击源 IP 120 秒
1.2 UDP 洪水攻击防御
功能说明:检测并封禁发送大量 UDP 数据包的攻击源(模拟 DNS、视频流攻击)。
操作步骤
-
等待 120 秒,让 h2 自动解封
-
在 Mininet 终端执行: bash
运行
mininet> h2 hping3 --udp -p 8080 --flood h1参数解释 :
--udp:指定发送 UDP 协议包-p 8080:指定目的端口 8080(模拟 HTTP 代理流量)--flood:洪水模式,极速发包
预期结果
-
控制器终端立刻弹出告警 :
plaintext
⚠️⚠️⚠️ 检测到 UDP DDoS 洪水攻击!⚠️⚠️⚠️ 🔴 攻击源IP:10.0.0.2 📊 攻击速率:6 包/0.5秒 📊 当前动态阈值:5 包/0.5秒 🚫 自动封禁 120 秒 -
Mininet 里 hping3 卡住,100% 丢包
-
按
Ctrl + C停止攻击
原理说明
- 复用 ICMP 的速率统计逻辑,只需要检测 IP 协议号为 17 的数据包
- 这种设计符合 "开闭原则":对扩展开放,对修改关闭
1.3 TCP SYN 洪水攻击防御(最经典的 DDoS)
功能说明:检测并封禁只发送 SYN 包、不回复 ACK 的攻击源(耗尽目标连接队列)。
操作步骤
-
等待 120 秒,让 h2 自动解封
-
在 Mininet 终端执行: bash
运行
mininet> h2 hping3 -S -p 80 --flood h1参数解释 :
-S:只设置 TCP 的 SYN 标志位-p 80:目标端口 80(模拟 HTTP 服务攻击)
预期结果
-
控制器终端立刻弹出告警 :
plaintext
⚠️⚠️⚠️ 检测到 TCP SYN DDoS 洪水攻击!⚠️⚠️⚠️ 🔴 攻击源IP:10.0.0.2 📊 攻击速率:2 包/0.5秒 📊 当前动态阈值:5 包/0.5秒 🚫 自动封禁 120 秒 -
Mininet 里 hping3 卡住,100% 丢包
-
按
Ctrl + C停止攻击
原理说明
- 这是基于特征的检测,不是基于速率的检测
- 正常 TCP 连接是
SYN → SYN+ACK → ACK三次握手 - 攻击者只发
SYN,不回复ACK,系统通过检查 TCP 标志位(syn=1且ack=0)直接判定为攻击 - 即使攻击速率很低,也会被立刻封禁
1.4 IP 白名单功能
功能说明:白名单内的 IP 永远不会被检测和封禁,用于保护核心服务器和网关。
操作步骤
-
修改配置文件:在控制器终端执行
bash
运行
nano config.json把
10.0.0.2加入白名单:json
{ "whitelist": ["10.0.0.1", "10.0.0.2", "10.0.0.100", "10.0.0.254"], "base_threshold": 5, "block_time": 120, "history_window": 600 }保存退出:
Ctrl+O→ 回车 →Ctrl+X -
重启控制器 :按
Ctrl+C停止,再重新执行启动命令 -
重新启动拓扑:
bash
运行
sudo mn -c sudo mn --custom topology.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13 -
测试白名单效果:
bash
运行
mininet> h2 hping3 --udp -p 8080 --flood h1
预期结果
- ✅ 控制器终端没有任何告警!
- ✅ 即使运行 1 分钟,也不会有任何封禁记录
- ✅ 按
Ctrl + C停止,一切正常
原理说明
- 白名单判断放在攻击检测逻辑的最前面
- 如果源 IP 在白名单里,直接
return,不执行任何后续检测 - 使用 Python 的
set类型存储白名单,查找时间复杂度为 O (1),效率极高
🎬 功能 2:流量智能调度模块
2.1 教学区带宽限制测试(100Mbps)
功能说明:教学区端口(1-10)的最大带宽限制为 100Mbps。
操作步骤
-
在 Mininet 终端执行: bash
运行
mininet> iperf h1 h2命令解释 :
iperf是网络带宽测试工具,测试 h1 到 h2 的最大带宽。
预期结果
plaintext
------------------------------------------------------------
Client connecting to 10.0.0.2, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.1 port 45014 connected with 10.0.0.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 119 MBytes 99.8 Mbits/sec
✅ 带宽稳定在98-102Mbps之间,符合 100Mbps 的限制。
2.2 科研区带宽限制测试(200Mbps)
功能说明:科研区端口(11-20)的最大带宽限制为 200Mbps,优先级最高。
操作步骤
bash
运行
mininet> iperf h4 h5
预期结果
plaintext
------------------------------------------------------------
Client connecting to 10.0.0.5, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.4 port 38226 connected with 10.0.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 238 MBytes 199 Mbits/sec
✅ 带宽稳定在195-205Mbps之间,符合 200Mbps 的限制。
2.3 办公区带宽限制测试(50Mbps)
功能说明:办公区端口(21-30)的最大带宽限制为 50Mbps,优先级最低。
操作步骤
bash
运行
mininet> iperf h7 h8
预期结果
plaintext
------------------------------------------------------------
Client connecting to 10.0.0.8, TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 3] local 10.0.0.7 port 52138 connected with 10.0.0.8 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 59.6 MBytes 49.9 Mbits/sec
✅ 带宽稳定在48-52Mbps之间,符合 50Mbps 的限制。
原理说明
- 基于 OpenFlow 的流表优先级实现带宽隔离
- 不同区域的流量被匹配到不同的流表,应用不同的带宽限制
- 配置文件驱动,修改
bandwidth_config.json即可调整带宽分配,无需改代码
✅ 正确的启动顺序(严格按这个来,100% 成功)
步骤 1:彻底杀死所有残留进程
bash
运行
# 杀死所有ryu进程
sudo pkill -f ryu-manager
# 杀死所有mininet进程
sudo pkill -f mn
# 彻底清理环境
sudo mn -c
sudo service openvswitch-switch restart
步骤 2:先启动控制器
bash
运行
ryu-manager fault_recovery.py traffic_scheduler.py traffic_collector.py
✅ 等 3 秒,直到看到所有模块都加载完成,出现这一行:
plaintext
✅ 交换机 1 成功接入控制器
这一步非常重要!必须等控制器完全启动,再启动 Mininet!
步骤 3:再启动 Mininet
新开一个终端,执行:
bash
运行
cd ~/sdn_campus/controller/
sudo mn --custom topology.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
✅ 成功标志 :Mininet 输出里绝对不能出现 *** Starting controller c0 这一行!如果出现了,立刻按Ctrl+C退出,重新从步骤 1 开始。
🧪 验证控制器是否真的连上了
在 Mininet 启动后,新开第三个终端,执行:
bash
运行
sudo ovs-vsctl show
✅ 正确的输出应该包含这一行:
plaintext
Controller "tcp:127.0.0.1:6653"
is_connected: true
如果显示is_connected: false,说明还是没连上,重新从步骤 1 开始。
🚀 现在测试带宽(100% 出结果)
第一步:先测试连通性
bash
运行
mininet> pingall
✅ 预期:0% packet loss,所有主机都能 ping 通。
第二步:用最稳妥的分两端方式启动 iperf
1. 在 h2 上启动 iperf 服务器
bash
运行
mininet> h2 iperf -s &
-s:服务器模式&:后台运行
2. 在 h1 上启动 iperf 客户端
bash
运行
mininet> h1 iperf -c 10.0.0.2 -t 10
-c 10.0.0.2:连接到 h2 的 IP-t 10:测试 10 秒
✅ 教学区预期结果:
plaintext
[ 3] 0.0-10.0 sec 119 MBytes 99.8 Mbits/sec
✅ 科研区预期结果:
bash
运行
mininet> h5 iperf -s &
mininet> h4 iperf -c 10.0.0.5 -t 10
plaintext
[ 3] 0.0-10.0 sec 238 MBytes 199 Mbits/sec
✅ 办公区预期结果:
bash
运行
mininet> h8 iperf -s &
mininet> h7 iperf -c 10.0.0.8 -t 10
🎬 功能 3:故障自愈模块
3.1 端口状态实时监测
功能说明:系统每 10 秒自动轮询所有交换机的端口状态。
操作步骤
-
观察控制器终端,每 10 秒会自动更新端口状态(后台运行,无明显输出)
-
可以通过以下命令手动查看交换机端口状态: bash
运行
# 新开一个终端执行 sudo ip link set s1-eth1 up sudo ip link set s1-eth1 down sudo ovs-vsctl get Interface s1-eth1 link_state
预期结果
可以看到所有端口的状态都是UP:
plaintext
port 1: eth1
addr: 00:00:00:00:00:01
config: 0
state: 0
3.2 端口故障自动告警
功能说明:当检测到端口 DOWN 时,立刻弹出告警信息。
操作步骤
-
模拟端口故障 :新开一个终端执行
bash
运行
sudo ovs-vsctl set Interface s1-eth1 admin_state=down命令解释:把交换机 s1 的 1 号端口(连接 h1 的端口)设置为 DOWN 状态,模拟网线被拔掉。
预期结果
控制器终端立刻弹出告警:
plaintext
⚠️⚠️⚠️ 端口状态变化告警!⚠️⚠️⚠️
🔴 交换机ID:1
🔴 端口号:1
🔴 变化原因:端口状态修改
🔴 当前状态:DOWN
恢复端口
bash
运行
sudo ovs-vsctl set Interface s1-eth1 admin_state=up
控制器会立刻弹出端口恢复的告警。
3.3 简单故障切换逻辑
功能说明:当检测到端口故障时,触发故障切换流程(当前为演示版,可扩展为实际的路径计算)。
操作步骤
-
再次模拟端口故障: bash
运行
sudo ovs-vsctl set Interface s1-eth1 admin_state=down
预期结果
在端口告警之后,会显示故障切换提示:
plaintext
🔄 正在执行故障切换...
- 故障端口:1
- 提示:实际项目中可在此处添加备用路径计算逻辑
🔄 故障切换提示完成
原理说明
- 系统通过监听
EventOFPPortStatus事件实时感知端口状态变化 - 当端口 DOWN 时,调用
_simple_failover函数执行故障切换 - 实际项目中,可以结合拓扑信息,使用 Dijkstra 算法计算备用路径,并下发新的流表
🎬 系统优雅停止步骤
步骤 1:停止 Mininet
在 Mininet 终端执行:
bash
运行
mininet> exit
步骤 2:清理环境
bash
运行
sudo mn -c
步骤 3:停止控制器
在控制器终端按Ctrl + C。
❗ 常见问题排查
- 控制器连不上:检查端口号是否为 6653,控制器是否已经启动。
- 攻击不触发:检查攻击源是否在白名单里,是否等待了 120 秒解封时间。
- 带宽限制不生效:检查拓扑的端口分配是否正确,是否使用了自定义拓扑。
- 端口故障不告警 :检查
fault_recovery.py是否正确加载,是否用ovs-vsctl命令模拟故障。