为了更好兼容开发中的各种软件工具,在安装前要对当前Ubuntu系统内核有所了解。查看当前宿主主机Ubuntu的内核版本:uname -r
Mininet 是一个用于构建虚拟网络实验环境的开源软件工具。以下是几个常见的 Mininet 版本:
Mininet 2.2.x:这是最初发布的版本,提供了基本的网络拓扑构建和实验功能。(不建议使用)
Mininet 2.3.x:这个版本在 2.2.x 的基础上进行了一些改进和修复,增加了对 OpenFlow 1.3 的支持。
Mininet 2.3.0d5:这是 Mininet 的开发版,包含了一些实验性的功能和改进。这个版本在开发过程中,可能包含一些尚未完全稳定的功能。
本文将使用Mininet 2.3.x系列的版本
注意:Mininet 2.3.0 及更高版本支持 Python 3 和 Python 2。
Open vSwitch(OVS)是一个开源的虚拟交换机软件(下文中都简称ovs),它有多个版本可供选择:
OVS 2.0.x:这是较早的 OVS 版本,主要用于支持 OpenFlow 1.0 和 1.1 协议。这个版本已经相对较旧
OVS 2.1.x:增加了对 OpenFlow 1.2 协议的支持
OVS 2.3.x:支持 OpenFlow 1.3 协议,这个版本在 Mininet 中广泛使用。
OVS 2.5.x:引入了对 OpenFlow 1.4 和 1.5 协议的支持,并增加了一些新的特性和改进。
OpenFlow 1.0:这是最早发布的 OpenFlow 版本,定义了初始的协议规范,用于控制交换机和路由器的行为。
OpenFlow 1.1:这个版本在 1.0 版本的基础上进行了一些扩展和改进,增加了对多表流水线、组表和带宽限制等功能的支持。
OpenFlow 1.2:引入了一些新的特性,如更丰富的匹配字段、更灵活的流表流水线处理、多流表协调和组表的改进等。
OpenFlow 1.3:这是一个重要的版本,引入了许多新的特性和改进,如表组、多流表流水线、多流表协调、多路径和 QoS 支持等。
OpenFlow 1.4:这个版本进一步扩展了 OpenFlow 协议,引入了更多的新特性和改进,如可编程元数据、多表协调、多路径和多流量分类等
Mininet 通过软件定义的方式构建虚拟网络拓扑,其包含多个模块,每个模块都提供了不同的功能和类,把构成网络的每个元件都定义成了对应的类,当系统中安装Mininet后,通过python可以直接把对应的模块或类进行导入使用例子1.1)。
例子1.1
from mininet.net import Mininet # 导入模块
from mininet.node import Controller, OVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel
def create_network():
# 创建 Mininet 实例
net = Mininet(controller=Controller, switch=OVSSwitch)
# 添加交换机
s1 = net.addSwitch('s1')
s2 = net.addSwitch('s2')
# 添加主机
h1 = net.addHost('h1')
h2 = net.addHost('h2')
h3 = net.addHost('h3')
h4 = net.addHost('h4')
# 连接主机和交换机
net.addLink(h1, s1)
net.addLink(h2, s1)
net.addLink(h3, s2)
net.addLink(h4, s2)
# 连接交换机
net.addLink(s1, s2)
# 添加控制器
controller = net.addController('controller')
# 启动网络
net.start()
# 将交换机连接到控制器
s1.start([controller])
s2.start([controller])
# 打开命令行界面
CLI(net)
# 关闭网络
net.stop()
if __name__ == '__main__':
setLogLevel('info')
create_network()
这段例子1.1代码使用python通过调用 Mininet工具中模块进行软件定义虚拟网络拓扑。如from mininet.net import Mininet命令是从mininet.net 模块中导入 Mininet 类 创建了一个包含两个交换机(s1 和 s2)和四个主机(h1、h2、h3 和 h4)的虚拟网络环境。它还添加了一个名为 ‘controller’ 的控制器,并将主机和交换机连接到控制器。(应用时可以将这段代码保存为 Python 文件(例如 virtual_network.py),并在安装了 Mininet 的环境中运行该文件,以创建和运行虚拟网络环境。)
除了例子1.1中出现的模块,Mininet 还有许多模块, 以下介绍一些常见的 Mininet 模块:
mininet.net:该模块包含了 Mininet 类,是创建和管理 Mininet 虚拟网络环境的主要类,如控制器的设置,交换机的选型等。
mininet.topo:该模块包含了各种网络拓扑类(如线性,总线型,树形等),用于定义虚拟网络的结构。当然,也可以使用python语言调用Topo 参数自定义网络拓扑。
mininet.node:该模块包含了与网络中的节点(交换机、主机等)相关的类。例如,Host 类表示一个虚拟主机,Switch 类表示一个虚拟交换机等。
mininet.link:该模块包含了与网络中的链路相关的类。例如,Link 类表示两个节点之间的链路。
mininet.cli:该模块提供了与 Mininet 虚拟网络环境交互的命令行界面。可以使用该模块中的类来执行各种命令,如启动、停止虚拟网络等。
mininet.log:该模块提供了日志记录功能,可以用于在 Mininet 运行过程中记录和显示日志信息。
mininet.util:该模块包含了一些实用函数和工具类,用于辅助 Mininet 的使用。例如,waitListening 函数可以用于等待节点上的服务监听端口就绪等。
总之,Mininet是可以用来创建虚拟网络,可以使用其可视化模块进行创建(miniedit.py),也可以使用其给python提供的API进行代码书写方式定义进行虚拟网络环境创建,具体的创建方式将在后面的文章中进行介绍。
在 Mininet 中,默认情况下,Host 类使用轻量级的虚拟化技术(如 Linux 容器)来模拟主机节点。也就是说 Mininet 中的host是直接轻量拷贝当前宿主机运行的系统信息可以通过xterm 主机名 进入虚拟网络拓扑中的主机节点。
但是交换机需要承担数据交换以及管理工作,为了更好地定义和使用,一般可以使用ovs。
OVS(Open vSwitch)是一种常用的虚拟交换机软件,它提供了一些在 Mininet 虚拟网络环境中使用的功能,包括:
虚拟交换机:OVS 可以用来定义 Mininet 虚拟网络中的交换机,并将其连接到其他节点(主机或其他交换机)以构建虚拟网络拓扑。
流表和流量控制:OVS 具有流表和流量控制功能,可以配置流表规则以匹配和处理数据包,从而定制和控制 Mininet 网络中的流量流向和处理方式。
SDN 网络: SDN(软件定义网络)组件,它支持 OpenFlow 协议,可以与 SDN 控制器进行通信,实现网络的集中控制和编程。
总而言之,OVS 在 Mininet 中提供了软件交换机以及与软件交换机相关的功能。
值得一提的是,在Mininet用于软件定义虚拟网络拓扑环境,包括定义交换机,主机,链路等元件(路由器等同于主机),当让软件定义网络最大的特点是控制与转发层面解耦,因此软件定义网络中还有一个重要的角色:控制器。控制器有很多,其中RYU控制器是用python开发的,详情请查阅:控制器RYU原理以及应用
在软件定义网络(SDN)中,由于数据转发和控制解耦,因此对于网络流量行为来说控制器是一个关键组件,负责管理和定义控制整个网络中交换机对于流量的转发行为。交换机按照控制器下发的规则表(流表)转发网络中的数据(IP流量包)。值得注意的是,控制器与交换机(软件定义)进行通信(转发规则的增删改等操作信息),其通信不是采用TCP/IP协议,而是采用OpenFlow协议进行封装(如下图所示)。
(Ubuntu内核需要和ovs版本匹配)
Mininet 的安装可以参考官网
https://mininet.org/download/#option-2-native-installation-from-source
官网中介绍了四种安装方式:
选项 1:Mininet VM 安装(简单)
选项 2:从源进行本机安装
选项 3:从软件包安装
选项 4.升级现有 Mininet 安装
重要提示:Python 2 和 Python 3 Mininet
最简单的入门方法是选项1中介绍的镜像方式,该方法只需要下载对应vm的虚拟机镜像,即下载预打包的 Mininet/Ubuntu VM。此 VM 包括 Mininet 本身、预安装的所有 OpenFlow 二进制文件和工具。只需把打包好的镜像系统在vm中打开,然后运行简单命令即可
由于本文使用已有ubuntu系统,所以采用选项2的源码方式进行安装
源代码方式安装,首先需要在ubuntu中获取源代码:
git clone https://github.com/mininet/mininet
请注意,上面的命令将检查出最新和最合适的 Mininet ,如果本机系统还没有安装git,先安装git,然后用git获取源码
图1 进入root,安装git
图2 使用git 克隆获取源码:git clone https://github.com/mininet/mininet
图3 查看已经克隆到本机的源
进入本机mininet源文件中查看版本,然后选择一个合适的版本(本文选择2.3.0),然后新建分支(如图5)
图4 查看版本
图5新建分支
然后执行*cd …*返回到上一级目录后执行安装命令(图6)
PYTHON=python3 mininet/util/install.sh [options]
options典型选项包括:
-a:安装 Mininet VM 中包含的所有内容,包括 Open vSwitch 等依赖项以及 OpenFlow wireshark 分析器和 POX 等附加项。默认情况下,这些工具将内置在主目录中创建的目录中。
-nfv:安装 Mininet、OpenFlow 参考交换机和 Open vSwitch(本文选用)
-s mydir:在其他选项之前使用此选项可将源代码/构建树放在指定目录中,而不是主目录中。
执行命令:
PYTHON=python3 mininet/util/install.sh -nfv
图6 执行安装命令
按照以上步骤,如果安装正常,则已经完成相应 Mininet、OpenFlow和 Open vSwitch。
注意:安装过程中要确保网络良好,否则可能会导致依赖库下载不完整而无法完成安装
1) 本文在安装过程中,出现异常中断后重新运行安装命令后出现 fatal: destination path ‘.’ already exists and is not an empty directory 的openflow文件异常,通过rm -r openflow删除异常文件夹后重新跑PYTHON=python3 mininet/util/install.sh -nfv 解决
2) git 下载报错
github.com[0: 20.205.243.166]: errno=Connection timed out
解决问题
这种错误一般是由于使用 git://*** 下载会出现,改成使用 https:// 方式访问即可。输入以下命令
git config --global url.https://github.com/.insteadOf git://github.com/
git config --global url.“https://”.insteadOf git://
测试:通过以上步骤后
可以在终端启用root权限后,输入sudo mn 看看是否能正常进入mininet,并能在 mininet>pingall 实现互通,说明安装成功,这种方式是使用miniet自带的交换机(linux Bridge)和控制器(轻量型)
Mininet本身自带轻量型不利于扩展和自定义编程扩展,因此一般推荐安装第三方控制器,我们选择python语言开发的RYU控制器。其按照以下步骤:
确保系统已经安装了Python 2.7或Python 3.x(Ubuntu20是python 3.下)。可以在终端中运行以下命令来检查Python版本:
python --version
使用pip包管理器安装RYU控制器。在终端中运行以下命令:
在Python 3.x,使用以下命令安装RYU:
pip3 install ryu
安装完成后可以在终端中运行以下命令来验证RYU的安装:
ryu-manager --version
如果显示RYU的版本信息,则表示安装成功
以上实现了在ubuntu系统中安装mininet套件和控制器RYU,在进行实例实验中,我们需要先启动ryu,然后再用Mininet搭建虚拟网络
默认情况下ubuntu中,使用pip3 Ryu的安装于以下路径:
/usr/lib/python3/dist-packages/ryu/
可以在该路径中查看ryu的相关信息和现有的实例(app),注意路径正确才能运行实例
在该安装库中app文件中提供了现成的一些实例(流表等信息)
可以直接运行某个实例,进行实验测试
如果是采用‘ryu-manager ’则无实例空方式运行,那么mininet中所有交换机的流表都是空的,主机之间将无法ping。需要相应的配置后才能运行
总结:
在mininet中,启动时如果直接采用sudo mn,这种不带参数的默认方式 则采用mininet自带的控制器和交换机(linux内核采用的桥-性能快,非ovs软件交换机)
为了更好使用python进行软件定义和安全编程,建议使用带参数方式:sudo mn --controller=remote,ip=127.0.0.1,port=6633 --switch=ovs
Ryu控制器监听的OpenFlow端口默认是6633,也可省略