一、实验目的
利用控制器提供的 API(例如 RESTAPI),开发一个网络及流表管理工具(客户端,网页端均可)。管理工具可以显示网络拓扑结构,查看流表,增加流表,删除流表。
二、实验原理-程序设计
我们基于 Floodlight现有的API实现了一个简单的 Web站点,主要功能有:
- 查看Switch列表及各个Switch的信息
- 查看Host列表及各个Host的信息
- 查看拓扑图
- 查看流表
- 针对某个Switch添加/删除Static Flow
- 查看日志
图 1.1:架构设计
底层虚拟机的操作系统上安装有 Mininet,通过 Mininet我们可以创建多种类型的拓扑,并且可以把 floodlight controller设置为远程,在我们的方案中floodlight安装在虚拟机的宿主机上。Floodlight负责监听和控制虚拟机中拓扑的动态。我们在宿主机上又搭建了一个网站,网站后端即CommandProxy负责转发前端Web Interface的操作请求给 Floodlight,Floodlight通过RESTAPI接口开放。前端Web Interface负责发出操作请求并在页面上展示整个拓扑的状态并提供操作接口以便用户能够添加/删除flows。
(一)Mininet Virtual Network
1.1 Mininet介绍
Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用 ssh登录,启动应用程序,程序可以向以太网端口发送数据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。
Mininet的特性包括可以简单、迅速地创建一个支持用户自定义的网络拓扑,缩短开发测试周期。可以运行真实的程序,在 Linux上运行的程序基本上可以都可以在 Mininet上运行,如 Wireshark Mininet。支持 Openflow,在Mininet上运行的代码可以轻松移植到支持OpenFlow的硬件设备上。Mininet可以在自己的电脑,或服务器,或虚拟机,或者云(例如 Amazon EC2)上运行。Mininet提供python API,简单易用。
1.2基于Mininet拓扑搭建
拓扑搭建方面我们使用了Mininet,我们在 VirtualBox安装 Mininet虚拟机。利用它可以非常方便的模拟出一个网络。例如,模拟出一个网络的命令为:
1 |
>>sudo mn--custom /home/ubuntu/mininet/custom/proxy-access.py--topomytopo --switch ovsk --controller=remote,ip=192.168.181.129,port=6633 |
Mininet可以连接到Floodlight作为 Controller,Controller可以是本地的或者远程的。默认情况下一个 Mininet虚拟网络中的 Swicth只能使用同一个Controller,但是可以通过编写自定义脚本的方式来构建 Mininet拓扑,并且在其中显示的指定多个 Controller。
我的拓扑文件proxy-access.py脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from mininet.topo import Topo class MyTopo( Topo ): "Simple topology example." def __init__( self ): "Create custom topo." # Initialize topology Topo.__init__( self ) # Add hosts and switches Switch1 = self.addSwitch( 's1' ) Switch2 = self.addSwitch( 's2' ) Switch3 = self.addSwitch( 's3' ) Host1=self.addHost('h1') Host2=self.addHost('h2') Server=self.addHost('server') Proxy=self.addHost('proxy') # Add links self.addLink( Switch1,Host1 ) self.addLink( Switch1,Host2 ) self.addLink( Switch1,Switch2 ) self.addLink( Switch3,Switch2 ) self.addLink( Switch2,Server ) self.addLink( Switch3,Proxy ) topos = { 'mytopo': ( lambda: MyTopo() ) } |
(二)Floodlight
Floodlight是Openflow协议的一个实现。它提供了一些简单的 API用来查询和控制网络状态,例如查询拓扑环境;罗列 Switch和 Host;添加/删除静态流;配置防火墙等。
(三)Command Proxy
由于 ajax不能跨域请求,所以我们建立了一个服务器端代理。Command Proxy是我们用 Php编写的一个后端脚本,它用来转发 Web Interface的请求或者执行Web Interface发送的命令。流程如图 1.2所示:
图 1.2:Command Proxy流程
(四)Web Interface
Web Interface提供了可视化的用户接口,用户可以在浏览器中查看拓扑、添加/删除流、查看日志等操作,并负责发出操作请求到后端 commend proxy。
三、实验过程及结果
在浏览器中输入 localhost/floodlightUI/index.html可进入 web界面查看各类信息。主界面如图 1.3所示:
图 1.3:web主界面
(一)查看 Switch列表及各个Switch的信息
图 1.4:Switches界面
首先为用户提供了可视化界面来查看路由的列表,所有路由的 IPAdress、Vender、Packets、Bytes、Flows以及Connected Since信息一览无遗。
(二)查看 Host列表及各个Host的信息
图 1.5:Host界面
同时继续利用 floodlight的自带 API让各主机的信息也完美地展现在了用户面前。
(三)查看拓扑图
图 1.6:Topology界面
接着我们实现了查看拓扑结构的功能,用户还可以自由拖动图中的设备以达到最好的视觉化效果。
(四)查看流表
图 1.7:Flows界面
点击 Switches界面中某个具体交换机,便可以进入并查看该交换机的具体信息,还提供了查看流表的功能。用户可以看到流的名称、Cookie、优先级、数据包数量等信息。
(五)针对某个 Switch添加/删除Static Flow
图 1.8:添加流表
我们还给用户提供了增加和删除流表的功能。在流表的下方我们为用户提供了命令输入窗口,单击 Flow Pusher可出现一个输入框,在这里用户可以自主输入添加流表命令,比如示例命令如下:
1 2 3 |
curl -d '{"switch": "00:00:00:00:00:00:00:03", "name":"flow-mod-1", "cookie":"0", "priority":"32768", "ingress-port":"1","active":"true", "actions":"output=2"}' http://localhost:8080/wm/staticflowentrypusher/json |
单击 commit来添加流表。图 1.8是在添加流表,图1.9则是添加流表成功的样子。我们可以明显看到流表中多了一条记录。
图 1.9:流表已添加
删除和添加基本上一样,区别仅在于命令不同。这是删除上面添加的流表的示例命令:
1 2 |
curl -X DELETE -d '{"name":"flow-mod-1"}' http://localhost:8080/wm/staticflowentrypusher/json |
图 1.10:删除流表
图 1.11:流表已删除
(六)查看日志
最后我们还完成了查看日志的功能。整个拓扑网络的日志监听完整地在这里反映出来了,并能够根据日志实时更新页面。页面的样子如下:
图 1.12:日志显示
源代码和PDF在我的github上面:https://github.com/JianqingJiang/flowtable-manager-WebUI
作者简介:
蒋暕青@上海宽带技术及应用工程研究中心:SDN技术实践者,大四北上思博伦实习半年,现工作地点上海
--------------华丽的分割线------------------
本文系《SDNLAB原创文章奖励计划》投稿文章,该计划旨在鼓励广大从业人员在SDN/NFV/Cloud网络领域创新技术、开源项目、产业动态等方面进行经验和成果的文字传播、分享、交流。有意向投稿的同学请通过官方唯一指定投稿通道进行文章投递,投稿细则请参考《SDNLAB原创文章奖励计划》