mininet-2

(12.2.1.1)--实训项目三-Mininet可视化应用.mp4_哔哩哔哩_bilibili

Mininet MAC地址学习实验

实验描述:   Mininet MAC地址学习实验

难易级别:   基础

实验课时:   2.0

  • 任务目的
     

    1、了解交换机的MAC地址学习过程。
    2、了解交换机对已知单播、未知单播和广播帧的转发方式。

  • 任务环境
     
    设备名称软件环境(镜像)硬件环境
    主机 Ubuntu 14.04桌面版
    Mininet 2.2.0
    CPU: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表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数据帧从非接受接口发送出去(也就是广播)。下图详细讲解交换机传输数据帧的过程。

    1. 主机A会将一个源MAC地址为自己目标MAC地址为主机B的数据帧发送给交换机。

    2. 交换机收到此数据帧后,首先将数据帧中的源MAC地址和对应的接口(接口为f
      0/1)记录到MAC地址表中。

    3. 然后交换机会检查自己的MAC地址表中是否有数据帧中的目标MAC地址的信息,如果有,则从MAC地址表中记录的接口发送出去;如果没有,则会将此数据帧从非接收接口的所有接口发送出去(也就是除了f0/1接口)。

    4. 这时,局域网的所有主机都会收到此数据帧,但是只有主机B收到此数据帧时会响应这个广播,并回应一个数据帧,此数据帧中包括主机B的MAC地址。

    5. 当交换机收到主机B回应的数据帧后,也会记录数据帧中的源MAC地址(也就是主机B的MAC地址),这时,再当主机A和主机B通信时,交换机根据MAC地址表中的记录,实现单播了。

    当局域网存在多个交换机互联的时候,交换机的MAC地址表记录过程如下图所示。

    1. 主机A将一个源MAC地址为自己,目标MAC地址主机C的数据帧发送给交换机。

    2. 交换机1收到此数据帧后,会学习源MAC地址,并检查MAC地址表,发现没有目标MAC地址的记录,则会将数据帧广播出去,主机B和交换机2都会收到此数据帧。

    3. 交换机2收到此数据帧后也会将数据帧中的源MAC地址和对应的接口记录到MAC地址表中,并检查自己的MAC地址表,发现没有目标MAC地址的记录,则会广播此数据帧。

    4. 主机C收到数据帧后,会响应这个数据帧,并回复一个源MAC地址为自己的数据帧,这时交换机1和交换机2都会将主机C的MAC地址记录到自己的MAC地址表中,并且以单播的形式将此数据帧发送给主机A。

    5. 这时,主机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.1
      CPU:2核 内存:4G 磁盘:20G
      主机 Ubuntu 14.04桌面版
      Mininet 2.2.0_ovs2.3.0
      CPU: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.0
      CPU:2核 内存:4G 磁盘:20G
      主机 Ubuntu 14.04桌面版
      Mininet 2.2.0_ovs2.3.0
      CPU: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。

posted on 2025-04-05 16:22  vanness_205  阅读(53)  评论(0)    收藏  举报