目 录
OpenFlow是SDN(Software Defined Network,软件定义网络)架构中定义的一个控制器与转发层之间的网络传输协议。OpenFlow允许控制器直接访问和操作网络设备的转发面,这些设备可能是物理上的,也可能是虚拟的。
OpenFlow通过标准的通信协议将设备的控制面和转发面相分离,让网络设备专注于转发行为,而整网的控制行为集中在一台控制器上。设备与控制器建立OpenFlow连接,由控制器生成转发规则并通过OpenFlow连接以流表的形式下发给网络设备,从而实现网络控制面的集中管理,降低维护管理成本。
l 流表
流表是设备进行转发策略控制的核心数据结构,设备根据流表来决策对进入设备的网络流量采取对应的行为。
一台设备可以包含一个或者多个流表,当前设备只支持一个流表。一个流表由多个流表项构成。
在OpenFlow协议中,流表项由三个部分组成:header、counter、action。
header:定义了流表项的索引,通常由报文的各个字段组成,比如源MAC地址、目的MAC地址、以太网协议类型域、源IP、目的IP、IP协议类型域、源端口、目的端口等各个字段,用于匹配报文,报文命中流表项的Header字段,则表明报文匹配到该流表项。
counter:统计计数.用于统计有多少个报文和字节匹配到该流表项。
action:报文匹配后的动作,用于定义对匹配到流表项的报文的转发行为,如丢弃、广播、转发等。
l 消息
OpenFlow协议支持三种消息类型:controller-to-switch,asynchronous和symmetric,每一类消息又有多个子消息类型。各消息的简单描述如下:
controller-to-switch:由控制器发起,用来管理以及获取网络设备状态。消息子类型说明见表1-1。
asynchronous:由网络设备发起,用来将网络事件或网络设备状态变化(最常见的是网络接口的link up/down变化)更新到控制器。子消息类型说明见表1-2。
symmetric:可由设备或控制器任一端发起,主要用于协议初始的握手以及连接状态探测。子消息类型说明见表1-3。
表1-1
controller-to-switch消息子类型说明表
子类型 |
描述 |
Features |
用于控制器发送Features请求来了解设备的能力,设备应答 |
Configuration |
用于控制器查询设备的配置,设备在收到查询时应答 |
Modify-State |
用于管理设备的状态,如流表项和端口状态,该消息主要用于增加、删除、修改设备内的流表表项、组表表项和设备端口属性 |
Multipart |
用于控制器请求设备各方面信息,如当前配置、统计信息 |
Packet-Out |
用于控制器向设备发送报文 |
Barrier |
用于确认Barrier消息之前的动作是否成功。控制器发送Barrier请求消息,当设备确认之前的动作都已成功时回应答Brarrier应答消息 |
Role-Request |
用于设备请求控制器的角色 |
Asynchronous-Configuration |
控制器使用该消息设置异步消息过滤器,用于接收只希望接收到的异步消息报文,或向设备查询该过滤器 |
表1-2
asynchronous消息子类型说明表
子类型 |
描述 |
Packet-in |
用于设备发送报文到控制器 |
Flow-Removed |
通告控制器将某个流表项从流表中移除 |
Port-Status |
通告控制器设备端口状态或配置发生改变 |
Error |
通告控制器设备出的问题或错误 |
表1-3
symmetric消息子类型说明表
子类型 |
描述 |
Hello |
建立OpenFlow连接时设备和控制器发送Hello交互 |
Echo |
保活消息,控制器和设备都会发送Echo request/reply消息 |
Experimenter |
为将来新加入的特性预留的消息 |
表1-4 控制器角色说明表
角色
|
权限
|
Master
|
该角色的控制器拥有控制设备的全部权限,可以下发流表\查询统计信息,接收设备上报的状态信息。在控制器集群部署时,只能有一台控制器是Master
|
Equal
|
该角色控制器同样拥有全部权限,相比于Master角色,集群时可有多个控制器处于Equal
|
Slave
|
该角色控制器有部分权限,部分权限被限制,如不能下发流表项、group表项、Meter表项。不允许修订设备配置、不允许进行Packet
Out操作
|
OpenFlow实现了网络控制面的集中管理,使得整个网络能够轻易(相对于现有网络状况而言)地实现集中管理,进而简化了维护管理成本。
控制器向网络设备发送流表信息,用于控制网络数据包的转发方式以及一些配置参数。而网络设备会在链路中断或出现未指定转发行为的数据包时,发送消息通知控制器。进而形成二者的互动,最终控制整个网络的传输行为。
控制器和网络设备之间开始时需要完成相互发现的过程,其具体的行为如下图1-1所示:
控制器和网络设备相互发送OpenFlow定义的Hello报文进行握手。握手成功后,控制器将请求设备的具体信息例如设备的端口数量、各端口的能力等(如图1-1中的Feature Request/Reply),随后控制器将下发用户配置到具体的网络设备上(如图1-1中的Set Config)。当连接建立后,控制器定义各个流以及匹配流的处理方式并通过流表下发到设备。每个数据包在进入设备后将按照控制器预先设定的流表规则匹配流表并执行对应的动作(动作包括:转发、丢弃、修改报文内容),同时对应的计数器将更新;如果没能找到匹配的表项,则转发给控制器。
网络设备会在本地维护控制器下发的流表,如果要转发的数据包在流表中已有定义,则直接在网络设备上完成转发行为;若在流表中未能查找到,则数据包就会被发送到控制器进行传输路径的确认(可以理解为进行控制面解析,进而生成流表),再根据控制器下发的流表进行转发。
l OpenFlow Switch SpecicationVersion 1.0.0
l OpenFlow Switch SpecicationVersion 1.3.0
l 流表限制:不支持多个流表,只支持Table 0流表。
l 连接控制器数量限制:最多只支持连接3台控制器。
(1)
配置OpenFlow
(2)
(可选)配置OpenFlow多控制器模式
(3)
(可选)配置OpenFlow送控制器报文的vlan标签
(4)
(可选)配置OpenFlow报文处理模式
(5)
(可选)配置OpenFlow源IP
OpenFlow是一种网络传输协议,运行在安全传输层协议(TLS)或无保护TCP连接之上,定义了控制器与网络设备之间的交互行为。
配置设备为OpenFlow转发模式,当设备开启OpenFlow功能时,对报文的转发控制策略由控制器生成并下发。
l 当要切换控制器的地址时,应先关闭OpenFlow功能,再开启OpenFlow功能。
l 开启OpenFlow功能时,需要将设备本身的LLDP功能关闭,否则控制器下发的LLDP报文无法发出。
(1) 进入特权模式。
enable
(2) 进入全局配置模式。
configure terminal
(3) 开启OpenFlow功能。
of controller-ip ipv4-address [ port
port-number ] [ aux ] interface interface-type interface-number
缺省情况下,OpenFlow功能处于关闭状态。
配置设备多控制器模式,可以同时连接多个控制器。
配置设备多控制器模式时,需要先关闭OpenFlow功能,再配置为多控制器模式,再开启OpenFlow功能后才生效。
(1) 进入特权模式。
enable
(2) 进入全局配置模式。
configure terminal
(3) 设置OpenFlow设备连接控制器模式。
of mode { single | multiple }
缺省情况下,OpenFlow设备处于多控制器模式。
(4) (可选)配置OpenFlow重连控制器的时间间隔。
of connect-interval interval
缺省情况下,OpenFlow重连控制器的时间间隔为6秒。
(5) (可选)配置OpenFlow发送echo request的时间间隔。
of echo-interval interval
缺省情况下,OpenFlow发送echo request的时间间隔为5秒。
设置设备送控制器的报文是否携带vlan标签。缺省情况下设备送控制器的报文携带vlan标签。
配置完成后立刻生效。
(1) 进入特权模式。
enable
(2) 进入全局配置模式。
configure terminal
(3) 配置OpenFlow设备送控制器报文是否携带标签。
of packet vlantag
缺省情况下,OpenFlow设备送控制器的报文携带vlan标签。
设置设备收到的报文是否进行查表。缺省情况下,设备收到报文后先进行查表,根据命中的表项处理报文,如果未命中表项则报文被丢弃。
配置完成后立刻生效。
(1) 进入特权模式。
enable
(2) 进入全局配置模式。
configure terminal
(3) 设置OpenFlow设备连接控制器模式。
of packet table-lookup
{ enable | disable }
缺省情况下,设备报文的处理模式为查表模式。
设置设备连接控制器时的源IP。默认不配置,使用连接端口的IP。
配置完成后立刻生效,设备和控制器会断开,使用源IP重新进行连接。
(1) 进入特权模式。
enable
(2) 进入全局配置模式。
configure terminal
(3) 配置OpenFlow连接控制器的源IP
of source-ip ipv4-address
缺省情况下,不配置源IP,默认以连接接口的IP为源IP连接控制器。
可以通过show命令行查看功能配置后的运行情况以验证配置效果。
表1-5 OpenFlow监视与维护
作用 |
命令 |
查看当前OpenFlow设备与控制器连接情况 |
show of |
查看当前OpenFlow设备的端口状态 |
show of port |
查看当前OpenFlow设备的流表 |
show of flowtable |
查看当前OpenFlow设备的组表 |
show of group |
查看当前OpenFlow设备的meter表 |
show of meter |
查看当前OpenFlow设备的合并流表项 |
show of mergedflow |
OpenFlow可以实现接入设备认证的集中管理。以图1-2为例,在接入交换设备上部署控制器完成对接入设备的认证控制,使得原先需要运行在接入设备上的认证功能(控制面)移交到控制器上完成。
l 设备开启OpenFlow功能,与控制器建立OpenFlow管理通道。
l 在接入设备上运行OpenFlow Client,实现与控制器互联。
l 控制器要求接入设备将认证报文通过OpenFlow协议发送到控制器上。
l 由控制器完成认证过程并将认证结果通过OpenFlow协议下发到具体的接入设备上,完成终端用户的准入控制。
# 配置设备端开启OpenFlow功能,指定控制器的IP地址为172.18.2.36/24,端口号为65535,同时关闭设备lldp功能。
Device> enable
Device# configure terminal
Device(config)# no lldp enable
Device(config)# interface mgmt 0
Device(config-if)# ip address 172.18.2.36 255.255.255.0
Device(config-if)# exit
Device(config)# of controller-ip 172.18.2.35 port 65535 interface mgmt 0
# 配置设备为单控制器模式。
Device(config)# of mode single
# 配置送控制器的报文不携带vlan标签。
Device(config)# no of packet vlantag
# 配置设备为查表模式。
Device(config)# ofpacket table-lookup enable
# 配置设备的OpenFlow源IP为192.168.197.25。
Device(config)# of source-ip 192.168.197.25
# 查看OpenFlow的连接状态信息。
Device# show of
[0] Controller ID=0 Info=tcp:172.18.2.35 port=6653 interface Mgmt 0, Main is Connected, Aux is Disabled
# 查看OpenFlow的端口状态。
Device# show of port
ID IFX INTERFACE SPEED LINK DUPLEX TX_PKT RX_PKT CONFIG
1 1 GigabitEthernet 0/1 Unknown DOWN Unknown 0 0 NA
2 2 GigabitEthernet 0/2 Unknown DOWN Unknown 0 0 NA
# 查看OpenFlow的流表状态。
Device# show of flowtable
/***************** openflow flow table[0]---flow number[2] *******************/
{table="0", duration_sec="5222", priority="0", flags ="0x1",idle_timeout="0", hard_timeout="0", cookie="0x0", packet_count="0", byte_count="0". match=oxm{all match} instructions=[apply{acts=[output{port="controller", max_len="3333"}] }] }
xid=472, sync_flag=0x0, ss_index=0x7b6
{table="0", duration_sec="5222", priority="66", flags ="0x1",idle_timeout="0", hard_timeout="0", cookie="0x0", packet_count="0", byte_count="0". match=oxm{eth_dst="00:25:64:c4:54:e4", eth_type="0x800", ipv4_dst="1.1.0.0", ipv4_dst_mask="255.255.240.0"} instructions=[apply{acts=[output{port="controller", max_len="65535"}] }] }
xid=473, sync_flag=0x0, ss_index=0x7b1
/****************************** openflow flow table end ****************************************/
flow total number = 2
# 配置设备为单控制器模式,只能连接一个控制器,超过一个时会有错误提示。
Device(config)# no of controller-ip
Device(config)# of mode single
Device(config)# of controller-ip 172.18.122.24 interface gigabitEthernet 0/1
Device(config)# of controller-ip 172.18.122.25 interface gigabitEthernet 0/1
Controller Mode is Single, can't connected
# 通过show of命令查看当前模式为查表模式,源IP为192.168.197.25。
Device# show of
version:openflow1.3, controller[0]:tcp:172.18.105.11 port 6653 interface GigabitEthernet 1/0/7, main is connected, aux is disable, role is master.
Current controller mode : multiple.
Current packet process mode : Lookup all flow.
Datapath id = 897516188948
Source IP = 192.168.197.25
hostname Device
alias exec sv show version
!
no lldp enable
!
of source-ip 192.168.197.25
of controller-ip 172.18.2.35 port 65535 interface Mgmt 0
no of packet vlantag
!
interface Mgmt 0
ip address 172.18.2.36 255.255.255.0
gateway 172.18.2.1
l 控制器IP地址配置错误。
l 控制器TCP端口号配置错误。