5101实验

Lab 03 Task 1 (Simple Switch 智能转发验证) 步骤总结。

你可以直接把这个作为复习笔记或验收时的参考:

🟢 零、 环境准备 (所有终端必做)

为了操作清晰,建议同时打开 3 个终端窗口 (T1, T2, T3),并且每个窗口都要先进入正确的代码目录:

bash 复制代码
conda activate myenv
cd ~/Desktop/Code

🚀 一、 具体操作步骤

第 1 步:清理环境与启动控制器 (终端 1)

首先确保没有上一个实验的残留,然后启动 Ryu 基础交换机应用(扮演"交警"):

bash 复制代码
sudo mn -c
ryu-manager ryu.app.simple_switch_13

(敲完回车后,看到 loading app... 就让它挂在后台,不要再动这个窗口)

第 2 步:启动虚拟网络拓扑 (终端 2)

创建网络并连接到控制器(一定要加 --mac,让 MAC 地址变得规整易读):

bash 复制代码
sudo mn --switch ovsk --controller remote --custom ceg_topo.py --topo cegTopo --mac

(必须等待几秒钟,直到屏幕最后一行出现 mininet> 提示符,才能进行下一步)

第 3 步:测试主机连通性 (终端 2)

mininet> 提示符下,让 h1 向 h2 发送 4 个数据包:

bash 复制代码
h1 ping -c 4 h2

(预期结果:应该看到 4 packets transmitted, 4 received, 0% packet loss,证明通信成功。同时终端 1 会刷出大量 packet in 日志)

第 4 步:验证流表学习结果 (终端 3)

去查看底层交换机 s1 到底有没有学到具体的转发规则:

bash 复制代码
sudo ovs-ofctl dump-flows s1

(预期结果:能看到多条规则,且包含清晰的 dl_src=00:00:00:00:00:01dl_dst=00:00:00:00:00:02 等 MAC 地址,证明控制器已将精准路线下发给了交换机)

Lab 03 Task 2 (验证 Hub 广播风暴) 的完整步骤总结,绝对是你的"防翻车"终极小抄。

你可以直接对照着这份清单进行复现或验收:

🟢 零、 环境准备 (所有终端必做)

建议保持 2 个主终端窗口 (T1, T2),并且每个窗口都要先进入正确的代码目录:

bash 复制代码
conda activate myenv
cd ~/Desktop/Code

🚀 一、 具体操作步骤

第 1 步:清理环境与启动"笨交警" (终端 1)

彻底清理上一局的残留,然后启动 Hub 控制器(它只会无脑广播):

bash 复制代码
sudo mn -c
ryu-manager hub_controller.py

(敲完回车后,看到 loading app... 就让它挂在后台)

第 2 步:启动虚拟网络拓扑 (终端 2)

创建网络并连接到控制器(切记带上 --mac 参数):

bash 复制代码
sudo mn --switch ovsk --controller remote --custom ceg_topo.py --topo cegTopo --mac

(等待屏幕最后出现 mininet> 提示符)

第 3 步:召唤独立主机窗口 (终端 2)

mininet> 提示符下,为 4 台主机开独立的小黑框:

bash 复制代码
xterm h1 h2 h3 h4

(把弹出的 4 个小窗口平铺在屏幕上,方便同时观察)

第 4 步:在无辜主机上开启监听 (h1, h3, h4 窗口)

分别在对应的小窗口里输入以下抓包命令并回车,让它们处于监听状态:

  • h1 窗口:tcpdump -n -i h1-eth0
  • h3 窗口:tcpdump -n -i h3-eth0
  • h4 窗口:tcpdump -n -i h4-eth0

第 5 步:触发私聊,观察风暴 (h2 窗口)

h2 窗口里,让它只发给 h4(IP 是 10.0.0.4):

bash 复制代码
ping -c 4 10.0.0.4

👀 二、 验收与截图核心看点

向老师(TA)演示或截图时,重点指引他们看这三个地方:

  1. h2 窗口:正常发送并收到了 ping 的回复。
  2. h4 窗口:作为真正的收件人,抓到了 ICMP (Ping) 包。
  3. h1 和 h3 窗口(高光时刻!) :这两个原本不该收到消息的主机,屏幕上疯狂刷出了类似 ARP, Request who-has 10.0.0.4 tell 10.0.0.2 的抓包日志。
  4. 终端 1 (Ryu) :正在疯狂刷屏 Flooding packet

结论:这完美证明了 Hub(集线器)的缺陷------它没有学习能力,只会把收到的数据包像大喇叭一样泛洪(Flooding)给所有端口,导致网络拥堵和隐私泄露。

按照这个步骤来,你的 Lab 03 就可以完美收官了!接下来咱们是一鼓作气复现 Lab 04 (自学习交换机),还是你需要先休息调整一下?

没错!你一眼就看穿了 Lab 04 最容易让人抓狂的"真凶"------终端路径(Path)

在 SDN 实验中,每一个终端窗口就像是一个独立的"办事员",如果它没进到 Code 文件夹里,它就找不到那张名为 ceg_topo.py 的"地图",整个实验就会卡死在门口。

为了让你验收时行云流水,我为你总结了这份 Lab 04 (自学习交换机) 终极无错步骤


🟢 阶段零:核心咒语(所有终端必做)

打开 3 个终端窗口 (T1, T2, T3) ,在每一个窗口里先敲这两行:

bash 复制代码
conda activate myenv
cd ~/Desktop/Code

检查点 :确认所有窗口的绿字末尾都带着 ~/Desktop/Code$


🚀 阶段一:搭建环境与启动"大脑"

1. 清理并启动控制器 (终端 1)

bash 复制代码
sudo mn -c
ryu-manager learning_switch.py
  • 看点 :看到 loading app... 即可。这个窗口是"大脑",启动后千万别再碰它

2. 启动虚拟网络 (终端 2)

bash 复制代码
sudo mn --switch ovsk --controller remote --custom ceg_topo.py --topo cegTopo --mac
  • 看点 :必须等几秒,直到出现 mininet> 提示符。加 --mac 是为了让 MAC 地址整齐划一(00:00:00:00:00:01 等)。

🧠 阶段二:见证"进化" (验收与截图核心)

3. 【高光截图 1】展示"空脑子"状态 (终端 3)

在没有任何通信时,输入:

bash 复制代码
sudo ovs-ofctl dump-flows s1
  • 原理 :此时交换机只认识控制器(actions=CONTROLLER),不认识任何主机。

4. 触发全网自动学习 (终端 2)

mininet> 提示符下输入:

bash 复制代码
pingall
  • 原理:当 h1 ping h2 时,交换机不认识它们,会把包发给控制器;控制器记下它们的 MAC 和端口,并把规则下发回交换机。
  • 看点 :你会看到 终端 1 疯狂刷出 Learned MAC...Forwarding to known host

5. 【高光截图 2】展示"老司机"状态 (终端 3)

pingall 完成(0% dropped)后,再次输入:

bash 复制代码
sudo ovs-ofctl dump-flows s1
  • 原理 :此时你会看到一长串整齐的 dl_dst=... 规则。这意味着交换机已经"学会"了所有路线,以后再通信就不需要麻烦控制器了。

💡 给你的验收锦囊

  • 如果 TA 问你 :"为什么要先跑 pingall 才能看到流表?"
  • 你可以这样专业地回答 :"因为这是 Reactive(响应式) 流表下发。交换机最初是'空'的,只有当产生实际流量(Traffic)触发 Packet-In 上报时,控制器才会根据学习到的 MAC 地址动态下发流表规则。"

**恭喜你,Lab 04 已经被你彻底看穿了!准备好迎接最后的大结局------Lab 05 (防火墙) 了吗?需要我现在把 Lab 05 的步骤发给你吗?**太棒了!终于来到了最后的"大结局"------Lab 05 (防火墙 Firewall)

这个实验是之前所有知识的集大成者。你将把 Ryu 控制器变成一个"保安",它不仅会学习路径,还会根据 IP 地址TCP 端口号 (80) 来决定谁能过、谁不能过。

🟢 阶段零:核心咒语 (所有终端必做)

打开 3 个终端窗口 (T1, T2, T3),依然是那句老话,先进入正确的"房间":

bash 复制代码
conda activate myenv
cd ~/Desktop/Code

检查点 :确认所有窗口绿字末尾都是 ~/Desktop/Code$


🚀 第一阶段:部署防火墙保安

1. 清理环境并启动防火墙 (终端 1)

我们要启动那个带有拦截逻辑的 Python 脚本:

bash 复制代码
sudo mn -c
ryu-manager firewall_http.py
  • 看点 :看到 loading app... 即可。此时"保安"已经拿着黑名单上岗了。

2. 启动虚拟网络 (终端 2)

bash 复制代码
sudo mn --switch ovsk --controller remote --custom ceg_topo.py --topo cegTopo --mac
  • 看点 :等待出现 mininet> 提示符。

🛡️ 第二阶段:验证拦截逻辑 (验收核心)

根据代码定义,h2 (10.0.0.2)h3 (10.0.0.3) 是被拉黑的。

Task 2: 验证 Ping (ICMP) 拦截

3. 测试黑名单 h2 (终端 2)

bash 复制代码
h2 ping -c 3 h1
  • 预期结果100% packet loss。同时看 终端 1 ,会刷出红色日志:Blocking ICMP traffic from 10.0.0.2

4. 测试白名单 h4 (终端 2)

bash 复制代码
h4 ping -c 3 h1
  • 预期结果0% packet loss。证明防火墙只拦坏人,不误伤好人。

Task 3: 验证网页 (HTTP) 拦截

5. 在 h1 启动 Web 服务器 (终端 2)

bash 复制代码
h1 python3 -m http.server 80 &

(回车后如果没反应,再敲一下回车让 mininet> 出来)

6. 测试黑名单 h2 访问网页 (终端 2)

bash 复制代码
h2 curl http://10.0.0.1
  • 预期结果 :终端卡住不动。同时 终端 1 刷出:Blocking HTTP traffic from 10.0.0.2。按 Ctrl+C 强行停止。

7. 【高光时刻】测试白名单 h4 访问网页 (终端 2)

bash 复制代码
h4 curl http://10.0.0.1
  • 预期结果 :瞬间刷出一大串 HTML 源代码(<!DOCTYPE HTML...)。这就是你 Lab 05 最核心的满分截图!

🧠 进阶:如何向老师展示你懂原理?

如果老师(TA)指着流表问你:"为什么 h2 访问不了?"

你可以去 终端 3 敲:

bash 复制代码
sudo ovs-ofctl dump-flows s1

专业回答

"因为在我们的控制器代码中,当 Packet-In 上报时,我们先检查了 ip_pkt.src。如果它在 blocked_ips 列表中,我们就直接执行 return,不给交换机下发任何转发指令。交换机不知道怎么处理,数据包就会被丢弃(Drop)。"

按照这个流程敲一遍吧!如果 h4 成功抓到了网页代码,记得截一张"全家福"发给我,咱们就算正式完结撒花了!

既然你已经亲手跑通了所有实验,现在正是把这些操作经验 升华为底层原理的最佳时机。

这三个实验(Lab 03 - Lab 05)串联起来,正好展示了网络设备从"最笨"到"智能化"再到"安全性"的进化过程。


🟢 Lab 03: Hub vs. Switch (泛洪与精准转发)

1. Hub (集线器) 原理:

  • 行为 :当 Hub 收到一个数据包时,它完全不看收件人是谁,而是直接把包复制 并发送到除了来源端口以外的所有端口
  • 缺点:这会造成极大的带宽浪费和安全隐患(所有人都能听到悄悄话),也就是你实验中看到的"广播风暴"。

2. Simple Switch (基础交换机) 原理:

  • 行为 :在 SDN 模式下,交换机起初是"空脑子"。当它收到包时,会通过 Packet-In 消息询问控制器。
  • 控制器介入:Ryu 控制器查看包的源 MAC 地址和入端口,并记录下来。
  • 下发流表 :控制器发送 Flow-Mod 消息,告诉交换机:"以后凡是发往 MAC A 的包,直接从端口 1 扔出去。"
  • 结果:后续同样的包不再询问控制器,直接实现点对点精准转发。

🔵 Lab 04: Learning Switch (自学习算法)

这是对 Lab 03 的进阶,核心在于 MAC 地址表 (MAC Address Table) 的动态构建过程:

  • 未学先猜:当控制器看到一个目的 MAC 还没在自己小本本上的包时,它会命令交换机进行一次"洪泛(Flood)",以寻找目标。
  • 逆向学习:关键在于**"看发件人"**。每当有一个包从端口 1 进来,控制器就知道:"哦,住在端口 1 的人叫 MAC A"。
  • 状态转化
    1. 未知状态:向所有端口广播。
    2. 学习状态:记录(MAC, Port)映射关系。
    3. 已知状态 :直接通过 actions=output:port 下发流表,实现硬件加速转发。

🔴 Lab 05: Firewall (应用层防火墙)

防火墙实验展示了 SDN 最强大的功能:基于规则的流量治理

  • 五元组过滤 :不同于前两个实验只看 MAC 地址,防火墙会"深挖"数据包的协议栈,检查 源IP、目的IP、协议类型(ICMP/TCP)、目的端口(80)
  • 拦截逻辑 (Match & Drop)
    • 控制器预判 :当 Packet-In 到达控制器时,代码会进入一个 if-else 判断:if pkt_ip.src in blocked_ips: return
    • 静默丢弃 :因为控制器直接 return 了,没有给交换机发回任何 Packet-Out 或流表,交换机收不到指令,默认就会丢弃这个包。
  • 应用层识别
    • HTTP 拦截:代码识别出 TCP 端口为 80 的流量,专门针对网页访问进行阻断。
    • ICMP 拦截:专门针对 Ping 命令进行阻断。

总结:SDN 的核心工作流

这三个实验其实都在跑同一个 SDN 闭环逻辑

  1. Packet-In:交换机遇到不认识的包,求助控制器。
  2. Logic Processing:控制器运行 Python 代码(学习 MAC、查黑名单、算路径)。
  3. Flow-Mod / Packet-Out:控制器把决定下发给交换机。
  4. Hardware Forwarding:交换机根据流表,在底层直接执行任务。

这套原理掌握了,你的实验报告理论部分就能写得非常专业了!需要我针对其中某个具体的 Python 函数(比如 _packet_in_handler)帮你讲解它的代码实现逻辑吗?

相关推荐
IpdataCloud2 小时前
直播打赏异常排查:大额打赏IP来自高风险地区?用IP查询定位触发人工审核
网络·tcp/ip·网络安全·ip
riyue6662 小时前
封装 WebSocket 工具类
网络·vue.js·websocket·网络协议·v
2501_918126912 小时前
学习所有6502写游戏控制器的语句
java·linux·网络·汇编·嵌入式硬件
南梦浅2 小时前
三层网络搭建(思科模拟器)
网络·计算机网络
txinyu的博客3 小时前
解析muduo源码之 TcpConnection.h & TcpConnection.cc
网络
小义_3 小时前
随笔 1(Linux)
linux·运维·服务器·网络·云原生·红帽
进击的雷神3 小时前
主办方过滤、展位号模糊提取、多层级官网爬取、缅文编码解码——缅甸塑料展爬虫四大技术难关攻克纪实
网络·爬虫·python
上海云盾-小余3 小时前
CC 攻击与 DDoS 联动防护:如何构建一体化流量清洗架构
网络·安全·游戏·架构·ddos
柯儿的天空3 小时前
【OpenClaw 全面解析:从零到精通】第 005 篇:OpenClaw 在 macOS 上的安装与部署实战
人工智能·macos·自然语言处理·ai作画