系统全功能详细操作手册,从启动到测试

📚 系统全功能详细操作手册(从启动到测试,一步一解释)

🎬 前置准备:环境初始化(所有功能测试前必须执行)

步骤 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

模块加载顺序解释

  1. fault_recovery.py:故障自愈模块(最先加载,负责底层状态监测)
  2. traffic_scheduler.py:流量调度模块(负责转发和带宽限制)
  3. traffic_collector.py:流量采集模块(可选,负责统计流量)
  4. 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=6653Ryu 控制器的标准端口,绝对不能写错
  • 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 数据包的攻击源。

操作步骤
  1. 在 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、视频流攻击)。

操作步骤
  1. 等待 120 秒,让 h2 自动解封

  2. 在 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 的攻击源(耗尽目标连接队列)。

操作步骤
  1. 等待 120 秒,让 h2 自动解封

  2. 在 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=1ack=0)直接判定为攻击
  • 即使攻击速率很低,也会被立刻封禁

1.4 IP 白名单功能

功能说明:白名单内的 IP 永远不会被检测和封禁,用于保护核心服务器和网关。

操作步骤
  1. 修改配置文件:在控制器终端执行

    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

  2. 重启控制器 :按Ctrl+C停止,再重新执行启动命令

  3. 重新启动拓扑

    bash

    运行

    复制代码
    sudo mn -c
    sudo mn --custom topology.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --switch=ovsk,protocols=OpenFlow13
  4. 测试白名单效果

    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。

操作步骤
  1. 在 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 秒自动轮询所有交换机的端口状态。

操作步骤
  1. 观察控制器终端,每 10 秒会自动更新端口状态(后台运行,无明显输出)

  2. 可以通过以下命令手动查看交换机端口状态: 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 时,立刻弹出告警信息。

操作步骤
  1. 模拟端口故障 :新开一个终端执行

    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 简单故障切换逻辑

功能说明:当检测到端口故障时,触发故障切换流程(当前为演示版,可扩展为实际的路径计算)。

操作步骤
  1. 再次模拟端口故障: 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


❗ 常见问题排查

  1. 控制器连不上:检查端口号是否为 6653,控制器是否已经启动。
  2. 攻击不触发:检查攻击源是否在白名单里,是否等待了 120 秒解封时间。
  3. 带宽限制不生效:检查拓扑的端口分配是否正确,是否使用了自定义拓扑。
  4. 端口故障不告警 :检查fault_recovery.py是否正确加载,是否用ovs-vsctl命令模拟故障。
相关推荐
剑神一笑1 小时前
Linux xargs 命令深度解析:从管道到命令构建的桥梁
linux·运维·chrome
ZC跨境爬虫2 小时前
跟着 MDN 学 HTML day_32:(AbstractRange 抽象接口与 DOM 范围操作)
前端·javascript·ui·html·音视频
十子木2 小时前
设置把所有终端移动到最前端的快捷键
前端
陈老老老板2 小时前
Bright Data Web Scraping 实战:用 MCP + Dify 构建 eBay 商品详情采集 AI 工作流(2026)
前端·人工智能
一渊之隔2 小时前
uniapp蓝牙搜索连接展示蓝牙设备包含信号显示
前端·网络·uni-app·bluetooth
Cisyam^2 小时前
Bright Data Web Scraper 实战:构建 TikTok 与 LinkedIn Web Scraping 自动化 Skill(2026)
运维·前端·自动化
李剑一2 小时前
开箱即用!Vue3+TS 视频组件完整代码,自动提取视频第一帧做封面。妈妈再也不用担心我手动截封面了
前端
盐多碧咸。。2 小时前
echarts折线图矩形选择 框选图表
前端·javascript·echarts
羽沢312 小时前
Canvas学习一
前端·css·学习·canvas