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:01 和 dl_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)演示或截图时,重点指引他们看这三个地方:
- h2 窗口:正常发送并收到了 ping 的回复。
- h4 窗口:作为真正的收件人,抓到了 ICMP (Ping) 包。
- h1 和 h3 窗口(高光时刻!) :这两个原本不该收到消息的主机,屏幕上疯狂刷出了类似
ARP, Request who-has 10.0.0.4 tell 10.0.0.2的抓包日志。 - 终端 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"。
- 状态转化 :
- 未知状态:向所有端口广播。
- 学习状态:记录(MAC, Port)映射关系。
- 已知状态 :直接通过
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 闭环逻辑:
- Packet-In:交换机遇到不认识的包,求助控制器。
- Logic Processing:控制器运行 Python 代码(学习 MAC、查黑名单、算路径)。
- Flow-Mod / Packet-Out:控制器把决定下发给交换机。
- Hardware Forwarding:交换机根据流表,在底层直接执行任务。
这套原理掌握了,你的实验报告理论部分就能写得非常专业了!需要我针对其中某个具体的 Python 函数(比如 _packet_in_handler)帮你讲解它的代码实现逻辑吗?