FlowVisor+Mininet+Oendaylight
FlowVisor学习
1.FlowVisor
1.1.F lowVisor介绍
FlowVisor是建立在OpenFlow之上的网络虚拟化平台,它可以将物理网络分成多个逻辑网络,从而实现开放软件定义网络(SDN)。它为管理员提供了广泛定义规则来管理网络,而不是通过调整路由器和交换机来管理网络。FlowVisor安装在商品硬件上,它是一个特殊的OpenFlow控制器,主要是作为OpenFlow交换机网络和其他标准OpenFlow控制器之间的透明代理。虽然FlowVisor仍被认为处于试验阶段,并且缺乏一些基本功能(例如命令行管理工具),但FlowVisor已经被部署在很多生产环境中,例如从2009年开始应用于斯坦福大学的校园网络。
FlowVisor通过抽象层来分割物理网络,它位于一组交换机和软件定义网络或多个网络之间,管理带宽、CPU利用率和流量表,这类似于管理程序位于服务器硬件和软件之间,以允许多个虚拟操作系统运行。
正如管理程序依赖于标准x86指令来虚拟化服务器一样,FlowVisor使用标准OpenFlow 指令集来管理OpenFlow交换机,这些指令设置了低级别规则,比如如何基于数据包表头中的特点来转发数据包。
由于所有这些规则都是通过流量表定义的,因此,无论是从带宽还是CPU使用率来看,网络虚拟化都没有增加很多开销或者几乎没有增加开销,不过另外需要设置和修改流量表规则的单独的带外物理控制器。
1.1.1.FlowVisor基本概念
1.1.
2.切片
FlowVisor网络的基本要素是网络切片(Slice),网络切片是由一组文本配置文件来定义的。文本配置文件包含控制各种网络活动的规则,例如允许、只读和拒绝,其范围包括流量的来源IP地址、端口号或者数据包表头信息。
例如,网络管理员可以将安全的Telnet流量(默认端口992)分配到其自身的切片,将执行团队IP地址的流量分配到另一个切片。然后他可以创建第三个默认切片来管理所有其他流量,把它当做“只读”切片来监控其他三个切片,以达到诊断目的。网络管理员可以动态地重新分配和管理这些切片,以确保浏览YouTube的人不会对Telnet应用程序和执行团队带宽造成负面影响。
1.1.3.流规则
其英文名称Flowspace。表面上理解是流空间,但实际上切片定义了控制器的网络分区,不定义切片的匹配规则。需要创建的规则叫做FlowSpace。所以其翻译成流规则更好些。Flowspace包含下面字段:
1.1.4.带宽
每个切片应该具有专门的总可用带宽百分比。
1.1.5.拓扑结构
每个切片对于网络节点(包括物理和虚拟交换机及路由器)应该有自己的“看法”.切片的组成部分应该是不知道切片的:对于控制器而言,FlowVisor看起来就是普通的交换机;从OpenFlow交换机的角度来看,FlowVisor就是一个控制器。
1.1.6.转发表
由于转发表往往被限定在物理设备上,网络管理员应确保一个切片不会影响任何特定设备的转发表,迫使它放弃另一切片的规则。
1.2.FlowVisor安装过程
好多前辈都写过相关的文档,我是按照前辈的文档来进行安装的。所以在这里我也不多说什么就写简要步骤。
●环境搭建
安装JDK,之前很多前辈说FlowVisor不支持JDK1.6以上的版本。估计FlowVisor 也改进过,亲测JDK1.7可以使用。安装JDK:sudo apt-get install openjdk-7-jdk 安装ant,不多说,比较简单,sudo apt –get install Ant.
●获取源码
下载flowvisor-1.0-MAINT.zip
git clone git://https://www.360docs.net/doc/5518420930.html,/OPENNETWORKINGLAB/flowvisor.git
Make操作后
然后你就会发现,成功了。
sudo make install
在输入完User和Group后,记得不要输入密码,不然每次操作都要输入密码,比
较麻烦。
启动flowvisor
flowvisor /usr/local/etc/flowvisor/flowvisor-config.xml
1.3.FlowVisor基本操作
1.3.1.切片操作
●创建切片
命令格式:
fvctl add-slice [options]
具体命令:
fvctl -p 8081 add-slice s1 tcp:127.0.0.1:6636 fv@https://www.360docs.net/doc/5518420930.html,
成功显示:
查看切片
查看所有的切片
命令格式:
fvctl -p
具体命令:
fvctl -p 8081 list-slices
查看具体切片
命令格式:
fvctl -p
fvctl -p 8081 list-slice-info s1
●显示slice的统计信息
fvctl -p 8081 list-slice-stats s1
●修改切片
命令格式:
fvctl -p <8081> update-slice [option]
fvctl -p 8081 update-slice --disable-slice s1
关闭slice:s1
●删除切片
命令格式:
fvctl remove-slice
具体命令:
fvctl remove-slice s1
1.3.1.流规则操作
添加flowspace
命令格式:
fvctl add-flowspace [options]
fvctl -p 8081 add-flowspace fs1 all 100 dl_dst=78:45:c4:2d:72:51 s1=5
fvctl -p 8181 add-flowspace fs1 all 100 dl_src=78:45:c4:2d:72:51 s1=5
fvctl -p 8181 add-flowspace fs2 all 100 dl_dst=78:45:c4:29:fb:c4 s2=5
fvctl -p 8181 add-flowspace fs2 all 100 dl_src=78:45:c4:29:fb:c4 s2=5
注:flowspace的名字可以重名。
更多命令可以查看man fvctl
2.Mininet
2.1.SDN 与Mininet 概述
SDN 全名为(Software Defined Network)即软件定义网络,是现互联网中一种新型的网络创新架构,其核心技术 OpenFlow 通过网络设备控制面与数据面分离开来,从而实现网络流量的灵活控制,为网络及应用提供了良好的平台。而 Mininet 是一个轻量级软件定义网络和测试平台;它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行想过的内核系统和用户代码,也可简单理解为 SDN 网络系统中的一种基于进程虚拟化平台,它支持 OpenFlow、OpenvSwith 等各种协议,Mininet 也可以模拟一个完整的网络主机、链接和交换机在同一台计算机上且有助于互动开发、测试和演示,尤其是那些使用 OpenFlow 和 SDN 技术;同时也可将此进程虚拟化的平台下代码迁移到真实的环境中。
2.2.Mininet的特性
?支持OpenFlow、OpenvSwitch 等软定义网路部件
?支持系统级的还原测试,支持复杂拓扑,自定义拓扑等
?提供Python API, 方便多人协作开发
?很好的硬件移植性与高扩展性
?支持数千台主机的网络结构
2.3.常用指令
3.Opendaylight
3.1.ODL概念
Opendaylight是一个以模块化、可插拔、灵活的、基于Java的控制器为核心的开源平台。从北往南,它首先包括供上层应用和业务逻辑使用的北向开放API,有OSGi和REST 两类。上层应用程序利用这些北向API获得网络智能信息、运行算法处理分析以及组合新的网络策略;其次,它包括控制器平台本身,它是一组可动态组合的模块用于汇集网络信息,比如网络中有哪些元素、其统计信息如何等;最南边是能够支持多种协议的南向接口,如Openflow 1.0 1.3 BGP-LS等,这些南向接口可以调用设备上服务抽象层SAL。
在这里我们用的是ODL中的controller的部分,那controller部分的作用是什么呢,在这里controller为控制器,其控制着交换机的路由转发。
3.2.ODL的框架原则
Open Daylight Controller在设计的时候遵循了六个基本的架构原则:
(1) 运行时模块化和扩展化(Runtime Modularity and Extensibility):支持在控制器运行时进行安装、删除和服务的更新。
(2) 多协议的南向支持(Multiprotocol Southbound):南向支持多种协议。
(3) 服务抽象层(Service Abstraction Layer):南向多种协议对上提供统一的北向服务接口。
(4) 开放的可扩展北向API(Open Extensible Northbound API):提供可扩展的应API,通过REST或者函数调用方式。两者提供的功能要一致。
(5) 支持多租户、切片(Support for Multitenancy/Slicing):允许网络在逻辑上(或物理上)划分成不同的切片或租户。控制器的部分功能和模块可以管理指定切片。控制器根据所管理的分片来呈现不同的控制观测面。
(6) 一致性聚合(Consistent Clustering):提供细粒度复制的聚合和确保网络一致性的横向扩展(scale-out)。
3.3.框架概述
上图所示,南向通过plugin的方式来支持多种协议,包括OpenFlow1.0、1.3,BGP-LS 等。这些模块被动态挂载到服务抽象层(SAL),SAL 为上层提供服务,将来自上层的调用封装为适合底层网络设备的协议格式。控制器需要获取底层设备功能、可达性等方面的信息,这些信息被存放在拓扑管理器(T opology Manager)中。其他的组件,包括ARP handler、HostTracker、Device Manager和Switch Manager,则为Topology Manager生成拓扑数据。
控制器为应用(App)提供开放的北向API。支持OSGi 框架和双向的REST 接口。OSGi框架提供给与控制器运行在同一地址空间的应用,而REST API 则提供给
运行在不同地址空间的应用。所有的逻辑和算法都运行在应用中。
控制自带了GUI,这个GUI 使用了跟应用同样的北向API,这些北向API 也可以被其他的应用调用。
4.建立连接
4.1.FlowVisor部分
●启动FlowVisor
在终端中输入命令:
flowvisor /etc/flowvisor/config.json
启动后界面如下:
在这里要注意的是FlowVisor的服务端口是8081.不要错误的认为监听端口是8081,然后连接到这个端口上。
●创建slice
创建slice的命令格式为
fvctl add-slice [options]
执行fvctl -p 8081 add-slice s1 tcp:192.168.5.64:6633 sono@https://www.360docs.net/doc/5518420930.html,命令,就可以创建切片。创建成功如下:
这里面要注意的是tcp条件后面的ip地址是你的控制器的ip地址。我这里用的是opendaylight,端口就是opendaylight监听的端口。还有就是一个切片只能对应一个控制器,这算是flowsivor的不足之处吧。
创建完后使用fvctl -p 8081 list-slices我们来看看创建的slice
或者具体的看看slice里面的信息,使用fvctl -p 8081 list-slice-info s1,具体显示如下:
●创建规则
在不创建规则的情况下,opendaylight是无法和flowsivor建立连接的。即使你创建了slice,并且提示是成功的,也无法连接。不多说具体创建操作fvctl -p 8081
add-flowspace fs1 all 100 any s1=5,创建完,终端不会显示什么有效信息,但是opendaylight控制器的控制端可以看到以下信息:
证明flowvisor已经连接到控制器中。但是里面还没有交换机的任何信息。到这里我们flowvisor的操作部分已经完成。下面我们来操作mininet部分。
4.2.Mininet部分
●创建虚拟拓扑
创建拓扑可以直接在root下直接使用mn就可以创建默认的拓扑了,但是默认的拓扑也是只是连接到127.0.0.1上。所以我们要使用以下命令:
sudo mn --topo=tree,3 --controller=remote,ip=192.168.217.128,port=6644
解释下: mn后通过 --来加参数topo是指的你的拓扑结构,其中的tree,3是表示三层树形结构,--controller=remote表示拓扑网络的控制器控制方式是remote,其中的ip 是指flowvisor所在主机的ip,端口就是flowvisor的监听端口,我这里改的是6644。创建后的效果如下:
●查看flowvisor主机的net
当虚拟网络创建好了后,我们就可以看到flowvisor监听端口,建立的tcp连接。使用如下命令查看
能看到我们创建了7个交换机,这七个交换机和flowvisor建立的tcp连接。
●查看flowvisor中的datapaths
不多说使用datapaths可以查看连接进来的交换机,我们使用的查看命令是:
fvctl -p 8081 list-datapaths
4.3.Opendaylight部分
●控制端显示
到这里就创建好了一个网络虚拟化实例,下面看看控制端现实的信息:
这里我们能看到七个虚拟交换机和控制器通过tcp相连。
●Web端显示
这是web端的拓扑结构,当然这些交换机并不是真的存在,是通过mininet虚拟出来的突破结构。
这是交换机的节点信息信息,在这里我们发现我们创建的虚拟交换机是openflow 交换机。其节点信息如下:
4.4.抓包看看tcp连接
5.基于实验的flowspace细述
Flowspace的概念上面已经讲过,FlowSpace defined by a collection of packet headers and assigned to “Slices”。
上述的实验连接中创建flowspace使用的是最近本的命令,具体命令如下:
fvctl -p 8081 add-flowspace fs1 all 100 any s1=5
其中在链路这个参数上我们定义了all,即使用所用交换机,100为优先级,match匹配项中我们用的是any,即任何主机都可以成为消息的发送者和接受者。
5.1.全路径,单向数据通路
这次我们使用的链路还是all,只给定单向数据通通路。
(1)我们使用如下命令创建流规则:
fvctl -p 8081 add-flowspace fs1 all 100 nw_src=10.0.0.1,nw_dst=10.0.0.0.2
(2)我们使用如下命令让其生效:(当发现你写改的规则无法生效时可以使用)
fvctl -p 8081 update-slice --disable-slice s1让slice失效
fvctl -p 8081 update-slice --enable-slice s1让slice生效
(3)让我们查看下数据链路的ping情况
我们会发现所有的都是ping不通的。
5.2.全路径,双向数据通路
这次我们使用的链路还是all,给定双向的数据通路。
(1)我们使用如下命令创建流规则:
fvctl -p 8081 add-flowspace fs1 all 100 nw_src=10.0.0.1,nw_dst=10.0.0.0.2
fvctl -p 8081 add-flowspace fs1 all 100 nw_src=10.0.0.2,nw_dst=10.0.0.0.1
(2)我们使用如下命令让其生效:(当发现你写改的规则无法生效时可以使用)fvctl -p 8081 update-slice --disable-slice s1让slice失效
fvctl -p 8081 update-slice --enable-slice s1让slice生效
(3)让我们查看下数据链路的ping情况
我们会发现所有的都还是能ping通的。
5.3.指定路径,单向数据通路
这次我们给定链路,但是只给定单向数据通通路。
(1)我们使用如下命令创建流规则:
fvctl -p 8081 add-flowspace fs1 00:00:00:00:00:00:00:03100
nw_src=10.0.0.2,nw_dst=10.0.0.0.1
(2)我们使用如下命令让其生效:(当发现你写改的规则无法生效时可以使用)fvctl -p 8081 update-slice --disable-slice s1让slice失效
fvctl -p 8081 update-slice --enable-slice s1让slice生效
(3)让我们查看下数据链路的ping情况
我们会发现所有的都是ping不通的。
5.4.指定路径,双向数据通路
这次我们给定链路,但是只给定双向数据通通路。
(1)我们使用如下命令创建流规则:
fvctl -p 8081 add-flowspace fs1 00:00:00:00:00:00:00:03100
nw_src=10.0.0.2,nw_dst=10.0.0.0.1
fvctl -p 8081 add-flowspace fs1 00:00:00:00:00:00:00:03100
nw_src=10.0.0.0.1,nw_dst=10.0.0.2
(2)我们使用如下命令让其生效:(当发现你写改的规则无法生效时可以使用)fvctl -p 8081 update-slice --disable-slice s1让slice失效
fvctl -p 8081 update-slice --enable-slice s1让slice生效
(3)让我们查看下数据链路的ping情况
的具体细节如下:
我们会发现h1和h2之间都能ping通。
以下是抓包信息:
5.5.流规则结论
建立通路的两个条件:
●条件一
有完整的路径,即在flowspace中有完整的dpip路径。
●条件二
有一个完整的原地址和目的地址,即双向的原地址和目的地址,举个简单的例子:即有nw_src=10.0.0.1,nw_dst=10.0.0.2,也有nw_src=10.0.0.2,nw_dst=10.0.0.1.
提示:如果发现流规则不起作用就想把slice设置为disable然后再设置为enable。