积跬步以至千里,积怠情以至深渊。
Mininet是一个轻量级软件定义网络研发和测试平台,主要特性包括支持 Openflow、OpenvSwitch 等软定义网络部件;方便多人协同开发;支持系统级的还原测试;支持复杂拓扑、自定义拓扑;提供 Python API很好的硬件移植性(Linux 兼容),结果有更好的说服力;高扩展性,支持超过 4096 台主机的网络结构。
Mininet可以模拟真实网络, 主要是用到了Linux 内核的namespace机制,通俗来说,namespace机制就是可以给模拟网络中的每一个虚拟设备分一个空间,各个虚拟设备之间彼此没有关系(看不到对方,但是可以连接起来)。namespace机制按照datapath的运行权限不通,分为kernel datapath和userspace datapath两种。
作为Mininet入门选手,特此分享心得笔记。不对之处, 还望批评指正!
启动Mininet,创建默认的网络拓扑图命令为sudo mn,该默认拓扑图结构如下图所示,拥有一台控制节点(controller)、一台交换机(Switch)、两台主机(host)的网络,可以通过wireshark进行观测。
CLI的交互式操作
# 查看全部节点
mininet> nodes
# 查看链路信息
mininet> net
# 输出各节点信息
mininet> dump
如果想要对某个节点的虚拟机单独进行命令操作,也十分简单,命令格式为 node cmd。
例如查看交换机 s1 上的网络信息,我们只需要在执行的 ifconfig 命令前加上 s1 主机标志即可,即 s1 ifconfig,同样,如果我们想用 ping 3 个包的方法来测试 h2 跟 h3 之间连通情况,只需要执行 h2 ping -c 3 h3 即可。
全网络互ping命令是 pingall
除了 CLI 的交互方式之外,Mininet 还提供了更方便的自动执行的快捷测试方式,其格式为 sudo mn --test cmd,即可自动启动并执行 cmd 操作,完成后自动退出。
sudo mn --test pingpair,可以直接对主机连通性进行测试,
sudo mn --test iperf,启动后直接进行性能测试。用这种方式很方便直接得到实验结果。
Mininet 提供了 Python API,可以用来方便的自定义拓扑结构。
在 mininet/custom 目录下给出了几个例子。例如在文件中定义了一个 mytopo,则可以通过 --topo 选项来指定使用这一拓扑,命令为
sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
sudo mn -x
或者再进入mn CLI之后,用如下命令启动
xterm s1
在 Mininet CLI 中,使用 link 命令,禁用或启用某条链路,格式为
link node1 node2 up/down
通过 --switch 选项跟 --controller 选项可以分别指定采用哪种类型的交换机跟控制器。下面,以更换使用pox控制器为例进行介绍:
POX是由NOX演变而来,其底层模块由C++实现,上层应用可以用C++或Python编写,它的核心作用是提供快速开发网络控制软件原型的平台。POX和OpenFlow交换机进行交互,可以用于软件定义网络这个新兴学科的基础研究,比如探索和原型分布、SDN调试、网络虚拟化、控制器设计和编程模型。
1.POX系统配置并启动POX
修改监听端口
POX的监听端口默认是6633,修改监听端口的方式有以下两种:
(1)每次启动POX时指定监听端口,如指定的端口为6636,则在命令行后添加:
openflow.of_01 --port=6636
(2)修改控制器的默认端口方法
修改/pox/openflow/of_01.py文件,如指定的端口为6636,则将文件中所有的port=6633改为port=6636。
配置Web界面端口
POX支持GUI,通过POXDesk等工具实现,本小节介绍如何配置POX的GUI。具体操作如下:
(1)获取POXDesk
进入POX主目录下面的ext目录
cd ./pox/ext
git clone https://github.com/MurphyMc/poxdesk
(2)获取qooxdoo
下载qooxdoo代码压缩包,然后把解压后文件夹名字改成qx
cd poxdesk
wget http://downloads.sourceforge.net/qooxdoo/qooxdoo-2.0.2-sdk.zip
unzip qooxdoo-2.0.2-sdk.zip
mv qooxdoo-2.0.2-sdk qx
(3)初始化poxdesk
进入poxdesk目录,执行命令./generate.py,然后再进入POX主目录
cd poxdesk
./generate.py
cd ../../..
(4)启动POX
若在启动POX报错地址已被占用,则使用ps -fA | grep python来查看当前正在调用POX的Python进程,找到进程编号,杀死即可。
./pox.py samples.pretty_log web messenger messenger.log_service messenger.ajax_transport openflow.of_service poxdesk openflow.discovery poxdesk.tinytopo py
(5)访问Web
用浏览器访问http://pox-ip:8000/poxdesk,默认端口8000。
2.启动mininet
在启动POX后,打开另一个cmd,并启动mininet,并且连接到远程ip = 127.0.0.1, port = 6633的pox控制器。
sudo mn --controller=remote,ip=127.0.0.1,port=6633
执行 sudo mn -c 会进行清理配置操作,适合故障后恢复。
执行 exit 会退出 Mininet 的 CLI,同时给出运行时间统计。
下面,将通过一个具体管理 Openflow switch 的例子来介绍一些比较高级的命令。
首先,启动 Mininet,执行
sudo mn --topo single,3 --mac --switch ovsk --controller remote
生成一个小的网络,三台主机连到一台交换机上,交换机为 OpenvSwitch 交换机,指定 remote 类型控制器(默认为本地)。
dpctl 程序是一个命令行工具用来检测和管理 OpenFlow 数据通路,它能够显示当前的状态数据通路,包括功能配置和表中的条目,以及合适使用 OpenFlow 的内核模块,可以用来添加,删除,修改和监视 datapaths。
1.查看到交换机的端口等基本情况,其中 tcp 端口 6634 是默认的交换机监听端口
s1 dpctl show tcp:127.0.0.1:6634
2.查看流表信息:
dpctl dump-flows tcp:127.0.0.1:6634
此时,流表为空,执行 h1 ping h2 无法得到响应。因此我们需要通过 dpctl 手动添加流表项,实现转发。
3.手动添加流表项:
dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
dpctl dump-flows tcp:127.0.0.1:6634
此时查看流表可以看到新的转发信息,同时可以在 h1 和 h2 之间可以相互连通。
4.dpctl 其他常用操作
创建 datapath 编号为 0
dpctl adddp n1:0
增加两个网络设备到新的 datapath
dpctl adddp n1:0 eth0
dpctl adddp n1:0 eth1
检测数据通路接收的流量
dpctl monitor n1:0
在数据通路中删除网络设备
dpctl delif nl:0 eth0
Mininet 作为一个基于 Python 的网络模拟工具,可以分为两大部分:Python库和运行文件。前者提供对网络中元素进行抽象和实现,例如定义主机类来表示网络中的一台主机。后者则基于这些库来完成各种自定义的模拟过程。一个典型的场景如下图所示。
Mininet是一个网络仿真器,或者更确切地说是一个 网络仿真编排系统。它在单个Linux内核上运行一组终端主机,交换机,路由器和链接。 它使用轻量级虚拟化使单个系统看起来像一个完整的网络,运行相同的内核,系统和用户代码。Mininet主机的行为就像真机一样; 你可以ssh进去(如果你开始 sshd并将网络桥接到您的主机上)并运行任意程序(包括安装在底层Linux系统上的任何程序。)您运行的程序可以通过看似真正的以太网接口发送数据包,具有给定的链接速度和延迟。数据包通过具有给定数量的排队的真实以太网交换机,路由器或中间件进行处理。当两个程序(如 iperf客户端和服务器)通过Mininet进行通信时,测量的性能应该与两个(较慢的)本机的性能相匹配。
简而言之,Mininet的虚拟主机,交换机,链接和控制器是真实的 - 它们只是使用软件而不是硬件创建的 - 并且大多数情况下它们的行为类似于分立的硬件元素。通常可以创建类似于硬件网络的Mininet网络,或类似于Mininet网络的硬件网络,并在任一平台上运行相同的二进制代码和应用程序。