此实验基于《软件定义网络实验1-5》,主要内容为:
- MiniNet常用命令
- 如何创建网络拓扑
- OpenFlow流表操作
SDN 环境配置:Mininet + Ryu
1. 测试环境是否搭建成功
启动Ryu,进入 ,启动一个交换机案例app:
启动Mininet, 是创建最简单的默认拓扑, 默认是 Mininet 自带的控制器,这里指定为 远端控制器,即 Ryu。
可以看到 Ryu 检测到网络的运行了:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gWnCFJYZ-1641200088189)(https://secure1.wostatic.cn/static/kVh7tZBkiaueFTfMt1hjTs/image.png)]](https://www.mushiming.com/uploads/202410/28/425fb36bd3a57001.png)
2. 启动 Mininet 可视化界面 MiniEdit
2.2.0以后版本的mininet支持可视化,在 目录下提供 脚本,切换到相应目录下,在终端中执行:
或者这样也能执行:
即打开了 MiniEdit 可视化界面,左边从上到下分别是主机、OpenvSwitch 交换机、传统交换机、传统路由器、链路、控制器。点击后在屏幕上点击可将设备放置到界面中。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9v88XmK-1641200088191)(https://secure1.wostatic.cn/static/tT9GJLzNmo2SNHVvxLysYE/image.png)]](https://www.mushiming.com/uploads/202410/28/7cf3a03d18852745.png)
1. Mininet 常用命令
MIninet 2.3
以上文档中更详细。
创建网络拓扑常用参数:
自动设置设备的MAC地址,MAC地址与IP地址的最后一个字节相同,从而使MAC地址更易读。设置交换机的MAC、主机MAC及IP地址从小到大排列,在拓扑比较复杂的情况,容易识别机器ID。如果不设置,默认下主机随机分配MAC地址,且每次执行mn,,MAC都会改变,有些调试比较困难。
Mininet 内部交互常用命令:
举例:ip 和 port 可不写,默认本机 ip 和 6633或6653
2. 命令实操演示
打开某个 Ryu:
在 Mininet 中执行一个创建好的Python脚本,或者启动Mininet时创建:
查看连通性:
查看网络拓扑:
禁用 s2 和 h1 之间的链路。
连接 s2 和 h1 之间的链路。
查看健壮性
查看节点接口设置和节点 PID
进行网络带宽测试,例如h1和h2:
查看帮助,显示所有可以执行的命令。
退出Mininet。
3. Mininet 创建网络拓扑的常见方式
通过命令行创建
- 单一(single)拓扑
整个网络拓扑中有且只有一个交换机,交换机可下挂一个或多个主机
举例:表示创建了一台交换机交换机下挂3台主机
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECGfzFND-1641200088192)(https://secure1.wostatic.cn/static/rzvNiMdZGZ4V27MX3Y4MYN/image.png)]](https://www.mushiming.com/uploads/202410/28/ace9bad025c4e54b.png)
- 线形(linear)拓扑
交换机连接呈线形排列,且每个交换机所连接主机数目只有一个(交换机与主机数相同)
举例:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQfm8G5u-1641200088193)(https://secure1.wostatic.cn/static/dBbNe7W77P6KTx9GiHzD1D/image.png)]](https://www.mushiming.com/uploads/202410/28/2333a563f74b385e.png)
- 树形(tree)拓扑
交换机连接呈树形排列,且每个交换机下挂的主机一般有多个,类似于数据结构的二叉树。其中depth指的是交换机的深度,表示交换机有两层,fanout表示广度/扇出, 表示每台交换机均下挂3台设备。
举例:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmrcmSHA-1641200088193)(https://secure1.wostatic.cn/static/c9185V7zbdyzUcpyupaNxh/image.png)]](https://www.mushiming.com/uploads/202410/28/a3b1d9cd44d00698.png)
- 自定义拓扑
即用 Python 命令创建,后面讲脚本时候再讲。
通过可视化界面 MiniEdit 创建
打开 MiniEdit 可视化界面,自行点击图标搭建网络拓扑,然后进行配置。
左上角 ,网段可根据需要自己设置(之后主机IP需要根据网段配置),钩上 Start CLI 开启命令行修改拓扑,OpenFLow 可勾选 1.0 和 1.3。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FsBpM7tb-1641200088194)(https://secure1.wostatic.cn/static/uupPLDM75sDHqAvZK6Ryqe/image.png)]](https://www.mushiming.com/uploads/202410/28/8ab2f05af3c612f9.png)
然后修改节点配置,控制器上 ,控制类型 改为远端控制器 Remote,IP为远程控制器的IP(这里就是本机IP)。交换机上设置一下16位 DPID(如0000000000000001),类型为 OpenvSwith 内核模式。主机设置网段和 IP Base 相同。回到命令行可以看到所有配置在命令行都有反馈。
运行网络拓扑之前先去开启Ryu控制器。
然后回到 MiniEdit,点左下角的 Run,即可在命令行看到启动情况。
回到 MiniEdit 停止运行,左上角 保存为 的Python文件到 example 目录,回到命令行在 example 目录下就能看到保存的文件了。后期修改网络拓扑也可以直接修改这个 Python 文件。
通过 Python 脚本创建
打开上一步保存的文件,可看到文件构成:
接下来增加一台主机h4,将h4和s2进行连接,即对应位置增加两行代码(上面注释掉了):
1. OpenFlow协议工作原理
h1想和h2通信,先给s1,s1流表中没有inport=2的流表项,就发送packin消息给控制器,控制器收到后下发packout消息给s1,s1根据收到的流表转发数据包给s2,s2流表中也没有匹配项,也需要发packin给控制器,控制器下发packout,s2进行转发给h2.
h2收到消息后想给h1发送数据包,先给s2,s2也没有inport=2的流表项,联系控制器packin-packout,s2再转发给s1,s1已经有了inport=2的流表项,直接转发给h1。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-de61kIsh-1641200088194)(https://secure1.wostatic.cn/static/4kaB3iWH1WGqY1MyrMfKdj/image.png)]](https://www.mushiming.com/uploads/202410/28/2db85dde796a2fdb.png)
2. OpenFlow 流表常用配置命令
3. 命令实操
打开ryu控制器和mininet,以和之前自建的为例。
拓扑图如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M2PiGk2d-1641200088195)(https://secure1.wostatic.cn/static/muyk9gEzTp5v3FPUQbbryT/image.png)]](https://www.mushiming.com/uploads/202410/28/6a1339d744dc69f2.png)
输入查看流表项:
可见s1和s2中都还没有流表项。
执行一下后再查看流表项,就能看到s1和s2都生成了很多流表项,以s1部分流表项为例:
第一条流表中,表示从s1的1号端口进,表示从s1的2号端口出的转发动作,,分别为原MAC地址和目的MAC地址。
执行即可删除所有流表。
执行手动添加流表
再查询流表可以看到s1和s2都生成了1号端口进2号端口出的流表:
再添加一条从2号端口进1号端口出的流表:
执行,即可ping通,ctrl+c退出ping。
再执行,无法ping通,原因是没有s2的3号端口转发的流表。s2根据流表只能1号端口进转发给2号端口出,3号端口连接的h3无法收到数据包。
删除交换机s1中从2号端口进的所有流表,再查看流表可以看到被删除。
删除所有交换机中输入端口为1的流表项
删除所有交换机中输入端口为2的流表项
再查看流表可见s1和s2中都没有流表项。
添加丢弃从2号端口进的数据包的流表项:
再执行,发现只有h3和h4之间是互通的。原因是2号端口进的数据包都匹配到流表项需要丢弃,h3从3号端口进的和h4从4号端口进的没有流表项匹配,就向控制器申请下发流表。
再查询流表可以看到s2中新增了关于3号4号端口的流表项。
如果这里把2号3号端口进的都丢弃,那么虽然4号进的会下发流表发出数据包,但是2号3号端口不会回应,所以都不能通。
删除所有流表后,即让控制器下发所有端口的流表项。然后再手动添加丢弃2号和3号端口的流表项,再执行,会发现所有通信仍是正常的。
原因是此时手动添加的流表项和控制器下发的流表项共存,而控制器下发的流表项优先级更高,所以会执行控制器下发的流表项。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/2054.html