01-OpenFlow配置
本章节下载: 01-OpenFlow配置 (427.20 KB)
OpenFlow是SDN(Software Defined Network,软件定义网络)架构中定义的一个控制器与转发层之间的通信接口标准。OpenFlow允许控制器直接访问和操作网络设备的转发平面,这些网络设备可能是物理上的,也可能是虚拟的。
OpenFlow的思想是分离控制平面和数据平面,二者之间使用标准的协议通信;数据平面采用基于流的方式进行转发。
OpenFlow网络由OpenFlow设备(Switch)和控制器(Controller)通过安全通道(OpenFlow channel)组成,如图1-1所示。Switch与Controller通过TLS或者TCP建立安全通道,进行OpenFlow消息交互,实现表项下发、查询以及状态上报等功能。下文如果没有特殊说明,交换机指的就是OpenFlow设备。
图1-1 OpenFlow网络组成
OpenFlow Switch有下面两种:
· OpenFlow-Only Switch:仅支持OpenFlow转发。
· OpenFlow-Hybrid Switch:既支持OpenFlow转发,也支持正常转发。本设备即属于OpenFlow-Hybrid Switch类型。
OpenFlow接口有下面三类:
· 物理接口:比如以太网接口。可以作为入接口和出接口。
· 逻辑接口:比如聚合接口等。可以作为入接口和出接口。
· 保留接口:由转发动作定义的接口,实现OpenFlow转发功能。具体类型请参见表1-1。
类型 |
入端口 |
出端口 |
说明 |
ALL |
不支持 |
不支持 |
报文从所有接口发送 |
Controller |
不支持 |
支持 |
报文上送控制器 |
Table |
不支持 |
不支持 |
报文重新进入流表进行匹配 |
In Port |
不支持 |
不支持 |
报文从入接口转发 |
Any |
不支持 |
不支持 |
接口通配描述,不能作为入接口以及出接口 |
Local |
不支持 |
支持 |
报文上送本地CPU |
Normal |
不支持 |
支持 |
报文正常转发 |
Flood |
不支持 |
不支持 |
报文广播发送 |
OpenFlow支持多实例。每个OpenFlow实例可以单独连接控制器,相当于一台独立的交换机,根据控制器下发的流表项指导流量转发。
下文如果没有特殊说明,交换机指的就是一个OpenFlow实例。
OpenFlow实例有以下类型:
· 全局类型:对设备上所有流量都根据OpenFlow流表项转发。将OpenFlow实例配置为该类型后,设备所有业务接口都属于该OpenFlow实例。
· 转控分离(CUPS,Control-/User-Plane Separation)类型:专门用于转发控制分离模式的组网,根据CP下发的流表指导UP上所有BRAS用户流量的转发。
· VLAN类型:配置VLAN内的流量根据OpenFlow流表项转发,其他VLAN内的流量进行正常转发。配置VLAN类型的OpenFlow实例时,需要同时指定OpenFlow实例对应的VLAN,VLAN内所有接口都属于该OpenFlow实例。
· 接口类型:配置接口的流量根据OpenFlow流表项转发,其他接口的流量进行正常转发。将OpenFlow实例配置为该类型后,需要手工配置OpenFlow实例对应的接口。
OpenFlow需要将设备的支持能力、当前的接口信息等设备信息上报给控制器后,控制器才能够下发流表项指导转发。
在配置更改的情况下,需要重新激活实例使配置生效。激活配置后,OpenFlow实例会与所有控制器断开连接,然后重新进行连接。
OpenFlow协议规定需要将接口信息上报给控制器,这些接口包括物理接口、逻辑接口以及保留接口中的Local。
对于通过VLAN划分作用范围的OpenFlow实例,当且仅当接口所属VLAN完全包含了OpenFlow配置的映射VLAN后,该接口才是此OpenFlow实例的接口,可以被上报到控制器。如果配置了loosen模式,只要接口所在VLAN与实例配置VLAN存在交集,接口就属于OpenFlow实例。
OpenFlow通过流表(Flow Table)来匹配和处理报文,在同一个流表中按流表项的优先级进行先后匹配。一台交换机上可以包含一个或者多个流表。
流表类型如下:
· MAC-IP流表:通过MAC地址表和FIB表实现。只能匹配目的MAC地址、VLAN以及目的IP地址,动作也仅支持修改目的MAC地址、源MAC地址、VLAN以及指定出接口。具体请参见1.11 附录 B MAC-IP流表。
· Extensibility流表:扩展流表,使用ACL实现。可以匹配报文的源MAC地址、源IP地址、目的IP地址、报文优先级、TCP源端口、TCP目的端口等。
流表项如图1-2所示:
· Match Fields:匹配规则。可以匹配入接口、报文头等字段。
· Priority:优先级。定义流表项之间的匹配顺序,优先级高的先匹配。
· Counters:统计计数。统计有多少个报文和字节匹配到该流表项(不包括上送控制器的报文)。MAC-IP流表项不支持统计计数功能。
· Instructions:动作指令集。定义匹配到该流表项的报文需要进行的处理。流表项动作指令集是对动作进行操作,流表项的动作有两种执行类型:
¡ 动作集(Action Set):一系列动作的组合,不会立刻修改报文内容,直到报文不再需要进入下一级流表,动作集里每种动作仅能存在一个,并且按照表1-2从上到下的顺序执行。
¡ 动作序列(Action List):需要立即执行的一系列动作,其动作内容与动作集相同,但是会立即修改报文的内容,其效果是累加的,并且执行顺序是按照下发的顺序执行的。
Instruction |
处理 |
Meter |
对匹配到流表项的报文进行限速 |
Apply-Actions |
立即执行动作序列中的动作 |
Clear-Actions |
清除动作集中的所有动作 |
Write-Actions |
更改动作集中的所有动作 |
Write-Metadata |
更改流表间数据,在支持多级流表时使用,当前暂不支持 |
Goto-Table |
进入下一级流表,当前暂不支持 |
具体动作类型如表1-3所示。
表1-3 动作类型(1.3.1版本)
动作名称 |
可选/必选 |
描述 |
Output |
必选 |
转发报文到特定的OpenFlow端口,例如物理端口、逻辑端口以及OpenFlow保留端口 |
Drop |
必选 |
没有直接的动作来代表Drop,当动作集中不含有Output指令时,报文被丢弃。通常空指令集、空动作集或执行清空动作集后,报文被丢弃 |
Group |
必选 |
将报文转交给Group处理,该动作的含义由Group的类型定义 |
Set-Queue |
可选 |
为报文指定队列ID。当报文被转发到特定端口时,队列ID通常被用于基本QoS |
Push-Tag Pop-Tag |
可选 |
适用于VLAN头、MPLS头、PBB头(802.1AH),当前暂不支持 |
Set-Field |
可选 |
识别报文字段的类型,并且可以修改该字段的值 |
Change-TTL |
可选 |
改变报文中IPv4的TTL、IPv6的Hop Limit、或MPLS的TTL。只适用于最外层的字段 该动作可以设置TTL(TTL必须已经存在)、减少TTL、TTL值拷贝(inwards/outwards),当前暂不支持 |
· Timeouts:超时时间。包括了idle time和hard time。
¡ idle time:在idle time时间内,如果没有报文匹配到该流表项,则此流表项被删除(上送控制器的报文即使匹配了流表项,也不会更新该表项的idle time)。
¡ hard time:在hard time时间超时后,无论是否有报文匹配到该流表项,此流表项都会被删除
· Cookie:控制器下发的流表项的标识。
目前本设备仅支持匹配一次流表,不存在多个流表的处理过程。
如图1-3所示,当报文进入交换机后,必须从流表ID最小的流表开始依次匹配;流表可以按次序从小到大越级跳转,但不能从某一流表向前跳转至流表ID更小的流表。一旦在某个流表匹配到后,会更新此报文的动作集(允许被下一级流表覆盖),到了最后一个流表后,所有的动作会被执行,此时报文的内容会被修改,指定出接口进行转发。如果在某个流表处理时,处理指令包含Action List,则报文的一份拷贝立即执行Action List而不需要在最后一个流表处理结束后再执行。
图1-3 OpenFlow转发示意图
每个流表都包含一个Table Miss流表项,该表项用于定义在流表中没有匹配的报文的处理方式,该表项的匹配域为通配,即匹配任何报文,优先级为0,动作指令与正常表项相同。
Group Table由Group表项组成,Group表项被流表项所引用,提供额外的报文转发功能。
图1-4 Group表项结构
· Group Identifier:Group ID,用于识别Group,32bits。
· Group Type:Group类型。
¡ All:执行所有动作桶,用于组播或者广播。
¡ Select:自动选择一个动作桶执行,当前暂不支持。
¡ Indirect:始终执行固定的动作桶,当前暂不支持。
¡ Fast failover:始终执行第一个活跃的动作桶,当前暂不支持。
· Counters:当报文被Group处理时,更新计数器。
· Action Buckets:一个由动作桶组成的有序列表。每个动作桶由许多动作组成。
Meter Table由Meter表项组成,Meter表项被流表项所引用,为所有引用Meter表项的流表项提供报文限速的功能。
图1-5 Meter表项结构
· Meter Identifier:Meter ID,用于识别meter,32bits。
· Meter Bands:一个Meter表项可以包含一个或者多个Meter Bands,每个Meter Band定义了速率以及动作。当报文的速率超过了某些Meter Band,根据这些Meter Band中速率最大的那个定义的动作进行处理。
· Counters:当报文被Meter处理时,更新计数器。
图1-6 Meter Bands结构
· Band Type:Band类型,定义报文如何处理。为可选,可使用丢弃(drop),即报文高于该速率会被丢弃。
· Rate:Meter用于选择Band的最低速率,即报文速率高于该速率并最接近该速率,该Band将被应用。
· Counters:当Band处理报文时,更新计数器。
· Type Specific arguments:某些Band含有的特定参数。
交换机与控制器通过TLS或者TCP建立Channel,进行OpenFlow消息交互,实现表项下发、查询以及状态上报等功能。
OpenFlow协议中定义了三种消息类型:Controller to Switch消息、异步消息和同步消息,每种报文类型都有很多子类型。
Controller to Switch消息是指由控制器产生并发送到交换机,用来查询交换机的消息,可以不需要交换机响应。这些消息主要由控制器用来对交换机进行状态查询和修改配置等操作。
表1-4 Controller to Switch消息
子类型 |
描述 |
Features |
用于控制器发送请求来了解交换机的能力,交换机必须回应该报文 |
Configuration |
用于控制器设置,查询交换机的配置,交换机只有在控制器查询时回应 |
Modify-State |
用于管理交换机的状态,如流表项和端口状态。该命令主要用于增加、删除、修改、交换机内的流表表项,组表表项以及交换机端口的属性 |
Multipart |
用于控制器收集交换机各方面的信息,例如当前配置,统计信息等 |
Packet-Out |
用于通过交换机特定端口发送报文,这些报文可以通过Packet-In消息触发,也可以通过控制器直接发送。通常Packet-Out消息包含整个之前接收到的Packet-In消息所携带的报文或者buffer ID(用于指示存储在交换机内的特定报文)。这个消息需要包含一个动作列表,当交换机收到该动作列表后会对Packet-Out消息所携带的报文执行该动作列表。如果动作列表为空,Packet-Out消息所携带的报文将被交换机丢弃 |
Barrier |
用于确认之前下发动作是否成功。控制器发送Barrier请求消息,当交换机确认之前下发的流表等操作都已经成功时会回复Barrier应答消息 |
Role-Request |
用于设定或查询OpenFlow channel的角色。通常用于交换机和多个控制器相连的情况 |
Asynchronous-Configuration |
控制器使用该报文设定异步消息过滤器来接收其只希望接收到的异步消息报文,或者向交换机查询该过滤器。通常用于交换机和多个控制器相连的情况 |
异步(Asynchronous)消息是由交换机发送给控制器,用来通知交换机上发生的某些异步事件的消息。例如,当某一条规则因为超时而被删除时,交换机将自动发送一条Flow-Removed消息通知控制器,以方便控制器作出相应的操作,如重新设置相关规则等。
表1-5 异步消息
子类型 |
描述 |
Packet-In |
转移报文的控制权到控制器。对于所有通过匹配流表项或者Table Miss后转发到保留端口Controller端口的报文均要通过Packet-in消息送到控制器。也有部分其他流程,如TTL检查等,也需要通过该消息和控制器交互。Packet-In既可以携带报文,也可以通过在交换机内部设置报文的Buffer来仅携带报文头以及其Buffer ID传输给控制器。控制器在接收到Packet-In消息后会对其接收到的报文或者报文头和Buffer ID进行处理,并发回Packet-out消息通知交换机如何处理该报文 |
Flow-Removed |
通知控制器将某个流表项从流表中移除。通常该消息在控制器发送删除流表项的消息或者流表项的两个定时器其中之一超时时产生 |
Port-Status |
通知控制器端口状态或设置的改变 |
Error |
通知控制器交换机出现的问题或错误 |
对称(Symmetric)消息,就是双向对称的消息,主要用来建立连接和检测对方是否在线等。
表1-6 对称消息
子类型 |
描述 |
Hello |
当连接启动时交换机和控制器会发送Hello交互 |
Echo |
用于验证控制器与交换机之间连接的存活,控制器和交换机都会发送Echo request/reply消息,而且对于接收到的Echo request消息必须能返回Echo reply消息。 该消息也可用于测量控制器与交换机之间链路的延迟和带宽 |
Experimenter |
为将来新加入的特性预留的消息 |
OpenFlow中包含连接检测定时器和重连定时器,作用如下:
· 连接检测定时器:定义发送Echo request报文时间间隔,设备发送三次Echo request报文,仍然没有收到Echo reply报文,则交换机断开与控制器的连接。
· 重连定时器:定义交换机与控制器断开连接后,下次开始重新连接的时间间隔。
一个OpenFlow交换机可以与多个控制器建立连接,初始连接时,多个控制器的角色相同,权限相同,控制器可以通过OpenFlow消息设置本控制器的角色,各种角色的权限如表1-7所示。
角色 |
权限 |
Master |
处于该角色的控制器拥有全部权限,可以下发流表项,查询统计信息,接收设备上报的状态信息,在多个控制器中仅能有一个控制器是Master角色 |
Equal |
处于该角色的控制器同样拥有全部权限,相对于Master角色,唯一不同的是可以有多个控制器处于Equal角色 |
Slave |
处于该角色的控制器仅拥有部分权限,Controller to switch消息中不能下发流表项,Group表项以及Meter表项,不允许修改接口配置和设备配置,不允许执行Packet Out操作。异步消息中,缺省情况下设备不会上送Flow Remove消息和Packet In消息,仅能上送接口状态变化消息,但是异步消息的上送能力可以通过控制器的设置异步消息进行修改 |
交换机与多个控制器建立连接时,连接分为Single模式和Multiple模式:
· Multiple模式:同一时刻可以与多个控制器建立连接。交换机会同时连接实例内所有的控制器,在与某个控制器连接失败或者断开连接时,在重连定时器超时后重新进行连接,直到连接成功。
· Single模式:同一时刻仅与一个控制器建立连接,其他控制器作为备份。当且仅当当前的连接断开后,交换机会连接下一个控制器,直到连接成功。
交换机与每个控制器建立的连接中,可包含一个主连接和多个辅助连接:
· 主连接:一般用于控制消息的处理(下发流表项、获取数据、信息上报等),使用TCP/SSL保持可靠的连接。
· 辅助连接:用于提高控制器和OpenFlow交换机的通信能力。辅助连接的目的地址和端口号可以和主连接不一致。
如果交换机与所有控制器断开连接,则交换机进入连接中断模式,连接中断模式分为两种:
· Secure模式:连接断开后,交换机根据流表项转发。不主动删除控制器下发的表项,而是等待表项超时后进行删除,一旦连接建立成功,未超时的表项依然存在。创建OpenFlow实例时,缺省为Secure模式。
· Standalone模式:连接断开后,交换机正常转发。
如果交换机与控制器重新连接成功,则继续作为OpenFlow设备根据流表项进行转发。
· OpenFlow Switch Specification Version 1.3.3
仅CSPEX类单板(CSPEX-1204、CSPEX-1104-E除外)、SPE类单板和CEPC类单板上的二层以太网接口和三层以太网接口支持OpenFlow功能。
在IRF模式下,设备不支持配置OpenFlow实例。
sdn-wan工作模式下,仅CSPEX-1802X、CSPEX-1812X-E、CEPC-CQ8L单板的Extensibility流表支持匹配报文的源MAC地址。
当Group动作和Output动作同时配置时,仅Group动作生效。
当Group Table下发到OpenFlow实例后,请不要切换Group成员口的以太网接口工作模式。当Group成员口为二层以太网接口时,请不要修改接口的VLAN ID。关于切换以太网接口工作模式的介绍,请参见“接口管理”中的“以太网接口”。
OpenFlow配置任务如下:
(1) 配置OpenFlow实例
a. 创建OpenFlow实例
c. (可选)配置带内管理VLAN
d. (可选)配置流表和流表项
e. (可选)配置控制器连接模式
f. (可选)配置禁止上送控制器的端口类型
在转发与控制分离、交换机与多个控制器建立连接的组网中必选,其他情况下可选。
h. 激活OpenFlow实例
i. (可选)配置OpenFlow实例的属性
(2) 配置连接控制器
(3) (可选)配置OpenFlow实例作为SSL服务器监听控制器
(4) (可选)刷新MAC-IP流表的三层表项
(1) 进入系统视图。
system-view
(2) 创建OpenFlow实例,并进入OpenFlow实例视图。
openflow instance instance-id
(3) (可选)配置OpenFlow实例的Datapath ID。
datapath-id id
缺省情况下,OpenFlow实例的Datapath ID由实例ID与设备桥MAC组成,其中前16个比特为实例ID,后48个比特为设备桥MAC。
Datapath ID用来在唯一标识OpenFlow实例,不同OpenFlow实例的Datapath ID不能相同。
(4) (可选)配置OpenFlow报文的DSCP值。
tcp dscp dscp-value
缺省情况下,OpenFlow报文的DSCP值为10。
全局类型OpenFlow实例同一时间只能激活一个。
转控分离类型OpenFlow实例支持多实例同时激活,不支持Extensibility流表表项和Table Miss表项。
仅接口类型的OpenFlow实例支持配置OpenFlow实例与接口绑定。
对于VLAN类型的OpenFlow实例,需要注意的是:
· 一个VLAN仅能属于一个OpenFlow实例,否则会导致流量无法正确处理。
· 如果配置的对应VLAN不存在,在激活实例时,设备将会自动创建该VLAN。
· 同一个接口所属VLAN必须属于同一OpenFlow实例,否则,控制器下发的不同实例的接口状态消息会相互覆盖。
· VLAN对应的VLAN接口不能配置BFD MAD检测功能,该功能的相关内容请参见“虚拟化技术配置指导”中的“IRF”。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例为全局类型。
classification global
缺省情况下,未配置OpenFlow实例的类型。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例为转控分离类型。
classification cups
缺省情况下,未配置OpenFlow实例的类型。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例为接口类型。
classification port
缺省情况下,未配置OpenFlow实例的类型。
(4) 配置OpenFlow实例与接口绑定。请选择其中一项进行配置。
¡ 在OpenFlow实例视图下配置OpenFlow实例与接口绑定
port interface-type interface-number [ to interface-type interface-number ]
¡ 请依次执行以下命令,在接口视图下配置OpenFlow实例与接口绑定。
quit
interface interface-type interface-number
openflow-instance instance-id
缺省情况下,未配置OpenFlow实例与接口绑定。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例为VLAN类型。
classification vlan vlan-id [ mask vlan-mask ] [ loosen ]
缺省情况下,未配置OpenFlow实例的类型。
带内管理VLAN内的流量进行正常转发,用于OpenFlow设备与控制器建立安全通道。
· 仅在带内管理VLAN的接口不属于OpenFlow接口。
· 对于VLAN类型的OpenFlow实例,带内管理VLAN必须是OpenFlow实例配置的对应VLAN的子集。
对于全局类型和VLAN类型的OpenFlow实例,通过管理以太网接口之外的接口连接控制器时,需要将该接口所属VLAN配置为带内管理VLAN。
对于端口类型的OpenFlow实例,无需配置带内管理VLAN。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) (可选)配置带内管理VLAN。
in-band management vlan { vlan-id [ to vlan-id ] } &<1-10>
缺省情况下,未配置带内管理VLAN。
一个OpenFlow实例仅支持配置一个MAC-IP流表和一个Extensibility流表。
如果同时配置Extensibility流表和MAC-IP流表,要求输入的Extensibility流表ID要大于MAC-IP流表ID。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置流表类型和流表ID。
flow-table { extensibility extensibility-table-id | mac-ip mac-ip-table-id }*
缺省情况下,流表类型为Extensibility,流表ID为0。
(4) 配置Extensibility的流表项的最大值。
flow-entry max-limit limit-value
缺省情况下,Extensibility的流表项的最大个数为64000。
控制器下发的流表表项数量超过最大值时,向控制器返回失败。
设备存在多个Extensibility流表时,每个流表都单独受此配置限制。
(5) 配置允许动态ARP表项覆盖OpenFlow ARP表项。
precedence dynamic arp
缺省情况下,禁止动态ARP表项覆盖OpenFlow ARP表项。
仅MAC-IP流表支持本功能。
(6) 允许控制器下发的流表中包含聚合接口的成员端口。
permit-port-type member-port
缺省情况下,禁止控制器下发的流表中包含聚合接口的成员端口。
(7) 配置Table Miss流表项的缺省动作为正常转发。
default table-miss permit
缺省情况下,Table Miss流表项的缺省动作为丢弃。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置控制器连接模式。
controller mode { multiple | single }
缺省情况下,控制器连接模式为Multiple模式。
配置该功能后,交换机不再向控制器上送对应三层以太网接口、三层聚合接口、VLAN接口或VXLAN中的VSI(Virtual Switch Instance,虚拟交换实例)虚接口的信息。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置禁止上送控制器的端口类型。
forbidden port { l3-physical-interface | vlan-interface | vsi-interface } *
缺省情况下,未配置禁止上送控制器的端口类型,即所有接口类型都上送控制器。
在转发与控制分离的组网中,设备需要开启OpenFlow用户转发平面功能,才能在连接多个控制器时,使这些控制器下发到本设备的流表项互不影响。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 开启OpenFlow用户转发平面功能。
user-plane enable
缺省情况下,OpenFlow用户转发平面功能处于关闭状态。
新配置或修改OpenFlow实例后,需要激活实例使配置生效。重新激活实例时,交换机会断开与所有控制器的连接,清除已下发的流表,更新能力集,重新与控制器建立连接。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 激活OpenFlow实例。
active instance
缺省情况下,OpenFlow实例处于未激活状态。
配置OpenFlow实例属性时,无需激活OpenFlow实例即可生效。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例的描述信息。
description text
缺省情况下,未配置OpenFlow实例的描述信息。
(4) 配置OpenFlow定时器相关参数。
¡ 配置连接检测定时器。
controller echo-request interval interval
缺省情况下,连接检测定时器的值为5。
¡ 配置重连定时器。
controller connect interval interval
缺省情况下,重连定时器的值为60秒。对于转控分离类型的OpenFlow实例,重连定时器的缺省值为1秒。
(5) 配置OpenFlow实例对应的VLAN禁止MAC地址学习。
mac-learning forbidden
缺省情况下,OpenFlow实例对应的VLAN允许MAC地址学习。
带内管理VLAN中配置的VLAN不受该功能限制。
转控分离类型OpenFlow实例不支持本功能。
(6) 配置匹配控制器查询或删除流表项指令中的动态MAC地址。
mac-ip dynamic-mac aware
缺省情况下,忽略控制器查询或删除流表项指令中的动态MAC地址。
仅MAC-IP流表支持本功能。
辅助连接配置和主连接配置不做配置冲突检查,如果辅助连接与主连接配置冲突,则无法建立辅助连接。
当配置连接中断模式为standalone后,若与控制器断开连接,则设备上其他引用ACL规则匹配报文的策略(例如策略路由、QoS策略等)可能会失效
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置主连接。
controller controller-id address { ip ipv4-address | ipv6 ipv6-address } [ port port-number ] [ local address { ip local-ipv4-address | ipv6 local-ipv6-address } [ port local-port- number ] ] [ ssl ssl-policy-name ] [ vrf vrf-name ] [ bfd ]
源IP地址必须为OpenFlow实例中端口的IP地址,否则交换机和控制器之间无法建立连接。
当交换机需要和开启了OpenFlow的BFD功能的控制器建立BFD会话时,请配置bfd参数。当OpenFlow通道发生故障时,BFD功能可以快速断开该通道,以便交换机及时采取措施(例如进入连接中断模式),保证业务持续进行。
(4) (可选)配置辅助连接。
controller controller-id auxiliary auxiliary-id transport { tcp | udp | ssl ssl-policy-name } [ address { ip ipv4-address | ipv6 ipv6-address } ] [ port port-number ]
辅助连接中未配置IP地址或接口号时,则IP地址或接口号与主连接一致。
fail-open mode { secure | standalone }
缺省情况下,连接中断模式为Secure。
(6) (可选)开启OpenFlow连接备份功能。
tcp-connection backup
缺省情况下,OpenFlow连接备份功能处于开启状态。
开启连接备份功能后,设备发生主备倒换时,OpenFlow实例仍然保持与控制器的连接。
本功能仅支持设备只有2个主控板(MPU)进行主备倒换的场景。
仅基于TCP的OpenFlow连接支持开启连接备份功能。
在转发平面与控制平面分离的网络中,请使用undo tcp-connection backup命令关闭OpenFlow连接备份功能,从而使UP在主备倒换时重新连接CP,确保CP/UP间的表项一致。
未开启SSL服务器时,设备作为TCP/SSL客户端主动连接控制器(SSL服务器);启动SSL服务器之后,设备作为SSL服务器端被动等待控制器(SSL客户端)连接。关于SSL的详细介绍,请参见“安全配置指导”中的“SSL”。
配置该功能后,无需激活OpenFlow实例即可生效。
不能通过重复执行本命令修改OpenFlow实例启动的SSL服务器。如需修改,请先通过undo listening port命令删除OpenFlow实例启动的SSL服务器,再执行listening port命令重新启动SSL服务器。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 配置OpenFlow实例作为SSL服务器监听控制器。
listening port port-number ssl ssl-policy-name
缺省情况下,未配置OpenFlow实例作为SSL服务器监听控制器。
某些情况下,MAC-IP流表的三层表项会被覆盖,可以通过命令行手工刷新MAC-IP流表,使设备重新从控制器获取三层表项。
(1) 进入系统视图。
system-view
(2) 进入OpenFlow实例视图。
openflow instance instance-id
(3) 刷新MAC-IP流表的三层表项。
refresh ip-flow
在完成上述配置后,在任意视图下执行display命令可以显示配置后OpenFlow的运行情况。
表1-8 OpenFlow显示和维护
操作 |
命令 |
显示OpenFlow实例的详细信息 |
display openflow instance [ instance-id ] |
显示OpenFlow实例的流表信息 |
display openflow instance instance-id flow-table [ table-id ] |
显示OpenFlow实例的控制器信息 |
display openflow instance instance-id { controller [ controller-id ] | listened } |
显示OpenFlow实例的Group表信息 |
display openflow instance instance-id group [ group-id ] |
显示OpenFlow实例的Meter表信息 |
display openflow instance instance-id meter [ meter-id ] |
显示OpenFlow实例的概要信息 |
display openflow summary |
显示OpenFlow实例的辅助连接信息 |
display openflow instance instance-id auxiliary [ controller-id [ auxiliary auxiliary-id ] ] |
清除控制器发送和接收报文的统计计数 |
reset openflow instance instance-id { controller [ controller-id ] | listened } statistics |
· 创建OpenFlow实例1,把VLAN 4092和4093映射到OpenFlow实例中1,并激活实例。
· 配置OpenFlow实例1连接的控制器,用来控制Device上的流量转发。
图1-7 VLAN类型OpenFlow配置组网图
# 创建VLAN 4092和4093。
<Device> system-view
[Device] vlan 4092
[Device-vlan4092] quit
[Device] vlan 4093
[Device-vlan4093] quit
# 创建实例并映射VLAN。
[Device] openflow instance 1
[Device-of-inst-1] classification vlan 4092 mask 4093
# 配置Table Miss流表项的缺省动作为正常转发。
[Device-of-inst-1] default table-miss permit
# 配置控制器1的IP地址为192.168.49.49,并激活实例。
[Device-of-inst-1] controller 1 address ip 192.168.49.49
[Device-of-inst-1] active instance
[Device-of-inst-1] quit
# 显示实例详细信息。
[Device] display openflow instance 1
Instance 1 information:
Configuration information:
Description : --
Active status : Active
Inactive configuration:
None
Active configuration:
Classification: VLAN, total VLANs(2)
4092, 4093
...
Port information:
GigabitEthernet3/1/3
Active channel information:
Controller 1 IP address: 192.168.49.49 port: 6633
· 创建OpenFlow实例1,把接口GigabitEthernet3/1/1和GigabitEthernet3/1/2映射到OpenFlow实例中1,并激活实例。
· 配置OpenFlow实例1连接的控制器,用来控制Device上的流量转发。
图1-8 接口类型OpenFlow配置组网图
# 创建OpenFlow实例并配置按接口划分该实例、以及OpenFlow对应的接口。
<Device> system-view
[Device] openflow instance 1
[Device-of-inst-1] classification port
[Device-of-inst-1] port gigabitethernet 3/1/1 to gigabitethernet 3/1/2
# 配置Table Miss流表项的缺省动作为正常转发。
[Device-of-inst-1] default table-miss permit
# 配置控制器1的IP地址为192.168.49.49,并激活实例
[Device-of-inst-1] controller 1 address ip 192.168.49.49
[Device-of-inst-1] active instance
[Device-of-inst-1] quit
# 显示实例详细信息。
[Device] display openflow instance 1
Instance 1 information:
Configuration information:
Description : : --
Active status : Active
Inactive configuration:
None
Active configuration:
Classification: Port
...
Port information:
GigabitEthernet3/1/1
GigabitEthernet3/1/2
Active channel information:
Controller 1 IP address: 192.168.49.49 port: 6633
(1) VLAN匹配
在使用VLAN划分OpenFlow实例的情况下,对VLAN的匹配存在一定的限制。
表1-9 VLAN匹配项列表
VLAN |
MASK |
匹配的报文 |
- |
- |
匹配在OpenFlow实例VLAN内的所有报文 |
0 |
- |
匹配无VLAN tag的报文,但是入接口的PVID必须在OpenFlow实例内 |
0 |
有值 |
不支持 |
有效VLAN |
-/有值 |
不支持 |
0x1000 |
-/非0x1000的值 |
不支持 |
0x1000 |
0x1000 |
匹配有VLAN tag的报文,但是该VLAN tag必须在OpenFlow实例内 |
有效VLAN | 0x1000 |
-/有值 |
根据VLAN+MASK进行匹配,前提是VLAN+MASK必须在OpenFlow实例内 |
其他 |
其他 |
不支持 |
(2) 协议报文的匹配
对于协议报文,一旦相关的协议配置使能后,协议报文不会进入OpenFlow转发处理,仍然由相关协议进行处理,但是对于LLDP报文比较特殊,对于LLDP报文的使用限制请参见1.10.5 。
(1) Apply actions的限制
不支持Action List中包含多个Output的情况,仅支持一个Output时,请参见1.10.2 。
(2) Write MetaData/MetaMask
在且仅在非最后一级流表的情况下,Switch支持Write MetaData/MetaMask的操作,否则Switch返回不支持。
OpenFlow Switch设备整合Action Set和Action List为Action Set,其整合原则如下。
Action List和Action Set中的Action(除Output和Group外)如果不存在冲突,则全部保留为Action Set;如果存在冲突,则以Action Set的动作替换Action List中的动作(其原因是Action List要执行在Action Set之前)。
· 当Action List和Action Set中都存在一个Output的Action时,Action List中的Output发送的报文不会对报文进行任何修改,其执行顺序最优,Action Set中的Ouput会执行Action List和Action Set中的所有修改。
· 当Action List和Action Set中仅存在一个Output的Action时,该Output为报文出接口,执行顺序按照Action Set的顺序。
· 当Action List中存在一个Output的Action,Action Set中存在一个Group的Action(Output的Action存在与否都可以)时,Action List中的Output发送的报文不会对报文进行任何修改,Group在Action Set中。
· 其他情况不支持。
在Packet out消息中Output为Normal、Local、In port或To Controller时,入接口只能是设备上的物理接口或者逻辑接口,不能是OpenFlow保留口。
在Packet Out消息中如果同时存在Buffer ID和报文,OpenFlow Switch只会获取Buffer ID对应的缓存报文进行处理,忽略消息中携带的报文。
如果Packet Out消息中的报文没有VLAN tag,则OpenFlow Switch将入接口的PVID作为报文所在的VLAN进行转发处理。
· 如果入接口不是设备上的接口,且Output是设备上的接口,则使用出接口的PVID发送。
· 如果入接口不是设备上的接口,且Output是保留口Flood和All,请参见“4. 出接口限制”的处理。
Packet Out中指定的Output为保留口的Flood和All时的处理机制。
(1) 出接口为Flood的情况
¡ Packet Out的报文携带VLAN tag,则报文在该VLAN内广播。
¡ Packet Out的报文没有携带VLAN tag,但是入接口是OpenFlow Swtich上的接口,则报文在入接口的PVID内广播。
¡ Packet Out的报文没有携带VLAN tag,并且入接口是Controller,则报文在所有OpenFlow接口发送一份。
(2) 出接口为All的情况
¡ Packet Out的报文携带VLAN tag,则报文在该VLAN内广播。
¡ Packet Out的报文没有携带VLAN tag,无论入接口是什么接口,报文都在所有OpenFlow接口发送一份。
对于Packet in消息中的报文:
· 上送时如果其VLAN tag与该报文入接口的PVID相同,那么该报文的VLAN tag会被删除。
· 上送时如果其VLAN tag与该报文入接口的PVID不同,那么该报文的VLAN tag不会被删除。
· 对于上送原因是No Match的报文支持缓存,缓存大小是1K个报文。
· 对于其他上送原因的报文不支持缓存,整个报文都会被上送,并且Cookie是全F。
OpenFlow网络可以通过LLDP发现拓扑,对于匹配LLDP报文存在如下限制:
· 设备上必须全局使能LLDP。
· LLDP报文匹配后上送控制器不受实例限制,只要收到报文的接口在OpenFlow实例内,并且实例内有匹配LLDP报文并上送控制器的表项,则LLDP报文就会在该实例上送控制器。
· Switch在激活后缺省会生成Table Miss表项,其动作是Drop,此表项不能被控制器通过Modify的动作修改,不能被控制器通过Mulipart消息查询到,仅能由控制器通过Add进行添加Table Miss的动作进行修改。
· Table Miss表项仅能通过严格匹配进行修改和删除,在非严格匹配的情况下,即使匹配项是通配也不能够操作Table Miss表项。
· Table Miss表项被删除后,会生成缺省的Table Miss表项,其动作是Drop。
在非严格匹配的情况下,不支持通过match域为通配修改所有普通流表项。
OpenFlow Switch支持两种类型的Flow Table,MAC-IP类型和Extensibility类型。允许通过命令行指定Table ID,Flow Table会根据Table ID进行排序。Flow Table需要重新激活后才能生效。
MAC-IP流表是使用MAC地址表项和路由表项实现Flow Table;Extensibility流表使用ACL实现Flow Table。
必选的能力是控制器下发时必须携带的匹配或者动作项,可选能力是下发时可携带可不携带,如果不携带的话由Switch添加缺省的匹配或者动作项。
二层表项使用MAC地址表实现,其支持能力如表1-10所示。
表1-10 MAC-IP流表二层表项支持能力
支持项 |
能力 |
必选匹配项 |
· VLAN · 单播目的MAC地址 |
可选匹配项 |
无 |
必选动作项 |
指定出接口 |
可选动作项 |
无 |
三层表项使用路由表实现,其支持能力如表1-11所示。
表1-11 MAC-IP流表三层表项支持能力
支持项 |
能力 |
必选匹配项 |
· VLAN · 单播目的IP地址 · 单播目的MAC地址(必须是匹配VLAN对应的VLAN接口的MAC地址) |
可选匹配项 |
无 |
必选动作项 |
· 指定出接口 · 修改VLAN · 修改目的MAC地址 |
可选动作项 |
· 修改源MAC地址(源MAC地址会修改为目的出接口所在VLAN对应的VLAN接口的MAC地址) · TTL减1 |
Route表项使用路由表实现,其支持功能如表1-12所示。
表1-12 MAC-IP流表Route表项支持能力
支持项 |
能力 |
必选匹配项 |
· 以太网类型eth_type · 单播目的IP地址和掩码 |
可选匹配项 |
VPN实例名称 |
必选动作项 |
指定出接口NULL0 |
可选动作项 |
无 |
MAC-IP流表的Flow Entry有一定的限制,控制器需要遵循这些限制下发表项,否则可能会造成转发错误。
二层表项的限制如表1-13所示。
表1-13 MAC-IP流表二层表项限制
表项类型 |
限制 |
匹配项限制 |
目的MAC地址不是本机MAC地址 |
动作项限制 |
出接口属于匹配的VLAN |
三层表项的限制如表1-14所示。
表1-14 MAC-IP流表三层表项限制
表项类型 |
限制 |
匹配项限制 |
· 匹配的VLAN所对应的VLAN接口UP · 目的MAC地址是匹配VLAN对应的VLAN接口的MAC地址 · 目的IP地址不是本机IP地址 |
动作项限制 |
· 指定出接口属于目的VLAN · 目的MAC地址不是本机MAC地址 · 如果修改源MAC地址,源MAC地址必须是目的出接口所在VLAN对应的VLAN接口的MAC地址 |
三层表项能够下发的前提是匹配VLAN所对应的VLAN接口存在并且处于UP状态,且VLAN接口会作为OpenFlow接口上报(包括了VLAN接口的链路状态和MAC地址),在VLAN接口删除时同时也会上报给控制器,需要由控制器删除对应的三层流表项,因此需要控制器保证三层表项的正确性,Switch端不对三层表项的匹配项限制进行检查。
MAC-IP流表的Table Miss支持下列Output Action:
· Drop:丢弃报文;
· Controller:报文上送控制器;
· Normal:报文正常转发。
在支持MAC-IP流表的情况下,Switch支持Controller获取和删除动态MAC地址表项。
控制器可以通过指定VLAN、单个MAC或者单个MAC与VLAN来获取和删除动态MAC地址表项。
MAC-IP流表和Extensibility流表通过MetaData可以实现多级流表。
MAC-IP流表支持Write MetaData,Extensibility流表支持Match MetaData。
Extensibility流表和MAC-IP流表配合时:
· 当Extensibility流表中的Output动作不是Normal时,MAC-IP流表不会生效,所有动作根据Extensibility流表进行处理;
· 当Extensibility流表中的Output动作是Normal时,Output动作根据MAC-IP流表进行处理,其余动作根据Extensibility流表进行处理。
不同款型规格的资料略有差异, 详细信息请向具体销售和400咨询。H3C保留在没有任何通知或提示的情况下对资料内容进行修改的权利!