《软件定义网络:基于OpenFlow的SDN》一一2.4 用Mininet搭建OpenFlow实验环境

简介:

本节书摘来自华章计算机《软件定义网络:基于OpenFlow的SDN》一书中的第2章,第2.4节,作者:Siamak Azodolmolky,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 用Mininet搭建OpenFlow实验环境

Mininet是一个软件工具,可以借助它在一台计算机上仿真整个的OpenFlow网络。Mininet使用轻量级的基于进程的虚拟化技术(Linux网络名空间和Linux容器架构),能够在单一的操作系统内核上运行多个主机和交换机(如4096个),它能够创建内核级的和用户空间的OpenFlow交换机、用以控制交换机的控制器和主机,主机之间可以通过仿真网络进行通信。Mininet使用成对的虚拟以太网卡(virtual Ethernet,veth)连接交换机和主机,极大地简化了初始阶段的开发、排错、测试和部署过程。新的网络应用可以先在拟部署网络的仿真平台上进行开发测试,然后再迁移到实际运行的网络设施上。默认情况下,Mininet支持OpenFlow 1.0版本的规范,不过也可以通过修订支持新版本的软件交换机,Mininet的关键特性和优势如下:
Mininet能够创建由虚拟的主机、交换机和控制器构成的网络。
Mininet主机运行标准的Linux网络软件,其交换机支持OpenFlow。可以认为Mininet是一个用于开发OpenFlow应用的低成本的实验环境,不需要实际布线搭建物理网络,就能够对复杂的网络拓扑进行测试。
Mininet包含一个命令行接口(command-line interface,CLI),该CLI支持OpenFlow协议并能感知拓扑结构,可以在整个网络范围内进行测试和排错。
Mininet能够即装即用,不用任何编程;当然它也提供一个简明且可扩展的Python API,用于创建网络和对网络进行试验。
Mininet除了是一个模拟工具,还是一个仿真环境,能够运行真正的、原汁原味的代码,包括应用程序代码,操作系统内核代码,以及控制平面的代码(OpenFlow控制器代码和Open vSwitch代码)。
便于安装,可以获取运行于VMware虚拟机(virtual machine,VM)镜像的预安装包,或者针对Mac、Windows、Linux操作系统的,已经安装了OpenFlow v1.0工具的VirtualBox。
在本节其余部分,我们将给出Mininet的概览及其使用指导, 这些内容在本书的后续部分中也会用到。
2.4.1 Mininet入门
初学Mininet最简便的途径就是下载一个Mininet的虚拟机镜像(运行于Ubuntu上)的预安装包,这个虚拟机包括了OpenFlow的所有二进制代码、支持大型Mininet网络的预安装的工具以及Mininet本身。除了用虚拟机预安装包进行安装,有兴趣的读者还可以通过源代码或者Ubuntu安装包进行本地安装。
本章的例子都基于Mininet 2.0版,Mininet的最新版本可以从链接www.mininet.org/download下载。
如果你打算使用虚拟机镜像,则需要下载和安装一个虚拟机系统。可以选择VirtualBox(GPL自由软件)或者VMware Player(对非商业用途免费),这些免费软件可工作于Windows、OS X和Linux操作系统。Mininet是一个开放的虚拟化格式(Open Virtualization Format,OVF)的镜像文件,约为1 GB,可以通过VirtualBox或者VMware Player导入。在VirtualBox中双击VM镜像,或者在File(文件)菜单中选择Import Appliance(导入应用),以导入Mininet的OVF文件;然后,在Settings(设置)菜单中,另外添加一个host-only模式的网络适配器,以便登录到VM镜像中。如果你正在使用VMware,它会提醒你在虚拟机中安装VMware工具。在后面的例子中,我们采用VMware Player作为Mininet的虚拟系统。
读者若要搭建同样的环境,可以遵循以下步骤:
启动你所选择的虚拟机程序中的Mininet虚拟机镜像(后面将给出VMware Player的屏幕截图)。
使用默认用户名和口令登录到Mininet虚拟机中,默认用户名和口令都是mininet。登录后并没有启用根用户,你可以使用sudo来用超级用户的权限执行一个口令。
为了建立与Mininet虚拟机的SSH会话,必须找到虚拟机的IP地址,VMware Player使用的地址范围是192.168.x.y,可以在虚拟机的命令行界面输入下面的口令以获取IP地址:

如果你使用的是VirtualBox,并且已经在eth1上创建了一个host-only模式的网络,则应该用下面的命令代替前述的命令以获取IP地址:

假设虚拟机是在本地运行的,没有必要采取ssh –X所提供的额外保护,你可以使用ssh –Y mininet@192.168.44.128命令建立起跟虚拟机的SSH会话,这种方式在默认情况下没有设置认证超时,需要把其中的IP地址改为ifconfig命令输出中的IP地址。本节设置的平台中包括:VMware Player上的Mininet虚拟机、用作SSH客户端的putty(启用X-11转发选项)、以及Xming(X-Server)。其中,X-11转发(参见后面信息框中给出的更多相关信息)能够使你以图形化输出的方式运行程序,例如:在运行Wireshark(Mininet虚拟机镜像中包含预安装的Wireshark)时可以观察到其图形化输出结果。在图2-2的屏幕截图中,可以看到构建于VMware Player、Mininet、XMing(X-Server)和putty(SSH终端)上的实验环境。
从图2-2的屏幕截图中可以看到,我们通过SSH客户端putty登录到了Mininet虚拟机,然后启动Wireshark作为后台进程(即:输入sudo wireshark &)。由于已经启动了X-11转发,Wireshark图形化界面会在另一个窗口中显示。
image

图2-2 用Mininet搭建OpenFlow实验环境
在启动Mininet仿真器之前,必须先在Wireshark中选择所用的数据包捕获设备(Capture device),或者选择环回的网络接口,然后开始对流量进行捕获。为了显示跟OpenFlow相关的流量,需要在Wireshark的过滤器设置框中添加of(指OpenFlow协议),并将其应用于要捕获的流量。这样就规定了Wireshark只显示与OpenFlow协议相关的流量。由于Mininet还没有启动,Wireshark的主窗口区还没有任何 OpenFlow的数据包可以显示,在下一节中,读者就可以运行一个Mininet的样例实验了。
Mininet虚拟机并不包括桌面管理程序,图形化的输出应该通过SHH并使用X转发工具转发,读者可以参阅下面的FAQ链接了解如何启用X11转发。正确设置X11能够使你运行其他的图形化用户界面程序和xterm终端仿真器,本章后面将要用到它们。https://github.com/mininet/mininet/wiki/FAQ#wiki-x11-forwarding
2.4.2 Mininet实验
Mininet能够使你快速地创建、定制一个OpenFlow原型系统,并与该系统进行交互和共享。可以用Mininet的命令行来创建网络(主机和交换机),其命令行接口(CLI)能够使你通过命令方式控制和管理整个虚拟网络。此外,还可以利用Mininet提供的API来开发用户网络应用系统,只要几行Python脚本就能搞定。一旦所定制的原型系统能够在Mininet上正常工作,就可以把它部署到真正的网络上。
在样例实验中,我们将采用Mininet默认的拓扑结构,这可以通过运行“$ sudo mn”命令实现。这个拓扑包括一个OpenFlow交换机、所连接的两台主机,再加上一个OpenFlow参考控制器。该拓扑结构也可以用命令行“--topo=minimal”来定义。Mininet中的其他的拓扑结构也可以直接使用,详细信息可查看“mn-h”命令输出中的“--topo”部分。若要显示所建立网络中的节点、链路,以及所有节点的dump信息,可以分别采用下列命令:
image
当使用默认的拓扑结构建立起Mininet 仿真环境后,OpenFlow控制器和交换机就启动OpenFlow协议的通信,这时便可以在Wireshark的捕获窗口查看捕获的数据包了。图2-3的截屏图中给出了所捕获的流量,从中可以观察到握手(Hello)消息,特性(feature)请求和响应消息,以及若干数据包输入(packet-in)消息,从而证明在所建立的环境中,OpenFlow交换机已经与OpenFlow控制器建立起了连接。
image

图2-3 Wireshark中捕获的OpenFlow流量
如果在Mininet命令行界面(提示符为:mininet>)中输入的第一个字符串是一个主机、交换机或者控制器的名称,则将在这个指定的节点上执行命令。例如:查看第一个主机(h1)的以太网卡和环回网卡,可以使用下面的命令:

现在,我们可以通过下面这个简单的ping命令查看h1与每个主机的连接情况:

上面的命令从主机h1向主机h2发送单个的ping数据包,第一台主机(h1)需要先发送ARP请求,以获取第二台主机(h2)的MAC地址,由此产生一个发给OpenFlow控制器的packet_in消息,控制器接着采用洪泛的方式发送一个packet_out消息,将数据包广播到交换机的其他端口(在该样例中,只有一个数据端口)。第二台主机查看了ARP请求后,发送一个广播响应,该响应到达控制器后,控制器将其发送给第一台主机,并且给s1(OpenFlow交换机)的流表中注入一条流记录。
image

图2-4 在Mininet中发出一个“h1 ping–c 1 h2”命令后捕获的流量
这时,第一台主机已经知晓了第二台主机的IP地址,就可以通过ICMP echo请求发送ping数据包了,该请求和第二台主机的响应均传到控制器,进而产生一条推送的流记录,同时将实际的数据包发送出去。在我们建立的环境中,得到的ping的往返时间是3.93ms。再重复执行一次ping命令:

第二次执行ping命令的时间减少到只有0.25ms,因为之前交换机中已经存在了一条覆盖ICMP ping流量的流记录,所以不需要再产生控制流量,数据包得以直接通过交换机转发。一个运行该测试的简便方法是使用Mininet CLI内建的pingall命令,该命令能够对网络中的所有节点对执行ping测试;另一个有用的测试是一个自包含的回归测试。下面的命令将创建一个最小拓扑结构,启动OpenFlow参考控制器,运行一遍全网节点配对的ping测试,然后拆除所建立的拓扑连接及控制器。
image

另一个有用的测试是使用iperf进行性能评估。
image

这个命令需要几秒钟的时间来完成,它建立起一个同样的Mininet网络拓扑(一个控制器、一个交换机、两个主机),在其中一台主机上运行一个iperf服务器,在第二台主机上运行一个iperf客户端,然后报告两台主机之间的TCP带宽。
利用Mininet的Python API,还能够在实验中对拓扑结构进行定制,这里所提供的一个内置的例子就是~/mininet/custom/topo-2sw-2host.py,它可以将两台交换机直接相连,并有一台主机同时连接两台交换机。

image

下载样例程序代码
所有在http://www.packtpub.com/support上用自己的账号购买的Packt图书,都可以下载样例代码文档。如果你在其他地方购买的本书,也可以访问http://www.packtpub.com/support,注册后便可通过电子邮件直接收到所需的文档。
上面的这段Python脚本可以作为命令行参数传递给Mininet,若提供了定制的Mininet文档,还可以加入新的网络拓扑、交换机类型和对命令行的测试。例如:可以对前面提到的拓扑结构执行pingall测试,可采用下述的Mininet调用命令:
image

对于更复杂的调试,以及同时还需要访问主机、交换机或者控制器的命令界面的情况,可以用命令行参数“–x”启动Mininet(即sudo mn –x),这时,将会弹出xterms界面,能很方便地运行交互式的命令。例如,在标记有switch: s1(root)的xterm界面中,可以运行下述命令:
image

由于交换机s1的流表是空的,因此,不会有任何输出。这时,在主机h1的xterm中,可以使用常规的ping命令去ping另一台主机h2(如# ping 10.0.0.2)。如果你再返回交换机s1的xterm中,对流表进行dump操作,将会看到出现了多条流记录。你还可以使用Mininet中内置的dpctl命令进行操作。
本章只对Mininet进行了简单的介绍,在后面几章中,我们将把Mininet作为OpenFlow控制器实验平台的一部分,以及网络应用开发的组成部分。感兴趣的读者可以从Mininet的网站www.mininet.org找到更多详细介绍。

相关文章
|
缓存 监控 负载均衡
基于SDN环境下的DDoS异常攻击的检测与缓解--实验
基于SDN环境下的DDoS异常攻击的检测与缓解--实验
|
Ubuntu 网络协议 Linux
混合IP-SDN环境的仿真实验
混合IP-SDN环境的仿真实验
混合IP-SDN环境的仿真实验
|
缓存 移动开发 网络协议
基于Open vSwitch的传统限速和SDN限速--实验 2
基于Open vSwitch的传统限速和SDN限速--实验
|
Java SDN 数据库
基于Open vSwitch的传统限速和SDN限速--实验 1
基于Open vSwitch的传统限速和SDN限速--实验
|
监控 安全 测试技术
CLAS:用于软件定义网络SDN的协作分层架构
网络软件化的进步正在促进在电信运营商的服务和基础设施中引入可编程性。这通常是通过在网络中引入软件定义网络 (SDN) [RFC7149] [RFC7426] 功能来实现的,包括控制器和协调器。
480 0
CLAS:用于软件定义网络SDN的协作分层架构
|
存储 运维 安全
软件定义网络:从服务提供商视角看SDN
它并不是要无休止地讨论 SDN 的真正含义,而是建议对可以在 SDN 保护伞下使用的技术进行功能分类,并详细说明这些技术的联合激活不可避免地引起的各种悬而未决的问题。因此,仅出于澄清目的而提及SDN的定义。
264 0
软件定义网络:从服务提供商视角看SDN
|
SDN
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(四)
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(四)
97 0
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(四)
|
SDN
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(三)
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(三)
168 0
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(三)
|
SDN
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(二)
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(二)
167 0
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(二)
|
SDN
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(一)
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(一)
180 0
第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】(一)