Open vSwitch(下面简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。
OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。
在 OVS 中, 有几个非常重要的概念:
注意本文内容均来自网络,个人整理,并非原创。
非ovsdb数据库操作:
#添加网桥
ovs-vsctl add-br br-int
#列出网桥
ovs-vsctl list-br
#给网桥添加端口
ovs-vsctl add-port br-int tap-xxx
#列出挂载某网络接口的所有网桥
ovs-vsctl port-to-br tap-xxx
#查看全部信息
ovs-vsctl show
ovsdb数据库操作:
#通用格式为
ovs-vsctl list/set/get/add/remove/clear/destroy table record column [value]
#默认情况下ovsdb中包含的数据表
bridge, controller,interface,mirror,netflow,open_vswitch,port,qos,queue,ssl,sflow
#举例 查看所有网桥
ovs-vsctl list bridge
#举例 删除一条qos记录
ovs-vsctl destroy qos <qos-id>
#修改端口 p1 的 VLAN tag 为 101,使端口 p1 成为一个隶属于 VLAN 101 的端口
ovs-vsctl set Port p1 tag=101
每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分。
基本字段包括:
条件字段包括:
这些字段可以任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一 条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值, 而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd 中的流规则将全部丢失,网络无法连接。
动作字段包括正常转发 normal、定向到某交换机端口 output:port、丢弃 drop、更改源目 的 mac 地址 mod_dl_src/mod_dl_dst 等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。
示例:
#查看某网桥信息
ovs-ofctl show br-tun
#查看某网桥上所有端口的状态
ovs-ofctl dump-ports br-tun
#添加一条流表规则 丢弃从port2上发来的所有数据表
ovs-ofctl add-flow br-tun idle_timeout=120,in_port=2,actions=drop
#查看某网桥上面的流表规则
ovs-ofctl dump-flows br-tun
#屏蔽所有进入 OVS 的以太网广播数据包
ovs-ofctl add-flow ovs-switch "table=0, dl_src=01:00:00:00:00:00/01:00:00:00:00:00, actions=drop"
#屏蔽 STP 协议的广播数据包
ovs-ofctl add-flow ovs-switch "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"
Qos可以针对网络接口,也可以针对端口设置:
#针对网络接口 1000±100kbps
ovs-vsctl set interface tap-xxx ingress_policing_rate=1000
ovs-vsctl set interface tap-xxx ingress_policing_burst=100
官方参考 http://openvswitch.org/support/config-cookbooks/qos-rate-limiting/
将发往 p0 端口和从 p1 端口发出的数据包全部定向到 p2 端口,用 ovs-vsctl list port 命令查看 p0、p1、p2 端口的 uuid 分别为id1、id2、id3:
ovs-vsctl --set bridge br0 mirrors=@m-- --id=@m create mirror name=mymirror \
select-dst-port=id_1 \
select-src-port=id_2 \
output-port=id_3
屏蔽对目的主机访问:
ovs-ofctl add-flow br0 idle_timeout=0,dl_type=0x0800,nw_src=xx.xx.xx.xx,actions=drop