基于 Open vSwitch 的 OpenFlow 实践

Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。

OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。

Open vSwitch 概述

在 OVS 中, 有几个非常重要的概念:

Bridge: Bridge 代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个 Bridge 设备。

Port: 端口与物理交换机的端口概念类似,每个 Port 都隶属于一个 Bridge。

Interface: 连接到 Port 的网络接口设备。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 是一对多的关系。

Controller: OpenFlow 控制器。OVS 可以同时接受一个或者多个 OpenFlow 控制器的管理。

datapath: 在 OVS 中,datapath 负责执行数据交换,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。

Flow table: 每个 datapath 都和一个“flow table”关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。

Open vSwitch 实验环境配置

OVS 可以安装在主流的 Linux 操作系统中,用户可以选择直接安装编译好的软件包,或者下载源码进行编译安装。

在我们的实验环境中,使用的操作系统是 64 位 Ubuntu Server 12.04.3 LTS,并通过源码编译的方式安装了 Open vSwitch 1.11.0

1

2

3

4

5

6

 

$ lsb_release -a

No LSB modules are available.

Distributor ID:Ubuntu

Description:Ubuntu 12.04.3 LTS

Release:12.04

Codename:precise

 

OVS 的源码编译安装方式可以参考官方文档 How to Install Open vSwitch on Linux, FreeBSD and NetBSD

安装完毕后,检查 OVS 的运行情况:

1

2

3

4

5

 

$ ps -ea | grep ovs

12533 ?        00:00:00 ovs_workq

12549 ?        00:00:04 ovsdb-server

12565 ?        00:00:48 ovs-vswitchd

12566 ?        00:00:00 ovs-vswitchd

 

查看 OVS 的版本信息, 我们安装版本的是 1.11.0

1

2

3

 

$ ovs-appctl --version

ovs-appctl (Open vSwitch) 1.11.0

Compiled Oct 28 2013 14:17:16

 

查看 OVS 支持的 OpenFlow 协议的版本

1

2

3

4

 

$ ovs-ofctl --version

ovs-ofctl (Open vSwitch) 1.11.0

Compiled Oct 28 2013 14:17:17

OpenFlow versions 0x1:0x4

 

基于 Open vSwitch 的 OpenFlow 实践

OpenFlow 是用于管理交换机流表的协议,ovs-ofctl 则是 OVS 提供的命令行工具。在没有配置 OpenFlow 控制器的模式下,用户可以使用 ovs-ofctl 命令通过 OpenFlow 协议去连接 OVS,创建、修改或删除 OVS 中的流表项,并对 OVS 的运行状况进行动态监控。

图 1. OpenFlow 的匹配流程

OpenFlow 的匹配流程

 

Flow 语法说明

在 OpenFlow 的白皮书中,Flow 被定义为某个特定的网络流量。例如,一个 TCP 连接就是一个 Flow,或者从某个 IP 地址发出来的数据包,都可以被认为是一个 Flow。支持 OpenFlow 协议的交换机应该包括一个或者多个流表,流表中的条目包含:数据包头的信息、匹配成功后要执行的指令和统计信息。

当数据包进入 OVS 后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS 会通过控制通道把数据包发到 OpenFlow 控制器中。

在 OVS 中,流表项作为 ovs-ofctl 的参数,采用如下的格式:字段=值。如果有多个字段,可以用逗号或者空格分开。一些常用的字段列举如下:

表 1. 流表常用字段

字段名称说明
in_port=port   传递数据包的端口的 OpenFlow 端口编号  
dl_vlan=vlan   数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包  
dl_src=<MAC>
dl_dst=<MAC>
  匹配源或者目标的 MAC 地址
01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址
00:00:00:00:00:00/01:00:00:00:00:00 代表单播地址
 
dl_type=ethertype   匹配以太网协议类型,其中:
dl_type=0x0800 代表 IPv4 协议
dl_type=0x086dd 代表 IPv6 协议
dl_type=0x0806 代表 ARP 协议

完整的的类型列表可以参见以太网协议类型列表
 
nw_src=ip[/netmask]
nw_dst=ip[/netmask]
  当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址,可以使 IP 地址或者域名  
nw_proto=proto   和 dl_type 字段协同使用。
当 dl_type=0x0800 时,匹配 IP 协议编号
当 dl_type=0x086dd 代表 IPv6 协议编号

完整的 IP 协议编号可以参见IP 协议编号列表
 
table=number   指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0。通过使用流表编号,可以创建或者修改多个 Table 中的 Flow  
reg<idx>=value[/mask]   交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值  

对于 add−flow,add−flows 和 mod−flows 这三个命令,还需要指定要执行的动作:actions=[target][,target...]

一个流规则中可能有多个动作,按照指定的先后顺序执行。

常见的操作有:

output:port: 输出数据包到指定的端口。port 是指端口的 OpenFlow 端口编号

mod_vlan_vid: 修改数据包中的 VLAN tag

strip_vlan: 移除数据包中的 VLAN tag

mod_dl_src/ mod_dl_dest: 修改源或者目标的 MAC 地址信息

mod_nw_src/mod_nw_dst: 修改源或者目标的 IPv4 地址信息

resubmit:port: 替换流表的 in_port 字段,并重新进行匹配

load:value−>dst[start..end]: 写数据到指定的字段

实践操作 OpenFlow 命令

在本例中, 我们会创建一个不连接到任何控制器的 OVS 交换机,并演示如何使用 ovs-octl 命令操作 OpenFlow 流表。

创建一个新的 OVS 交换机

1

 

$ ovs-vsctl add-br ovs-switch

 

创建一个端口 p0,设置端口 p0 的 OpenFlow 端口编号为 100(如果在创建端口的时候没有指定 OpenFlow 端口编号,OVS 会自动生成一个)。

1

 

$ ovs-vsctl add-port ovs-switch p0 -- set Interface p0 ofport_request=100

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13742.html