已阅读5页,还剩85页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录架构3开始3安装指导3概述3准备工作3下载编译3运行Floodlight4Eclipse设置4虚拟一个网络4下一步5可兼容交换机5虚拟交换机5硬件交换机5可支持的拓扑结构6发布版8发行说明8Floodlight v0.9发行说明8概述8新添加的东西8应用9用户文档9控制器9Configuration HOWTO9监听地址和端口配置10Floodlight REST API11应用18开发者文档28模块描述及javadoc28控制器模块28FloodLight目前已经实现的控制器模块28FloodlightProvider28DeviceManagerImpl30LinkDiscoveryManager (Dev)32TopologyService33RestApiServer34ThreadPool35MemoryStorageSource36Flow Cache36Packet Streamer37应用模块41虚拟网络过滤器(Quantum插件)41转发43防火墙44Port Down Reconciliation49模块加载系统50Javadoc entry55添加模块57创建一个监听模块57Mininet虚拟网络连接floodlight63添加模块服务63创建类65添加rest API70Floodlight rest API开发76Floodlight-Test77Unit测试85控制器基准配置86基准配置86Cbench (New)87怎样用floodlight满足服务质量8890架构Floodlight不仅仅是一个支持OpenFLow协议的控制器(FloodlightCOntroller),也是一个基于Floodlight控制器的应用集。当用户在OpenFLow网络上运行各种应用程序的时候,Floodlight控制器实现了对OpenFLow网络的监控和查询功能。图0.0显示了Floodlight不同模块之间的关系,这些应用程序构建成java模块,和Floodlight一起编译。同时这些应用程序都是基于REST API的。开始安装指导概述基于Java的Floodlight可以用标准jak工具或ant编译运行,当然也可以有选择性的在Eclipse上运行。准备工作Linux:l Ubuntu 10.04(Natty)及以上版本(运行Ant1.8.1及以下版本)l 安装JDK,Ant。(可在eclipse上安装)$sudo apt-get install build-essential default ant python-dev eclipseMacl Mac系统x10.6及以上版本(低版本未测试)l Cxode4.1或Xcode4.0.2l JDK:只需要在终端输入命令:javac便可安装l Eclipse(非必须 )下载编译从Github下载并比编译Floodlight$git clone git://floodlight/floodlight.git$cd floodlight$ant运行Floodlight如果java运行环境已经安装成功,就可以直接运行:$java -jar target/floodlight.jarFloodlight就会开始运行,并在控制台打印debug信息Eclipse设置通过Eclipse运行、开发、配置Floodlight:$ant eclipse上述命令将创建多个文件:Floodlight.launch,Floodlight_junit.launch,classpath和.project。通过这些设置eclipse工程l 打开eclipse创建一个新的工程l 文件-导入-常规-现有项目到工程中-下一步l 点击“选择根目录”,点击“浏览”。选择之前放置Floodlight的父路径l 点击Floodlightl 点击“完成”现在就产生了一个Floodlight的Eclipse工程。由于我们是使用静态模块加载系统运行Floodlight,我们必须配置eclipse来正确的运行Floodlight。创建Floodlight目标文件:l 点击运行-运行配置l 右击java 应用-新建l “Name”使用“FloodlightLaunch”l “Project”使用“Floodlight”l “Main”使用“net.floodlightcontroller.core.Main”l 点击“应用”虚拟一个网络启动了Floodlight之后,就需要链接到一个OpenFlow的网络。Mininet是最好的网络虚拟工具之一。l 下载Floodlight-vm机自启动并内嵌Mininet工具。l 使用Vmware或者virtualbox打开Floodlight-vm,在启动之前,点击网络选项不要从导入虚拟机后的安装目录中运行脚本启动l 登录(用户名是:floodlight没有密码)l 既可以在使用Floodlight-vm开机自启动的Floodlight控制器也可以通过命令指定到远程的控制器,输入:$sudo mn -controller=remote,ip=,port=可以通过ssh远程登陆到floodlight-vm虚拟机运行wireshark,监听eth0端口并用“of”协议过滤器过滤。$ssh -X floodlight$sudo wireshark下一步阅读完getstart文档之后,可以参阅floodlight开发文档,里面有很多实例和代码。可兼容交换机下面列出了可以和Floodlight控制器兼容的交换机虚拟交换机l Open vSwitch(OVS)硬件交换机 Arista 7050 Brocade MLXe Brocade CER Brocade CES Dell S4810 Dell Z9000 Extreme Summit x440, x460, x670 HP 3500, 3500yl, 5400zl, 6200yl, 6600, and 8200zl (the old-style L3 hardware match platform) HP V2 line cards in the 5400zl and 8200zl (the newer L2 hardware match platform) Huawei openflow-capable router platforms IBM 8264 Juniper (MX, EX) NEC IP8800 NEC PF5240 NEC PF5820 NetGear 7328SO NetGear 7352SO Pronto (3290, 3295, 3780) - runs the shipping pica8 software可支持的拓扑结构Floodlight现在在支持梁中锋不同的包转发应用,这两种应用具有不同的行为,并且向下图的拓扑结构一样运行:l 在转发方面:在网络中的任意两个终端设备之间进行端到端的数据转发内含OpenFLow网络孤岛(OpenFlow island):到同一OpenFlow网络孤岛中的任意一设备A发送数据包到设备B,转发模块会计算出A到B之间的最短路径。内含非OpenFlow网络孤岛(non-OpenFlow island)的OpenFLow网络孤岛:每一个OpenFlow网络孤岛都可能有一个连接到非OpenFlow孤岛的链接。另外,如图3所示,OpenFlow和非OpenFlow网络孤岛之间不能构成环网图1:Floodlight接入OpenFlow网络的例网拓扑图2:Floodlight未接入OpenFlow网络的例网拓扑,OpenFlow网络孤岛1有两个到非OpenFlow网络孤岛的链接图3:Floodlight未接入OpenFlow网络的例网拓扑,OpenFlow孤岛和非OpenFlow孤岛形成了一个环网,甚至每一个OpenFlow孤岛都有唯一一个连接到非OpenFlow孤岛的链接l 当转发路径中超过指定的时间间隔(默认5秒),通过转发超时安装路径。l 自我学习的交换机:一个简单的二层自我学习交换机:1 在任何数量的OpenFlow网络孤岛中使用,甚至在非OpenFlow的2层网络孤岛中。2 不能在环路网路中的网络孤岛中工作,也不能在孤岛形成的环网中工作3 数据转发效率远高于其他方法l 另外,Floodlight也提供一个Static Flow Entry Pusher应用和一个Circuit Pusher应用,允许用户主动安装转发路径(proactively install forwarding paths)的行为1 Static Flow Entry Pusher允许修改交换机流表项,从而创造由用户根据交换机端口明确选择的转发路径2 CircuitPusher是基于Static Flow Entry Pusher,Device Manager,Routing services的RestAPI,在单个OpenFlow孤岛中建立一个最短路径流*术语“孤岛”和“集群”是可以互换使用的。一个OpenFlow孤岛/集群就是OpenFlow交换机连接到其中任何设备的集合。类似的,非OpenFlow的孤岛/集群就是任何连接到非OpenFlow交换机的设备。发布版发行说明Floodlight v0.9发行说明发布日期:2012年10月概述Floodlighr v0.9包含了控制器新的RestAPI,新的应用,漏洞修复,新框架测试等新添加的东西REST APIs显示如何进行外部连接,通过BDDP发现多跳链路而不是LLDP由于处理错误的API并不在发布包中,但是可以通过纯净版的Floodlight下载页面或者在github上的Floodlight-master下载获得。 /wm/topology/external-links/json显示在LLDP数据包中发现的直连(DIRECT)和隧道链接(TUNNEL) /wm/topology/links/json给OpenStack/quantum插件的虚拟网络过滤器添加新的API,以显示所有的创建的虚拟网络名,Guid,网关和主机 /quantum/v1.0/tenants/networks应用l Circuit Pusher,一个基于Python的REST应用接口,使用RESTAPI来设置两台IP主机的流。包括新的REST APIsl Firewall,一个java应用模块,提供基于控制器的无状态ACL支持用户文档控制器Floodlight不仅仅是一个支持OpenFLow协议的控制器(FloodlightCOntroller),也是一个基于Floodlight控制器的应用集。当用户在OpenFLow网络上运行各种应用程序的时候,Floodlight控制器实现了对OpenFLow网络的监控和查询功能。图0.0显示了Floodlight不同模块之间的关系,这些应用程序构建成java模块,和Floodlight一起编译。同时这些应用程序都是基于REST API的。当运行floodlight时,控制器和一组java应用模块(这些会在floodlight属性文件中载入)开始运行。REST API通过REST端口(默认8080)对所有的运行中的模块开放。Configuration HOWTO选择加载模块Floodlight可以配置载入不同的模块以适应不停地应用。配置不同的载入模块之后必须重启生效。目前对于Floodlight模块的配置都是通过需在启动时加载的一个配置文件的修改实现的。简单的说,用户可以通过以下步骤,找到或控制Floodlight当前的配置:l 打开 src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule文件,就可以查看所有在floodlight.jar二进制编译中的模块编译。l 打开src/main/resources/perties文件或者其他自定义属性文件,查看文件中选择加载/运行模块。这些文件时是配置某些启动时参数的地方,例如:REST API服务和WEB UI端口(8080)、交换机连接OpenFlow端口(6633)、默认的超时值等。n 如果在Eclipse或命令行(java -jar floodlight.jar)运行Floodlight,默认情况下加载默认属性文件。详细情况可以查看程序参数包括 -cf some_properties_file文件。n 如果在Floodlight-vm上运行的Floodlight,floodlight.jar是按照 /opt/floodlight/floodlight/configuration/perties instead of perties文件,作为服务载入n 如果需要修改默认值,停止Floodlight,更新以上所说的属性文件并重启。l 如果自定义新的模块更新上述的两个文件并重启生效。虽然大多数的应用都是按照默认属性配置运行,但是下面的应用程序需要一组特定的模块,因此需要一个特定的配置文件(由于某些模块之间不兼容)来运行。l OpenStack Quantum plugin:需要和src/main/resources/perties文件一起运行l Forwarding和StaticFlowEntryPusher:这两个模块都是默认加载的,但有时你只需要加载其中的一个来实现应用程序的功能。例如,你想要一个完全自动配置的网络并且不会有转发反应,因此只需要StaticFlowEntryPusher模块而禁止Forwarding模块。控制日志级别在控制台显示的调试信息有时是很有帮助的,但有时又会显得十分繁杂。Floodlight使用org.slf4j.Logger模块,将日志信息划分不同的等级。同时,日志等级是可控的。在默认情况下,Floodlight显示了所有的日志等级。为了控制日志等级,可以向JVM传递以下参数:java -Dlogback.configurationFile=logback.xml -jar floodlight.jar如果实在Eclipse下运行的Floodlight,点击运行-运行/调试配置-参数-VM参数,在这里添加 -Dlogback.configurationFile=logback.xmlXml文件已经包含在Floodlight根目录中。 %level %logger:%thread %msg%n 在这个例子中,net,floodlightcontroller包含了所有的floodlight模块,并且具有日志记录级别的信息,因此调试信息并不会出现在控制台中。你可以在logxml文件中指定INFO,WARN和DEBUG的级别。监听地址和端口配置为了改变主机地址或监听特定服务的端口号,可以在属性配置文件中使用以下的配置参数:net.floodlightcontroller.restserver.RestApiServer.hostnet.floodlightcontroller.restserver.RestApiSernal.FloodlightPernal.FloodlightProvider.openflowportnet.floodlightcontroller.jython.JythonDebugInterface.hostnet.floodlightcontroller.jython.JythonDebugInterface.port默认的属性配置文件(例如:perties)Floodlight REST API虚拟网络过滤器的REST APIURI方法URI 参数数据数据作用域描述/networkService/v1.1/tenants/tenant/networks/networkPUT/POST/DELETETenant:暂时忽略Network:网络ID(非网络名)network: gateway: , name: IP:点分十进制的网关IP,可以为空 Name:字符串形式的网络名创建一个新的虚拟网络,ID和name是必须的但是网关是可选的。/networkService/v1.1/tenants/tenant/networks/network/ports/port/attachmentPUT/DELETETenant: Currently ignored Network: The ID (not name) of the networkPort: Logical port nameattachment: id: , mac: Network ID: 字符串形式的刚刚创建的网络的ID MAC:点分十进制的MAC地址给虚拟网络添加主机/networkService/v1.1/tenants/tenant/networks GETTenant: Currently ignoredNoneNone以json形式显示所有的网络的网络名、ID、网关,所有主机的MAC地址Curl使用样例创建一个名字是“VirtualNetwork1”的虚拟网络,ID是“Networkid1”,网关是“”,tenant是“默认”(目前是忽略的):curl -X PUT -d network: gateway: , name: virtualNetwork1 http:/localhost:8080/networkService/v1.1/tenants/default/networks/NetworkId1添加一个主机到VirtualNetwork1,MAC地址为“00:00:00:00:00:08”端口为“port1”curl -X PUT -d attachment: id: NetworkId1, mac: 00:00:00:00:00:08 http:/localhost:8080/networkService/v1.1/tenants/default/networks/NetworkId1/ports/port1/attachmentStaticFlow Pusher API(新)什么是Static Flow Pusher?Static Flow Pusher是Floodlight的一个模块,通过REST API形式向外曝露,这个接口允许用户手动向OpenFlow网络中插入流表。主动和被动流插入OpenFlow支持两种流插入方式:主动式和被动式。当数据包到达OpenFlow交换机但未成功匹配流表时发生被动式流表插入。这个数据包将会被发送到控制器,控制器对数据包进行分析评估,添加相应的流表并允许交换机继续该数据包的转发。另外,也可以在数据包到达交换机之前,控制器可以主动地插入相应流表。Floodlight支持这两种的流表插入方式。Static Flow Pusher对于主动插入流表的方式很有帮助。注意,在默认情况下,Floodlight载入的转发模块是被动插入流表模式的。如果只使用静态流表,就必须将Forwarding模块从perties文件中删除。使用方法API总结URI Description Arguments /wm/staticflowentrypusher/jsonAdd/Delete static flowHTTP POST data (add flow), HTTP DELETE (for deletion)/wm/staticflowentrypusher/list/jsonList static flows for a switch or all switchesswitch: Valid Switch DPID (XX:XX:XX:XX:XX:XX:XX:XX) or all/wm/staticflowentrypusher/clear/jsonClear static flows for a switch or all switchesswitch: Valid Switch DPID (XX:XX:XX:XX:XX:XX:XX:XX) or all添加一个静态流表Static Flow Pusher是通过REST API方式接入,所以有很多访问方式。例如:要在switch1中插入一个流表,使得port1进入的数据包从port2转发出去。这一操作可以通过使用简单的curl命令实现。第二个命令将显示流表设置。curl -d switch: 00:00:00:00:00:00:00:01, name:flow-mod-1, priority:32768, ingress-port:1,active:true,actions:output=2 http:/:8080/wm/staticflowentrypusher/jsoncurl http:/:8080/wm/core/switch/1/flow/json;删除静态流表通过发送包含流表名称的HTTP DELETE来删除静态流表curl -X DELETE -d name:flow-mod-1 http:/:8080/wm/staticflowentrypusher/json流表项属性Key Value Notes switchID of the switch (data path) that this rule should be added to xx:xx:xx:xx:xx:xx:xx:xxnameName of the flow entry, this is the primary key, it MUST be uniqueactions=See table of actions below Specify multiple actions using a comma-separated list Specifying no actions will cause the packets to be droppedpriorityD默认值为 32767 最大值为 32767active wildcards ingress-portswitch port on which the packet is received Can be hexadecimal (with leading 0x) or decimalsrc-macxx:xx:xx:xx:xx:xxdst-macxx:xx:xx:xx:xx:xxvlan-id可以使16进制(以0X开头)或者是10进制vlan-priority可以使16进制(以0X开头)或者是10进制ether-type可以使16进制(以0X开头)或者是10进制tos-bits可以使16进制(以0X开头)或者是10进制protocol可以使16进制(以0X开头)或者是10进制src-ipxx.xx.xx.xxdst-ipxx.xx.xx.xxsrc-port可以使16进制(以0X开头)或者是10进制dst-port可以使16进制(以0X开头)或者是10进制操作域的操作选项Key ValueNotesoutput all controller local ingress-port normal flood没有丢弃选项(但可以不指定操作从而丢弃数据包) enqueue:第一个数字是端口号,第二个是队列ID可以是16进制(0x开头)或者10进制strip-vlan set-vlan-id可以是16进制(0x开头)或者10进制set-vlan-priority可以是16进制(0x开头)或者10进制set-src-macxx:xx:xx:xx:xx:xxset-dst-macxx:xx:xx:xx:xx:xxset-tos-bits set-src-ipxx.xx.xx.xxset-dst-ipxx.xx.xx.xxset-src-port可以是16进制(0x开头)或者10进制set-dst-port可以是16进制(0x开头)或者10进制在主动插入方式中使用Static Flow PusherStatic Flow Pusher可以通过编写简单的python代码脚本来控制。例如,在运行floodlight之后配置mininet虚拟机。默认的拓扑结构式一个交换机(s1)和两个连接到交换机的主机(h2,h3)。sudo mn -controller=remote -ip= -port=6633以下代码是插入从h2发送到h3和h3发送到h2的流表import httplibimport jsonclass StaticFlowPusher(object): def _init_(self, server): self.server = server def get(self, data): ret = self.rest_call(, GET) return json.loads(ret2) def set(self, data): ret = self.rest_call(data, POST) return ret0 = 200 def remove(self, objtype, data): ret = self.rest_call(data, DELETE) return ret0 = 200 def rest_call(self, data, action): path = /wm/staticflowentrypusher/json headers = Content-type: application/json, Accept: application/json, body = json.dumps(data) conn = httplib.HTTPConnection(self.server, 8080) conn.request(action, path, body, headers) response = conn.getresponse() ret = (response.status, response.reason, response.read() print ret conn.close() return retpusher = StaticFlowPusher( h2 ping h3Firewall REST APIFirewall REST接口防火墙模块提供REST接口服务,该接口实现了采用REST API服务形式的RestletRoutable接口。以下是REST方法的列表:URIMethodURI ArgumentsDataData FieldsDescription/wm/firewall/module/jsonGET选项:status,enable,disable存储规则,子网掩码NoneNone查询防火墙状态,启用、停止防火墙/wm/firewall/rules/json GETNoneNoneNone以json格式理出所有的规则 POSTNone:, :, .field:value 所有的序列组合: switchid:, src-inport:, src-mac: , dst-mac: , dl-type: , src-ip: , dst-ip: , nw-proto: , tp-src: , tp-dst: , priority: , action: Note: specifying src-ip/dst-ip without specifying dl-type as ARP, or specifying any IP-based nw-proto will automatically set dl-type to match IPv4. 创建新的防火墙规则 DELETENone:ruleid: 注意:rule id是成功创建规则是以json形式生成并返回的随机数根据rule id删除规则Curl使用样例假设控制器在本机上运行,显示防火墙运行还是禁用curl http:/localhost:8080/wm/firewall/module/status/json启用防火墙。默认情况下防火墙禁用所有的流量除非创建新的明确允许的规则curl http:/localhost:8080/wm/firewall/module/enable/json添加了允许所有流通过交换机00:00:00:00:00:00:00:01的规则curl -X POST -d switchid: 00:00:00:00:00:00:00:01 http:/localhost:8080/wm/firewall/rules/json添加允许所有IP为的主机到IP为的主机的流的规则。不指定动作就是允许的规则curl -X POST -d src-ip: /32, dst-ip: /32 http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: /32, dst-ip: /32 http:/localhost:8080/wm/firewall/rules/json添加允许所有MAC地址为00:00:00:00:00:00:00:0b的主机到MAC地址为00:00:00:00:00:00:00:0c的主机的流的规则curl -X POST -d src-mac: 00:00:00:00:00:0a, dst-mac: 00:00:00:00:00:0a http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-mac: 00:00:00:00:00:0b, dst-mac: 00:00:00:00:00:0b http:/localhost:8080/wm/firewall/rules/json添加允许IP为的主机到IP为的主机ping测试的规则。curl -X POST -d src-ip: /32, dst-ip: /32, dl-type:ARP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: /32, dst-ip: /32, dl-type:ARP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: /32, dst-ip: /32, nw-proto:ICMP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d dst-ip: /32, dst-ip: /32, nw-proto:ICMP http:/localhost:8080/wm/firewall/rules/json添加允许IP为难到IP为0主机的UDP转发(如iperf)规则,并禁止5010端口。curl -X POST -d src-ip: /32, dst-ip: 0/32, dl-type:ARP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d dst-ip: 0/32, dst-ip: /32, dl-type:ARP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: /32, dst-ip: 0/32, nw-proto:UDP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: 0/32, dst-ip: /32, nw-proto:UDP http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: /32, dst-ip: 0/32, nw-proto:UDP, tp-src:5010, action:DENY http:/localhost:8080/wm/firewall/rules/jsoncurl -X POST -d src-ip: 0/32, dst-ip: /32, nw-proto:UDP, tp-src:5010, actio应用REST应用Circuit PusherCircuit Pusher采用floodlight REST API在所有交换机上创建基于IP地址与指定的优先级两个设备之间路由的一个双向电路即永久性的流表项。注意1. Circuit Pusher 现在只能创建两个IP主机之间的,虽然只是简单的扩展以创建基于CIDR格式的IP前缀(例如:/16)电路,但是支持Static Flow Pusher。2. 在向Circuit Pusher发送restAPIRequest之前,控制器必须已经检测到终端设备的存在(即终端设备已经在网络中发送过数据,最简单的办法就是用网络中任意两台主机ping一下),只有这样控制器才知道这些网络终端设备的接入点从而计算他们的路由。3.当前支持的命令格式语法为:a) circuitpusher.py -controller=IP:rest port -type ip -src IP -dst IP -add -name circuit-name在目前IP链路允许的情况之下在目的和源设备之间新建一个链路。ARP自动支持。目前,由工作目录中的一个文本文件circuits.json提供一个简单的链路记录存储。这个文件没有设置任何保护,并且在控制器重启时也不会重置。这个文件需要正确的操作。用户也应该确保当floodlight控制器重启时删除该文件。b) circuitpusher.py -controller=IP:rest port -delete -name circuit-name通过之前创
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论