open vswitch 概述
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
$ 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 的运行情况:
$ 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
$ ovs-appctl –version ovs-appctl (open vswitch) 1.11.0 compiled oct 28 2013 14:17:16
查看 ovs 支持的 openflow 协议的版本
$ 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 的运行状况进行动态监控。
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 交换机
$ ovs-vsctl add-br ovs-switch
创建一个端口 p0,设置端口 p0 的 openflow 端口编号为 100(如果在创建端口的时候没有指定 openflow 端口编号,ovs 会自动生成一个)。
$ ovs-vsctl add-port ovs-switch p0 — set interface p0 ofport_request=100
设置网络接口设备的类型为“internal”。对于 internal 类型的的网络接口,ovs 会同时在 linux 系统中创建一个可以用来收发数据的模拟网络设备。我们可以为这个网络设备配置 ip 地址、进行数据监听等等。
$ ovs-vsctl set interface p0 type=internal $ ethto
如何取消电脑IE浏览器中允许对剪切板进行访问的提示鞍山如何注册商标网址注册可以在哪个平台注册?上海备案填写了验证码怎么提示还是提示没有网站负责人的照片农产品发现新机遇?网站建设助力转型云服务器配置1核够上海云服务器租用的网站申请文字商标可行吗