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 的参数,采用如下的格式:字段=值。如果有多个字段,可以用逗号或者空格分开。一些常用的字段列举如下
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. |