Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。
OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。
在 OVS 中, 有几个非常重要的概念:
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
修改ovs支持OpenFLow版本:
sudo ovs-vsctl set Bridge A1 protocols=OpenFlow12,OpenFlow13
创建一个新的 OVS 交换机
$ ovs-vsctl add-br ovs-switch
· 查看交换机中的所有 Table
ovs-ofctl dump-tables ovs-switch
查看交换机中的所有流表项
ovs−ofctl dump−flows ovs-switch
删除编号为 100 的端口上的所有流表项
ovs-ofctl del-flows ovs-switch "in_port=100"
查看交换机上的端口信息
ovs-ofctl show ovs-switch
添加网桥:
#ovs-vsctl add-br br0
列出 open vswitch 中的所有网桥:
#ovs-vsctl list-br
判断网桥是否存在
#ovs-vsctl br-exists br0
将物理网卡挂接到网桥:
#ovs-vsctl add-port br0 eth0
列出网桥中的所有端口:
#ovs-vsctl list-ports br0
列出所有挂接到网卡的网桥:
#ovs-vsctl port-to-br eth0
查看 open vswitch 的网络状态:
#ovs-vsctl show
删除网桥上已经挂接的网口:
#vs-vsctl del-port br0 eth0
删除网桥:
#ovs-vsctl del-br br0
当数据包进入 OVS 后,会将数据包和流表中的流表项进行匹配,如果发现了匹配的流表项,则执行该流表项中的指令集。相反,如果数据包在流表中没有发现任何匹配,OVS 会通过控制通道把数据包发到 OpenFlow 控制器中。
在 OVS 中,流表项作为 ovs-ofctl 的参数,采用如下的格式:字段=值。如果有多个字段,可以用逗号或者空格分开。一些常用的字段列举如下
一、两种 OVS fallback behavior 1. standalone 这种模式下,没有运行controller的情况下,OVS会自动调回普通switch模式,如果有controller的情况,ovs会自动变成 openflow switch 命令: ovs-vsctl set-fail-mode ovs-switch standalone ovs-switch替换成bridge的名字 2.secure 这种模式下,无论有没有controller, ovs都会作为openflow switch运行,也就是所有interface在bridge上,等待controller或者用户添加flow到switch来进行通信 ovs-vsctl set-fail-mode ovs-switch secure 二、 OVS常用的两个 command line tool ovs-vsctl 用来查询和配置ovs-vswitchd ovs-ofctl 管理配置openflow switch 1. 显示bridge的信息,连接到bridge上的interface,tap和端口号(port) ovs-ofctl show ovs-switch (ovs-switch代表bridge的名字,也就是虚拟的switch,下同) 2. 显示flow entries ovs-ofctl dump-flows ovs-switch 3. 添加flow ovs-ofctl add-flow ovs-switch "in_port=2,actions=output:8" flow有很多syntax, 一半来说actions之前都是match的部分,常用的一般是 in_port: switch的端口 dl_src: 源mac地址 dl_dst:目的mac地址 dl_type:以太网协议类型 0x0806是arp packet 0x0800是ip packet nw_src:源IP nw_dst:目的ip nw_proto:协议类型,注意和dl_type区分,同时也需要和dl_type一起使用,比如dl_type是ip(0x0800),那么nw_proto=1就表示icmp packet tp_src: tcp udp源端口 tp_dst: tcp udp目的端口ip |
Same as dl_type=0x0800. |
|||
icmp |
Same as dl_type=0x0800,nw_proto=1. |
|||
tcp |
Same as dl_type=0x0800,nw_proto=6. |
|||
udp |
Same as dl_type=0x0800,nw_proto=17. |
|||
arp |
Same as dl_type=0x0806. |
|||
rarp |
Same as dl_type=0x8035. |
mod_dl_src:mac |
Sets the source Ethernet address to mac. |
mod_dl_dst:mac |
Sets the destination Ethernet address to mac. |
mod_nw_src:ip |
Sets the IPv4 source address to ip. |
mod_nw_dst:ip |
Sets the IPv4 destination address to ip. |
mod_tp_src:port |
Sets the TCP or UDP source port to port. |
mod_tp_dst:port |
Sets the TCP or UDP destination port to port. |