本节书摘来自华章计算机《软件定义网络:基于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图形化界面会在另一个窗口中显示。
图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信息,可以分别采用下列命令:
当使用默认的拓扑结构建立起Mininet 仿真环境后,OpenFlow控制器和交换机就启动OpenFlow协议的通信,这时便可以在Wireshark的捕获窗口查看捕获的数据包了。图2-3的截屏图中给出了所捕获的流量,从中可以观察到握手(Hello)消息,特性(feature)请求和响应消息,以及若干数据包输入(packet-in)消息,从而证明在所建立的环境中,OpenFlow交换机已经与OpenFlow控制器建立起了连接。
图2-3 Wireshark中捕获的OpenFlow流量
如果在Mininet命令行界面(提示符为:mininet>)中输入的第一个字符串是一个主机、交换机或者控制器的名称,则将在这个指定的节点上执行命令。例如:查看第一个主机(h1)的以太网卡和环回网卡,可以使用下面的命令:
现在,我们可以通过下面这个简单的ping命令查看h1与每个主机的连接情况:
上面的命令从主机h1向主机h2发送单个的ping数据包,第一台主机(h1)需要先发送ARP请求,以获取第二台主机(h2)的MAC地址,由此产生一个发给OpenFlow控制器的packet_in消息,控制器接着采用洪泛的方式发送一个packet_out消息,将数据包广播到交换机的其他端口(在该样例中,只有一个数据端口)。第二台主机查看了ARP请求后,发送一个广播响应,该响应到达控制器后,控制器将其发送给第一台主机,并且给s1(OpenFlow交换机)的流表中注入一条流记录。
图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测试,然后拆除所建立的拓扑连接及控制器。
另一个有用的测试是使用iperf进行性能评估。
这个命令需要几秒钟的时间来完成,它建立起一个同样的Mininet网络拓扑(一个控制器、一个交换机、两个主机),在其中一台主机上运行一个iperf服务器,在第二台主机上运行一个iperf客户端,然后报告两台主机之间的TCP带宽。
利用Mininet的Python API,还能够在实验中对拓扑结构进行定制,这里所提供的一个内置的例子就是~/mininet/custom/topo-2sw-2host.py,它可以将两台交换机直接相连,并有一台主机同时连接两台交换机。
下载样例程序代码
所有在http://www.packtpub.com/support上用自己的账号购买的Packt图书,都可以下载样例代码文档。如果你在其他地方购买的本书,也可以访问http://www.packtpub.com/support,注册后便可通过电子邮件直接收到所需的文档。
上面的这段Python脚本可以作为命令行参数传递给Mininet,若提供了定制的Mininet文档,还可以加入新的网络拓扑、交换机类型和对命令行的测试。例如:可以对前面提到的拓扑结构执行pingall测试,可采用下述的Mininet调用命令:
对于更复杂的调试,以及同时还需要访问主机、交换机或者控制器的命令界面的情况,可以用命令行参数“–x”启动Mininet(即sudo mn –x),这时,将会弹出xterms界面,能很方便地运行交互式的命令。例如,在标记有switch: s1(root)的xterm界面中,可以运行下述命令:
由于交换机s1的流表是空的,因此,不会有任何输出。这时,在主机h1的xterm中,可以使用常规的ping命令去ping另一台主机h2(如# ping 10.0.0.2)。如果你再返回交换机s1的xterm中,对流表进行dump操作,将会看到出现了多条流记录。你还可以使用Mininet中内置的dpctl命令进行操作。
本章只对Mininet进行了简单的介绍,在后面几章中,我们将把Mininet作为OpenFlow控制器实验平台的一部分,以及网络应用开发的组成部分。感兴趣的读者可以从Mininet的网站www.mininet.org找到更多详细介绍。