51Openlab上Mininet快速入门

51OpenlabMininet入门

都是来自51Openlab上的资料,因为要做有关的毕设,所以需要学习一下。
大多是复制的,但是其中也有我的一些理解和实验的截图
51Openlab

一、Mininet简介

Mininet是一个可以在有限资源的普通电脑上快速建立大规模SDN原型系统的网络仿真工具。该系统由虚拟的终端节点(End-Host)、OpenFlow交换机、控制器(也支持远程控制器)组成,这使得它可以模拟真实网络,可对各种设想或网络协议等进行开发验证。目前Mininet已经作为官方的演示平台对各个版本的OpenFlow协议进行演示和测试。

Mininet是基于Linux Container这一内核虚拟化技术开发出的虚拟化平台,其实现虚拟化主要是用到了Linux内核的Network namespace资源隔离机制。LinuxNetwork namespace机制可以让每个namespace拥有独立的网络设备、网络协议栈和端口等。Mininet正是利用了Linux这种Network namespace机制,才可以在一台电脑上创建多台虚拟主机。此外,Mininet建立的网络拓扑的交换节点可以是Open vSwitch、Linux Bridge等软件交换机,交换节点之间的链路采用Linuxveth pair(virtual Ethernet pair)机制实现,控制器可以部署在网络可达的任意地方。因此,Mininet可以定制任意灵活的SDN网络拓扑,为实验用户提供快捷可靠的实验环境。

Mininet架构按datapath的运行权限不同,分为kernel datapathuserspace datapath两种,其中kernel datapath把分组转发的逻辑编译进入Linux内核,效率非常高;userspace datapath把分组转发逻辑实现为一个应用程序,叫做ofdatapath,效率虽不及kernel datapath,但更为灵活,更容易重新编译。

Mininetkernel datapath架构如下图所示,控制器和交换机的网络接口都在root 命名空间中,每个主机都在自己独立的命名空间里,这也就表明每个主机在自己的命名空间中都会有自己独立的虚拟网卡eth0。控制器就是一个用户进程,它会在loopback上预留的6633端口监听来自交换机安全信道的连接。每个交换机对应几个网络接口,比如``s0-eth0、s0-eth1以及一个ofprotocol`进程,它负责管理和维护同一控制器之间的安全信道。

image-20220319113000354

Mininetuserspace datapath架构如下图所示,与kernel datapath架构不同,网络的每个节点都拥有自己独立的namespace。因为分组转发逻辑是实现在用户空间,所以多出了一个进程叫ofdatapath。另外,Mininet除了支持kernel datapathuserspace datapath这两种架构以外,还支持OVS交换机。OVS充分利用内核的高效处理能力,它的性能和kernel datapath相差无几。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxrG8qxN-1647761749137)(https://www.51openlab.com/site_media/media/course/bc49a3e27fa84c79835ad893864250cf/3/49cd355a-c740-4a42-8b3a-4ab72a163287)]

二、安装Mininet

之前我在自己的虚拟机上安装过Mininet,具体可以去看

按着51Openlab的实验指导书安装,再执行./install.sh -a前先更新一下软件:apt-get update

1. 安装完成后的测试

mn --test pingall

image-20220319115415136

image-20220319115458774


三、拓扑构建和命令使用

Mininet能实现如下功能:

  • OpenFlow应用程序提供一个简单、便宜的网络测试平台
  • 启用复杂的拓扑测试,无需连接物理网络
  • 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
  • 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑
  • 提供用于网络创建和实验的可扩展Python API

在基于Mininet的使用下,可以轻易的在自己的笔记本上测试一个软件定义网络(software-defined Networks),对基于OpenFlowOpen vSwitch的各种协议等进行开发验证,或者验证自己的想法。且所有的代码几乎可以无缝迁移到真实的硬件环境中,在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,可以轻松部署到真实的硬件环境中。

MininetEdit可视化界面:Mininet 2.2.0+内置miniedit 。在mininet/examples下提供miniedit.py脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性。

1. 一些命令:

(1)网络构建
  • topo:用于指定网络拓扑,Mininet支持创建的网络拓扑为:minimalsinglelineartree

  • minimal:创建一个交换机和两个主机相连的简单拓扑。默认无—topo参数的情况下就是这样。其内部实现就是调用了single,2对应的函数。

  • single,n:设置一个交换机和n个主机相连的拓扑。

  • linear,n:创建n个交换机,每个交换机只连接一个主机,并且所有交换机成线型排列。

  • tree,depth=n,fanout=m:创建深度为n,每层树枝为m的树型拓扑。因此形成的拓扑的交换机个数为(mn-1)/(m-1),主机个数为mn

  • —custom:在上述已有拓扑的基础上,Mininet支持自定义的拓扑,使用一个简单的Python API即可。—custom需和—topo一起使用,如mn —custom file.py —topo mytopo

(2)选项

Mininet常用命令总结:

命令作用
help默认列出所有命令文档,后面加命令名将介绍该命令用法 dump打印节点信息
gterm给定节点上开启gnome-terminal 注:可能导致mn崩溃
xterm给定节点上开启xterm
intfs列出所有的网络接口
iperf两个节点之间进行简单的iPerf TCP测试
iperfudp两个节点之间用制定带宽UDP进行测试
net显示网络链接情况
noecho运行交互式窗口,关闭回应(echoing)
pingpair在前两个主机之间互Ping测试
source从外部文件中读入命令
dpctl在所有交换机上用dptcl执行相关命令,本地为tcp 127.0.0.1:6634
link禁用或启用两个节点之间的链路
nodes列出所有的节点信息
pingall所有主机节点之间互Ping
py执行Python表达式
sh运行外部shell命令
quit/exit退出

2. 创建拓扑实操

(1)单一拓扑
sudo mn --topo=single,3

单一(Single)拓扑指整个网络拓扑中交换机有且只有一个,交换机可以下挂一个或多个主机,本例创建了一个交换机、3个主机,3个主机都下挂在一个交换机下。

image-20220319121549728

(2)线性拓扑
sudo mn --topo=linear,3

线性(linear)拓扑指交换机连接呈线形排列,且每个交换机所连接主机数目只有一个,本例创建了3个交换机、3个主机,3个主机分别下挂在一个交换机下。

image-20220319121737735

(3)树形拓扑
sudo mn --topo=tree,depth=2,fanout=2

树形(tree)拓扑指交换机连接成树形排列,且每个交换机所连接主机一般有多个关联使用参数depthfanout,本例创建了depth2fanout2的拓扑,表示交换机深度即层数为2,每个交换机下挂2个设备。

树形结构创建需要用到fanoutdepth两个属性,fanout 称为扇出,depth 称为深度,扇出决定每层分支设备节点数,深度为主机到根 openflow 交换机经历的层级数,树形结构总共有台n(fanout)m(depth) 次幂个主机。如2 扇出 2层树形结构包含 4台主机,

image-20220319122559137

(4)py脚本创建

使用py脚本创建拓扑

cd /home/openlab/openlab/mininet/custom
sudo mn --custom topo-2sw-2host.py --topo mytopo

custom目录下存在topo-2sw-2host.py文件,本例调用此文件构建拓扑

image-20220319123509605

3. 内部交互命令使用

  • net:显示链接信息

image-20220319123223062

  • nodes:查看节点信息

image-20220319123307452

  • links:查看链路健壮性信息

image-20220319123400372

  • pingall:验证所有主机间通信并查看结果

image-20220319123608445

  • xterm h1 h2开启xterm进入设备可视化操作界面

image-20220319123720007

  • mn -c:清除释放Mininet构造配置的交换机及主机

4. Mininet可视化构建网络拓扑

在目录:/home/openlab/openlab/mininet/examples中执行sudo ./miniedit.py

cd /home/openlab/openlab/mininet/examples
sudo ./miniedit.py
(1)基本操作

image-20220319134630591

单个设备配置:在设备上长按鼠标右键,选择Properties即可配置

image-20220319134929158

image-20220319135004319

Miniedit左上角“Edit”中可以剪切删除设备,及对整个网络进行全局配置:

image-20220319135123415

点击左下角的run,即可运行

image-20220319135257957

对设备长按右键可以查看设备配置终端和设置配置

(2)保存脚本

可视化搭建后,可以保存为py脚本

image-20220319135602975

image-20220319135623005

保存的目录是在:mininet/example目录下,通过chmod给此脚本权限后,直接运行即可重现拓扑。

通过后台查看保存的``sdnlab.py脚本文件,并给脚本赋予权限:chmod –R 777 sdnlab.py执行sdnlab.py脚本:./sdnlab.py`


四、Mininet调用API扩展自定义拓扑

Mininet作为一个基于Python的网络仿真工具,可以分为两大部分:Python库和运行文件。前者对网络中元素进行抽象和实现,例如定义主机类来表示网络中的一台主机;后者则基于这些库完成模拟过程。

  • addHost(“host name”): 添加主机
  • addSwitch(“sw name”): 添加交换机
  • addLink(node,node): 添加链路
  • attach(port):添加端口

1. 函数使用

进入:cd /home/openlab/openlab/mininet/custom

创建拓扑:sudo mn --custom topo-2sw-2host.py --topo mytopo

(1)在Mininet交互环境中添加主机h3
py net,addHost('h3')

image-20220319141605728

(2)在Mininet交互环境中添加s3与主机h3之间的链路。
py net.addLink(s3,net.get('h3'))

image-20220319141831686

(3)在Mininet交互环境中添加接口
py s3.attach('s3-eth3')

image-20220319141934949

(4)在Mininet交互环境中对主机进行配置IP地址
py net.get('h3').cmd('ifconfig h3-eth0 10.3')

image-20220319142204029

(5)查看节点信息
dump
nodes

image-20220319142324332

image-20220319142335181

(6)测试
h1 ping h3

image-20220319142432557

pingall

image-20220319142451157


五、Mininet可视化构建网络拓扑

开启MiniEdit

cd /home/openlab/openlab/mininet/mininet/examples
sudo ./miniedit.py

和前面的差不多,写一下这一点:

  • 交换机的设置:配置16位的DPID,勾选enable netflow、enable sFlow
  • 选择链路,也可以配置信息:

image-20220319144019456

  • Edit中勾选配置:

image-20220319144115701


六、Mininet流表应用实战1——手动添加流表

SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项,且交换机未被SDN控制器控制,交换机将此数据包丢弃。可以通过对流表操作来控制交换机的转发行为,通过手动对交换机下发流表,当交换机交换机收到一个数据包时,因已手工添加相对应的流表,交换机根据流表操作转发数据包,使主机间通信。

进入目录:cd /home/openlab/openlab/mininet/custom

编写拓扑脚本:sudo vim exper1.py

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
    "Simple topology example."
    def __init__( self ):
        "Create custom topo."
        # Initialize topology
        Topo.__init__( self )
        # Add hosts and switches
        Host1 = self.addHost( 'h1' )
        Host2 = self.addHost( 'h2' )
        Host3 = self.addHost( 'h3' )
        Switch1 = self.addSwitch( 's1' )
        Switch2 = self.addSwitch( 's2' )
        # Add links
        self.addLink( Host1, Switch1 )
        self.addLink( Host2, Switch1 )
        self.addLink( Host3, Switch2 )
        self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

保存退出::wq

执行如下命令运行自定义脚本,并远程指定一个不存在的控制器,使交换机不受控制器控制。

sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653

image-20220319151616707

生成拓扑如下:

image-20220320120914504

1. 测试无流表状态下主机间的通信

xterm h1 h2 h3

image-20220319151809791

查看交换机当前的flow table

image-20220319151903363

没有流表

h2和``h3`上开启网卡抓包:

tcpdump -n -i h2-eth0
tcpdump -n -i h3-eth0

h1pingh2h3

ping -c 3 10.0.0.2
ping -c 3 10.0.0.3

可以看到主机h1 Ping h2h3失败了,主机h2h3上没有收到任何ICMP echo request packet。原理解析:ping操作时,由于拓扑里没有SDN控制器,也没有用dptclOpenFlow交换机添加任何flow entry,所以交换机不会做转发决定,并直接丢弃h1h2h1h3ping

2. 添加流表并测试主机间的通信

执行如下命令添加交换机端口流表使主机h1和h2通信

dpctl add-flow in_port=1,actions=output:2
dpctl add-flow in_port=2,actions=output:1

image-20220320121045861

查看流表:dpctl dump-flows

进行ping测试,

h1 ping h2和h3

ping -c 3 10.0.0.2
ping -c 3 10.0.0.3

结果:

image-20220320121438237

image-20220320130757605

可以看到主机h1成功pingh2,且h3没收到任何ping包。原理解析:用dpctl对交换机添加flow,让交换机从s1-eth1这个端口接收到的所有traffic都从s1-eth2这个端口发出去。用dpctl给交换机添加双向流表,因为ping包除了echo request还有echo reply。所以还需要用dpctl对交换机添加flow,让交换机从s1-eth2这个端口接收到的所有traffic都从s1-eth1这个端口发出去。添加这两条flow后,h1能够pingh2,但是并没有为h1h3之间添加对应的端口流表,所以h1h3不通。

3. 添加协议流表使h1/h2通信

删除之前添加的流表:dpctl del-flowsdpctl dump-flows

image-20220320131223906

添加两条traffic类型为IPv4(0x0800)协议相关的flow entry

dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.2,actions=output:2
dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.1,actions=output:1
dpctl dump-flows

image-20220320131520338

**结果:**测试pingh1 ping 不通 h2和h3

分析:

原理解析:用dpctl对交换机添加flow,让交换机把所有EtherType0x0800(IPv4)并且destiation IP10.0.0.2traffics1-eth2这个端口发出去。用dpctl对交换机添加flow,让交换机把所有EtherType0x0800(IPv4)并且destiation IP10.0.0.1traffics1-eth1这个端口发出去。但处在同一网段下的主机,它们之间的交流是L2 forwarding,需要靠ARP来解析MAC地址,之前只匹配了0x0800(IPv4)协议,并没有匹配到0x0806(ARP),这样当交换机收到h1ARP包后,因为没有控制器,flow table里面也没有相应的flow告诉它如何转发这个ARP包,交换机只能将它丢弃,从而导致h1 ping h2失败,所以需要添加ARP协议的流表来使通信。

解决:

执行命令dpctl add-flow dl_type=0x0806,actions=NORMAL添加ARP(0x0806)协议相关的流表,让交换机以NORMAL形式(即广播)将所有ARP包从各个端口广播出去

image-20220320132351923

ping测试:

h1 可以ping通 h2

image-20220320132648065


七、Mininet流表应用实战2——控制器下发流表协议分析

  • 理解OpenFlow交换机和控制器间的工作原理。
  • 学会使用Wireshark抓包分析,熟悉了解OpenFlow协议

实验拓扑:

image-20220320132939277

SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。

在控制器上查看端口使用情况:

netstat -an|grep 6653
netstat -an|grep 8181

image-20220320133615784

查看IP地址

image-20220320133711685

Mininet虚拟机上开启wireshark

进行Wireshark抓包,监听网卡any上的数据流量。

进入/home/openlab/openlab/mininet/custom

目录下,编写拓扑脚本:

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
    "Simple topology example."
    def __init__( self ):
        "Create custom topo."
        # Initialize topology
        Topo.__init__( self )
        # Add hosts and switches
        Host1 = self.addHost( 'h1' )
        Host2 = self.addHost( 'h2' )
        Host3 = self.addHost( 'h3' )
        Switch1 = self.addSwitch( 's1' )
        Switch2 = self.addSwitch( 's2' )
        # Add links
        self.addLink( Host1, Switch1 )
        self.addLink( Host2, Switch1 )
        self.addLink( Host3, Switch2 )
        self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

执行脚本建立拓扑:

sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=30.0.1.197,port=6653

这里的ip地址填写刚才查询的控制器的IP地址,验证连通性:

pingall

image-20220320134401280

创建的拓扑如下:

image-20220320134529491

查看交换机上的流表:

dpctl dump-flows

image-20220320134632123

停止Wireshark抓包并查看抓包结果,筛选openflow_v1协议数据包

image-20220320134840572

登录ODL控制器,打开浏览器并输入URL地址:

image-20220320135157565

分析协议:

image-20220320135328413

首先发送HELLO消息,建立初始化连接,协商使用的OpenFlow协议版本。由下图可知,ODLMininet之间应用的是OpenFlow1.0版本协议

OpenFlow版本协商完成后,控制器发送一条features_request消息获取交换机的特性信息,包括交换机的ID(DPID)、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply消息。

image-20220320135508366

image-20220320135700349

ofpt_feature_reply数据包详情如下,交换机的DPID是数据通道独一无二的标识符。本实验中交换机缓冲区数量(n_buffers)256,交换机支持的流表数量(n_tables)254,交换机所支持的功能,

stats reply消息用于回应stats request信息,主要是交换机回应给控制器的状态信息。

image-20220320135951339

当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in消息发给控制器,由控制器通过packet_out消息下发决策,使发送和接收数据包的两主机间进行通信

image-20220320140059936

image-20220320140115137

flow mod消息涉及流表项的下发匹配信息,下图显示的是flow mod匹配项的类型信息。

image-20220320140312306

八、 Mininet多数据中心网络拓扑流量带宽实验

1、掌握多数据中心网络拓扑的构建。
2、熟悉网络性能测试工具Iperf,根据实验测试SDN网络的性能。

实验原理:

使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信息。网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。此应用主要以数据中心网络为目标场景,在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。

Mininet数据中心应用价值:

  • 树状拓扑结构容错能力强
  • 降低数据中心成本消耗
  • 提供重新排列的全带宽无阻碍路径
  • 提高带宽利用率
  • 分析数据中心网络流量性能
  • 为真实数据中心和仿真测试床提供有用信息
    mininet中进行自定义命令iperfmulti功能拓展主要分为4步:
    1.修改mininet/net.py
    2.修改mininet/cli.py
    3.修改``bin/mn4.重新安装Mininet核心文件:~/mininet/util/install.sh -n`

最后一个实验,不做再做过多的介绍,就是在mn编写添加了一条测试带宽的命令。关于编写程序,暂时我还不会。

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无法长大的Panda

您的鼓励是最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值