51Openlab
上Mininet
入门
文章目录
都是来自
51Openlab
上的资料,因为要做有关的毕设,所以需要学习一下。
大多是复制的,但是其中也有我的一些理解和实验的截图
51Openlab
一、Mininet
简介
Mininet
是一个可以在有限资源的普通电脑上快速建立大规模SDN
原型系统的网络仿真工具。该系统由虚拟的终端节点(End-Host
)、OpenFlow
交换机、控制器(也支持远程控制器)组成,这使得它可以模拟真实网络,可对各种设想或网络协议等进行开发验证。目前Mininet
已经作为官方的演示平台对各个版本的OpenFlow
协议进行演示和测试。
Mininet
是基于Linux Container
这一内核虚拟化技术开发出的虚拟化平台,其实现虚拟化主要是用到了Linux
内核的Network namespace
资源隔离机制。Linux
的Network namespace
机制可以让每个namespace
拥有独立的网络设备、网络协议栈和端口等。Mininet
正是利用了Linux
这种Network namespace
机制,才可以在一台电脑上创建多台虚拟主机。此外,Mininet
建立的网络拓扑的交换节点可以是Open vSwitch、Linux Bridge
等软件交换机,交换节点之间的链路采用Linux
的veth pair(virtual Ethernet pair)
机制实现,控制器可以部署在网络可达的任意地方。因此,Mininet
可以定制任意灵活的SDN
网络拓扑,为实验用户提供快捷可靠的实验环境。
Mininet
架构按datapath
的运行权限不同,分为kernel datapath
和userspace datapath
两种,其中kernel datapath
把分组转发的逻辑编译进入Linux
内核,效率非常高;userspace datapath
把分组转发逻辑实现为一个应用程序,叫做ofdatapath
,效率虽不及kernel datapath
,但更为灵活,更容易重新编译。
Mininet
的kernel datapath
架构如下图所示,控制器和交换机的网络接口都在root
命名空间中,每个主机都在自己独立的命名空间里,这也就表明每个主机在自己的命名空间中都会有自己独立的虚拟网卡eth0
。控制器就是一个用户进程,它会在loopback
上预留的6633
端口监听来自交换机安全信道的连接。每个交换机对应几个网络接口,比如``s0-eth0、s0-eth1以及一个
ofprotocol`进程,它负责管理和维护同一控制器之间的安全信道。
Mininet
的userspace datapath
架构如下图所示,与kernel datapath
架构不同,网络的每个节点都拥有自己独立的namespace
。因为分组转发逻辑是实现在用户空间,所以多出了一个进程叫ofdatapath
。另外,Mininet
除了支持kernel datapath
和userspace 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
三、拓扑构建和命令使用
Mininet
能实现如下功能:
- 为
OpenFlow
应用程序提供一个简单、便宜的网络测试平台- 启用复杂的拓扑测试,无需连接物理网络
- 具有拓扑感知和
OpenFlow
感知的CLI
,用于调试或运行网络范围的测试- 支持任意自定义拓扑,主机数可达
4096
,并包括一组基本的参数化拓扑- 提供用于网络创建和实验的可扩展
Python API
在基于
Mininet
的使用下,可以轻易的在自己的笔记本上测试一个软件定义网络(software-defined Networks
),对基于OpenFlow
、Open vSwitch
的各种协议等进行开发验证,或者验证自己的想法。且所有的代码几乎可以无缝迁移到真实的硬件环境中,在实验室里,一行命令就可以创建一个支持SDN
的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,可以轻松部署到真实的硬件环境中。
MininetEdit
可视化界面:Mininet 2.2.0+
内置miniedit
。在mininet/examples
下提供miniedit.py
脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性。
1. 一些命令:
(1)网络构建
-
topo
:用于指定网络拓扑,Mininet
支持创建的网络拓扑为:minimal
、single
、linear
和tree
。 -
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个主机都下挂在一个交换机下。
(2)线性拓扑
sudo mn --topo=linear,3
线性(linear
)拓扑指交换机连接呈线形排列,且每个交换机所连接主机数目只有一个,本例创建了3个交换机、3个主机,3个主机分别下挂在一个交换机下。
(3)树形拓扑
sudo mn --topo=tree,depth=2,fanout=2
树形(tree
)拓扑指交换机连接成树形排列,且每个交换机所连接主机一般有多个关联使用参数depth
及fanout
,本例创建了depth
为2
,fanout
为2
的拓扑,表示交换机深度即层数为2
,每个交换机下挂2
个设备。
树形结构创建需要用到fanout
和depth
两个属性,fanout
称为扇出,depth
称为深度,扇出决定每层分支设备节点数,深度为主机到根 openflow
交换机经历的层级数,树形结构总共有台n(fanout)
的 m(depth)
次幂个主机。如2 扇出 2层树形结构包含 4台主机,
(4)py
脚本创建
使用py
脚本创建拓扑
cd /home/openlab/openlab/mininet/custom
sudo mn --custom topo-2sw-2host.py --topo mytopo
在custom
目录下存在topo-2sw-2host.py
文件,本例调用此文件构建拓扑
3. 内部交互命令使用
net
:显示链接信息
nodes
:查看节点信息
links
:查看链路健壮性信息
pingall
:验证所有主机间通信并查看结果
xterm h1 h2
开启xterm
进入设备可视化操作界面
mn -c
:清除释放Mininet
构造配置的交换机及主机
4. Mininet
可视化构建网络拓扑
在目录:/home/openlab/openlab/mininet/examples
中执行sudo ./miniedit.py
cd /home/openlab/openlab/mininet/examples
sudo ./miniedit.py
(1)基本操作
单个设备配置:在设备上长按鼠标右键,选择Properties
即可配置
Miniedit
左上角“Edit”
中可以剪切删除设备,及对整个网络进行全局配置:
点击左下角的run
,即可运行
对设备长按右键可以查看设备配置终端和设置配置
(2)保存脚本
可视化搭建后,可以保存为
py
脚本
保存的目录是在: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')
(2)在Mininet
交互环境中添加s3
与主机h3
之间的链路。
py net.addLink(s3,net.get('h3'))
(3)在Mininet
交互环境中添加接口
py s3.attach('s3-eth3')
(4)在Mininet
交互环境中对主机进行配置IP
地址
py net.get('h3').cmd('ifconfig h3-eth0 10.3')
(5)查看节点信息
dump
nodes
(6)测试
h1 ping h3
pingall
五、Mininet
可视化构建网络拓扑
开启MiniEdit
cd /home/openlab/openlab/mininet/mininet/examples
sudo ./miniedit.py
和前面的差不多,写一下这一点:
- 交换机的设置:配置16位的
DPID
,勾选enable netflow、enable sFlow
- 选择链路,也可以配置信息:
Edit
中勾选配置:
六、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
生成拓扑如下:
1. 测试无流表状态下主机间的通信
xterm h1 h2 h3
查看交换机当前的flow table
没有流表
在h2
和``h3`上开启网卡抓包:
tcpdump -n -i h2-eth0
tcpdump -n -i h3-eth0
在h1
上pingh2
和h3
ping -c 3 10.0.0.2
ping -c 3 10.0.0.3
可以看到主机h1 Ping h2
和h3
失败了,主机h2
和h3
上没有收到任何ICMP echo request packet
。原理解析:ping
操作时,由于拓扑里没有SDN
控制器,也没有用dptcl
给OpenFlow
交换机添加任何flow entry
,所以交换机不会做转发决定,并直接丢弃h1
到h2
及h1
到h3
的ping
包
2. 添加流表并测试主机间的通信
执行如下命令添加交换机端口流表使主机h1和h2通信
dpctl add-flow in_port=1,actions=output:2
dpctl add-flow in_port=2,actions=output:1
查看流表:dpctl dump-flows
进行ping
测试,
h1 ping h2和h3
ping -c 3 10.0.0.2
ping -c 3 10.0.0.3
结果:
可以看到主机h1
成功ping
通h2
,且h3
没收到任何ping
包。原理解析:用dpctl
对交换机添加flow
,让交换机从s1-eth1
这个端口接收到的所有traffic
都从s1-eth2
这个端口发出去。用dpctl
给交换机添加双向流表,因为ping
包除了echo request
还有echo reply
。所以还需要用dpctl
对交换机添加flow
,让交换机从s1-eth2
这个端口接收到的所有traffic
都从s1-eth1
这个端口发出去。添加这两条flow
后,h1
能够ping
通h2
,但是并没有为h1
和h3
之间添加对应的端口流表,所以h1
与h3
不通。
3. 添加协议流表使h1/h2
通信
删除之前添加的流表:dpctl del-flows
、dpctl dump-flows
添加两条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
**结果:**测试ping
,h1 ping 不通 h2和h3
分析:
原理解析:用dpctl
对交换机添加flow
,让交换机把所有EtherType
为0x0800(IPv4)
并且destiation IP
为10.0.0.2
的traffic
从s1-eth2
这个端口发出去。用dpctl
对交换机添加flow
,让交换机把所有EtherType
为0x0800(IPv4)
并且destiation IP
为10.0.0.1
的traffic
从s1-eth1
这个端口发出去。但处在同一网段下的主机,它们之间的交流是L2 forwarding
,需要靠ARP
来解析MAC
地址,之前只匹配了0x0800(IPv4)
协议,并没有匹配到0x0806(ARP)
,这样当交换机收到h1
的ARP
包后,因为没有控制器,flow table
里面也没有相应的flow
告诉它如何转发这个ARP
包,交换机只能将它丢弃,从而导致h1 ping h2
失败,所以需要添加ARP
协议的流表来使通信。
解决:
执行命令dpctl add-flow dl_type=0x0806,actions=NORMAL
添加ARP(0x0806)
协议相关的流表,让交换机以NORMAL
形式(即广播)将所有ARP
包从各个端口广播出去
ping
测试:
h1 可以ping通 h2
七、Mininet
流表应用实战2——控制器下发流表协议分析
- 理解
OpenFlow
交换机和控制器间的工作原理。- 学会使用
Wireshark
抓包分析,熟悉了解OpenFlow
协议
实验拓扑:
在
SDN
环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。
在控制器上查看端口使用情况:
netstat -an|grep 6653
netstat -an|grep 8181
查看IP
地址
在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
创建的拓扑如下:
查看交换机上的流表:
dpctl dump-flows
停止Wireshark
抓包并查看抓包结果,筛选openflow_v1
协议数据包
登录ODL
控制器,打开浏览器并输入URL地址:
分析协议:
首先发送HELLO
消息,建立初始化连接,协商使用的OpenFlow
协议版本。由下图可知,ODL
与Mininet
之间应用的是OpenFlow1.0
版本协议
OpenFlow
版本协商完成后,控制器发送一条features_request
消息获取交换机的特性信息,包括交换机的ID(DPID)
、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply
消息。
ofpt_feature_reply
数据包详情如下,交换机的DPID
是数据通道独一无二的标识符。本实验中交换机缓冲区数量(n_buffers)
为256
,交换机支持的流表数量(n_tables)
为254
,交换机所支持的功能,
stats reply
消息用于回应stats request
信息,主要是交换机回应给控制器的状态信息。
当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in
消息发给控制器,由控制器通过packet_out
消息下发决策,使发送和接收数据包的两主机间进行通信
flow mod
消息涉及流表项的下发匹配信息,下图显示的是flow mod
匹配项的类型信息。
八、 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
编写添加了一条测试带宽的命令。关于编写程序,暂时我还不会。