mininet-2
(12.2.1.1)--实训项目三-Mininet可视化应用.mp4_哔哩哔哩_bilibili
Mininet MAC地址学习实验
实验描述: Mininet MAC地址学习实验
难易级别: 基础
实验课时: 2.0
-
任务目的
1、了解交换机的MAC地址学习过程。
2、了解交换机对已知单播、未知单播和广播帧的转发方式。 -
任务环境
设备名称 软件环境(镜像) 硬件环境 主机 Ubuntu 14.04桌面版
Mininet 2.2.0CPU:1核 内存:2G 磁盘:20G 注:系统默认的账户为root/root@openlab,openlab/user@openlab。
-
任务内容
通过Mininet模拟二层交换机和两个主机,通过两个主机通信来了解交换机MAC地址学习过程。
-
实验原理
MAC(media access control,介质访问控制)地址是识别LAN节点的标识。MAC对设备(通常是网卡)接口是全球唯一的,MAC地址为48位,用12个16进制数表示。前6个16进制数字由IEEE管理,用来识别生产商或者厂商,构成OUI(Organization Unique Identifier,组织唯一识别符)。后6个包括网卡序列号,或者特定硬件厂商的设定值。对于一个网卡来说,MAC地址是它的一个物理地址,是不可变的,而IP地址是它对应的一个逻辑地址,是可以更改的。说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。交换机在接收到数据帧以后,首先、会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着、会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数据帧从非接受接口发送出去(也就是广播)。下图详细讲解交换机传输数据帧的过程。
![]()
-
主机A会将一个源MAC地址为自己目标MAC地址为主机B的数据帧发送给交换机。
-
交换机收到此数据帧后,首先将数据帧中的源MAC地址和对应的接口(接口为f
0/1)记录到MAC地址表中。 -
然后交换机会检查自己的MAC地址表中是否有数据帧中的目标MAC地址的信息,如果有,则从MAC地址表中记录的接口发送出去;如果没有,则会将此数据帧从非接收接口的所有接口发送出去(也就是除了f0/1接口)。
-
这时,局域网的所有主机都会收到此数据帧,但是只有主机B收到此数据帧时会响应这个广播,并回应一个数据帧,此数据帧中包括主机B的MAC地址。
-
当交换机收到主机B回应的数据帧后,也会记录数据帧中的源MAC地址(也就是主机B的MAC地址),这时,再当主机A和主机B通信时,交换机根据MAC地址表中的记录,实现单播了。
当局域网存在多个交换机互联的时候,交换机的MAC地址表记录过程如下图所示。
![]()
-
主机A将一个源MAC地址为自己,目标MAC地址主机C的数据帧发送给交换机。
-
交换机1收到此数据帧后,会学习源MAC地址,并检查MAC地址表,发现没有目标MAC地址的记录,则会将数据帧广播出去,主机B和交换机2都会收到此数据帧。
-
交换机2收到此数据帧后也会将数据帧中的源MAC地址和对应的接口记录到MAC地址表中,并检查自己的MAC地址表,发现没有目标MAC地址的记录,则会广播此数据帧。
-
主机C收到数据帧后,会响应这个数据帧,并回复一个源MAC地址为自己的数据帧,这时交换机1和交换机2都会将主机C的MAC地址记录到自己的MAC地址表中,并且以单播的形式将此数据帧发送给主机A。
-
这时,主机A和主机C通信就是一单播的形式传输数据帧了,主机B和主机C通信如上述过程一样,因此交换机2的MAC地址表中记录着主机A和主机B的MAC地址都对应接口f0/1。
从上面的两幅图可以看出,交换机具有动态学习源MAC地址的功能,并且交换机的一个接口可以对应多个MAC地址,但是一个MAC地址只能对应一个接口。本次实验将通过Mininet来验证交换机的MAC地址学习功能。
注意:交换机动态学习的MAC地址默认只有300S的有效期,如果300S内记录的MAC地址没有通信,则会删除此记录。
-
-
实验步骤
一、MAC地址学习操作
步骤1. 登录Mininet虚拟机,执行以下命令创建一个线型拓扑,控制器设置为无。
$ sudo mn --topo linear --mac --switch ovsk --controller=none![]()
步骤2. 执行 nodes 命令查看全部节点,如下图所示。
![]()
步骤3. 执行 net 命令查看链路信息,如下图所示。
![]()
步骤4. 执行 dump 命令查看节点信息,如下图所示。
![]()
步骤5. 再打开一个终端(Terminal窗口2),执行如下命令来打开交换机s1和交换机s2的二层。
$ sudo ovs-vsctl del-fail-mode s1 $ sudo ovs-vsctl del-fail-mode s2说明:因为交换机s1和交换机s2是两个SDN交换机,在启动Mininet时没有指定任何控制器,交换机中没有流表的存在,无法进行转发操作。主机h1和主机h2无法进行通信。执行上述命令后,s1和s2就是两台普通的二层交换机了。
步骤6. 在Terminal窗口1中,执行如下命令进行两台主机Ping操作。
> h1 ping h2![]()
步骤7. 在Terminal窗口2中执行如下命令,查看流表项。
$ sudo ovs-ofctl dump-flows s1 $ sudo ovs-ofctl dump-flows s2![]()
由上图可以看到有两条数据帧转发表,但并不是SDN交换机中的流表。这表明交换机已进行过MAC地址学习。
二、MAC地址学习分析
步骤1. 如下图所示,假设交换机A和B的MAC地址表是空的,主机11向主机33发送数据帧。
![]()
步骤2. 交换机A接收到数据帧后,执行以下操作。
(1) 交换机A学习主机11的MAC地址和端口号,此时交换机A的MAC地址表如下图所示。
![]()
(2) 交换机A查看自己的MAC地址表。
(3) 如果MAC地址表中有目的主机MAC地址则直接进行数据转发,如果没有则继续执行步骤4。
(4) 交换机A向除源数据发送端口外的其他所有端口发送广播(这里交换机A从端口2和端口3向外发送广播)。步骤3. 交换机B在接收到数据帧后,执行以下操作。
(1) 交换机B学习源MAC地址和端口号,此时交换机B的MAC地址表如下图所示。
![]()
(2) 交换机B查看自己的MAC地址表。
(3) 交换机B向除源数据发送端口外的其他所有端口发送广播(这里交换机B从端口1和端口2向外发送广播)。
步骤4. 主机22查看接收到的数据帧,发现目标MAC地址不是自己,丢弃数据帧。
步骤5. 主机33接收数据帧,主机44丢弃数据帧。
步骤6. 假设这时候主机44要给主机11发送数据帧。
步骤7. 交换机B接收到数据帧后,执行以下操作。
(1) 交换机B学习主机44的MAC地址和端口号,此时交换机B的MAC地址表如下图所示。
![]()
(2) 交换机B查看自己的MAC地址表,根据MAC地址表中的条目,单播转发数据到端口3。
步骤8. 交换机A在接收到数据帧后,执行以下操作。
(1) 交换机A学习源MAC地址和端口号,此时交换机A的MAC地址表,如下图所示。
![]()
(2) 交换机A查看自己的MAC地址表,根据MAC地址表中的条目,单播转发数据到端口1。
(3) 主机11接收到数据帧。至此,MAC地址学习过程结束。
基于Mininet的VXLAN实验
实验描述: 基于Mininet的VXLAN实验
难易级别: 基础
实验课时: 2.0
-
任务目的
1、使用VXLAN连接两个独立的Mininet环境,并通过在Mininet环境中设置搭建VXLAN,感受VXLAN的优势。
2、在没有控制器的条件下,通过设置流表的方式确保网络的连通性。 -
任务环境
设备名称 软件环境(镜像) 硬件环境 交换机 Ubuntu 14.04命令行版
Open vSwitch 2.3.1CPU:2核 内存:4G 磁盘:20G 主机 Ubuntu 14.04桌面版
Mininet 2.2.0_ovs2.3.0CPU:1核 内存:2G 磁盘:20G 注:系统默认的账户为root/root@openlab,openlab/user@openlab。
-
任务内容
1、基于SDN控制器创建跨主机的VXLAN隧道。
2、基于OVS命令设置流表,创建跨主机的VXLAN隧道。 -
实验原理
如下图所示,在两台虚拟机中利用Mininet创建两个网络,利用VXLAN连通这两个Mininet环境。关闭默认的控制器后,通过设置流表确保网络的连通性。本实验要求OVS版本在2.0.1以上,实验拓扑如下图所示。
![]()
-
实验步骤
一、实验环境检查
步骤1 登录主机host1,单击终端图标,打开终端,执行ifconfig命令查看主机IP,如下所示。
由上图可知,网卡eth1未分配IP地址。步骤2 执行命令sudo vim /etc/network/interfaces,为eth1分配静态IP地址,如下所示。
步骤3 执行命令sudo ifdown eth1 && sudo ifup eth1,重启网卡eth1,如下所示。
由上图可知,网卡eth1的IP地址已经正确分配。步骤4 登录主机host2,重复上述操作,为主机host2的网卡eth1配置静态IP地址10.0.0.7,如下所示。
步骤5 登录交换机,用命令ovs-vsctl del-fail-mode br-sw,修改OVS交换机为传统模式。修改后如下所示。
![]()
二、基于控制器实现
步骤1 登录主机host1,执行命令sudo mn --topo=single,1,在host1中创建拓扑(一台交换机连接一台主机)。
![]()
步骤2 在Mininet CLI中执行如下命令,为网桥添加端口,端口名称为vxlan。
sh ovs-vsctl add-port s1 vxlan sh ovs-vsctl show![]()
由上图可知,vxlan端口已成功挂载到网桥s1。
说明:若出现如下错误可忽略不计。![]()
步骤3 在Mininet CLI中执行如下命令,设置VXLAN端口,其中remote_ip为主机host2网卡eth0的IP地址,隧道id为5566。
sh ovs-vsctl set interface vxlan type=vxlan option:remote_ip=10.0.0.7 option:key=5566 ofport_request=9 sh ovs-vsctl show![]()
步骤4 执行命令h1 ifconfig h1-eth0 10.0.0.1,为Mininet所创建拓扑中的h1配置IP地址10.0.0.1。
![]()
步骤5 登录主机host2,执行命令sudo mn --topo=single,1,在host2中创建拓扑(一台交换机连接一台host)。
![]()
步骤6 在Mininet CLI中执行如下命令,为网桥添加端口,端口名称为vxlan。
sh ovs-vsctl add-port s1 vxlan sh ovs-vsctl show![]()
由上可知,vxlan端口已成功挂载到网桥s1。步骤7 在Mininet CLI中执行如下命令,设置VXLAN端口,其中remote_ip为主机host1网卡eth0的IP地址,隧道id为5566。
sh ovs-vsctl set interface vxlan type=vxlan option:remote_ip=10.0.0.6 option:key=5566 ofport_request=9步骤8 执行命令h1 ifconfig h1-eth0 10.0.0.2,为Mininet所创建拓扑中的h1配置IP地址10.0.0.2。
![]()
步骤9 登录主机host1,执行命令h1 ping 10.0.0.2,测试VXLAN隧道的连通性。
![]()
三、基于OVS流表实现
步骤1 登录主机host1,打开一个新的命令终端,执行以下命令,查询并终止控制器进程。
$ ps -aux|grep controller $ sudo kill -9 3627![]()
步骤2 登录主机host2,打开一个新的命令终端,执行以下命令,查询并终止控制器进程。
$ ps -aux|grep controller $ sudo kill -9 3665![]()
步骤3 登录主机host1,在Mininet操作界面执行以下命令,设置OVS流表。
> sh ovs-ofctl show s1 > sh ovs-ofctl add-flow s1 'in_port=1,actions=set_field:5566->tun_id,output:9' > sh ovs-ofctl add-flow s1 'in_port=9,tun_id=5566,actions=output:1' > sh ovs-ofctl show s1![]()
由上可知,交换机s1连接主机h1的端口号为1,s1的vxlan端口号为9。通过上述命令添加了两条流表:由端口1进入的数据包需要打上隧道id:5566,并从端口9转发;由端口9进入的数据包并且tun_id为5566,需要从端口1转发。
步骤4 登录主机host2,在Mininet操作界面执行以下命令,设置OVS流表。
> sh ovs-ofctl show s1 > sh ovs-ofctl add-flow s1 'in_port=1,actions=set_field:5566->tun_id,output:9' > sh ovs-ofctl add-flow s1 'in_port=9,tun_id=5566,actions=output:1' > sh ovs-ofctl show s1![]()
由上可知,交换机s1连接主机h1的端口号为1,s1的vxlan端口号为9。通过上述命令添加了两条流表:由端口1进入的数据包需要打上隧道id:5566,并从端口9转发;由端口9进入的数据包并且tun_id为5566,需要从端口1转发。步骤5 执行以下命令h1 ping 10.0.0.1,测试VXLAN隧道连通性。
![]()
由上可知,VXLAN隧道可以正常通信。
基于l2_multi模块寻找最短路径实验
实验描述: 基于l2_multi模块寻找最短路径实验
难易级别: 基础
实验课时: 2.0
-
任务目的
1、认识Miniedit并且掌握其基本使用方法。
2、学会使用pox控制器的l2_multi模块寻找主机间的最短传输路径。 -
任务环境
设备名称 软件环境(镜像) 硬件环境 控制器 Ubuntu 14.04桌面版
Pox 0.2.0CPU:2核 内存:4G 磁盘:20G 主机 Ubuntu 14.04桌面版
Mininet 2.2.0_ovs2.3.0CPU:1核 内存:2G 磁盘:20G 注:系统默认的账户为root/root@openlab,openlab/user@openlab。
-
任务内容
1、学习Mininet图形化构建拓扑文件的方法。
2、使用pox控制器的l2_multi模块寻找主机间的最短传输路径。 -
实验原理
Miniedit是一个使用Python编写的图形用户界面,布局和用法有点类似于packet tracer,用户利用所提供的网络元件自主搭建拓扑,右键单击某个元件可以查看、编辑该元件的基本信息。拓扑搭建完成后,用户可以根据需要导出生成python文件。
forwarding.l2_multi是一个交换机mac地址学习模块,其他模块采用的地址学习方式是基于“交换机——交换机”,交换机与相邻的交换机交换地址信息。而l2_multi模块使用openflow.discovery学习整个网络的拓扑,所有交换机同步地址信息。
本实验利用Miniedit绘制网络拓扑并导出生成mininet脚本。此外利用pox控制器中的l2_multi模块找出该拓扑中两个主机间的最短路径。实验拓扑如下图所示。![]()
-
实验步骤
一、实验环境检查
登录控制器,单击终端图标,打开终端,执行ifconfig命令查看控制器IP,如下所示。
![]()
二、生成Mininet脚本
步骤1 登录Mininet主机,执行以下命令,打开Miniedit。
$ cd openlab/mininet/examples $ sudo ./miniedit.py![]()
![]()
步骤2 左键选择侧栏网元图标,在绘图板中左键点击,绘制网络拓扑,如下图所示。
![]()
步骤3 右键点击交换机s1的图标,设置参数,如下图所示。
![]()
![]()
如上图,设置DPID为00:00:00:00:00:01:6673,选择‘ok’。
注意:交换机s2、s3、s4设置方法相同,具体DPID遵循实验原理中的拓扑图。步骤4 右键点击主机h1的图标,设置参数,如下图所示。
![]()
如上图,设置IP设为10.0.0.5/24,选择‘ok’。
注意:主机h2设置方法相同,具体ID遵循实验原理中的拓扑图。步骤5 右键点击控制器c0的图标,设置参数,如下图所示。
![]()
如上图,控制器IP设为30.0.1.3,选择‘ok’。步骤6 选择“File → Export Level 2 Script”,将拓扑保存为Python脚本,位于/home/openlab文件夹下,如下图所示。
![]()
步骤7 打开新的命令窗口,执行命令sudo vim mytopo.py,修改部分代码,如下图所示。
![]()
修改控制器相关代码,如上图红色标记所示,控制器IP地址需要根据具体实验情况填写。步骤8 执行命令sudo chmod +x mytopo.py,为Mininet脚本添加可执行权限。
三、观测实验数据
步骤1 登录控制器pox,执行以下命令,查询并终止控制器进程。
$ ps –aux|grep pox $ sudo kill -9 <进程id>步骤2 执行以下命令,使用l2_multi模块启动pox进程。
$ cd pox $ ./pox.py log.level --DEBUG log --file=mylog,w forwarding.l2_multi openflow.discovery![]()
步骤3 登录主机host1,执行命令sudo ./mytopo.py,运行Mininet脚本。
![]()
步骤4 执行以下命令,测试h1与h2之间的连通性并查看交换机流表。
$ h1 ping –c 5 h2 $ sh ovs-ofctl dump-flows s1 $ sh ovs-ofctl dump-flows s2 $ sh ovs-ofctl dump-flows s3 $ sh ovs-ofctl dump-flows s4![]()
![]()
![]()
从h1-h2有两条路径,分别是“h1-s3-s4-h2”和“h1-s3-s1-s2-s4-h2”。由s1、s2、s3、s4的流表可以看出,s3、s4中有相关流表,而s1、s2中并没有流表,说明数据包没有通过s1、s2,h1、h2之间最短的路径是h1-s3-s4-h2。
-













































浙公网安备 33010602011771号