反过来从端口 p1 发送数据包,由于 p1 现在是带有 VLAN tag 101 的 Access 类型的端口,所以数据包进入端口 p1 之后,会被 OVS 添加 VLAN tag 101 并发送到端口 p0
1 2 3 4 5 6 7 8 9 10 11 12
$ ovs-appctl ofproto/trace ovs-switch in_port=101,dl_dst=66:4e:cc:ae:4d:20, dl_src=46:54:8a:95:dd:f8 -generate Flow: metadata=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000 Rule: table=0 cookie=0 priority=0 OpenFlow actions=NORMAL forwarding to learned port Final flow: unchanged Relevant fields: skb_priority=0,in_port=101,vlan_tci=0x0000,dl_src=46:54:8a:95:dd:f8, dl_dst=66:4e:cc:ae:4d:20,dl_type=0x0000,nw_frag=no Datapath actions: push_vlan(vid=101,pcp=0),2
其他 OpenFlow 常用的操作
查看交换机中的所有 Table
1
ovs-ofctl dump-tables ovs-switch
查看交换机中的所有流表项
1
ovs−ofctl dump−flows ovs-switch
删除编号为 100 的端口上的所有流表项
1
ovs-ofctl del-flows ovs-switch "in_port=100"
查看交换机上的端口信息
1
ovs-ofctl show ovs-switch
通过 Floodlight 管理 OVS
一方面,OpenFlow 控制器可以通过 OpenFlow 协议连接到任何支持 OpenFlow 的交换机,控制器通过和交换机交换流表规则来控制数据流向。另一方面, OpenFlow 控制器向用户提供的界面或者接口,用户可以通过界面对网络架构进行动态的修改,修改交换机的流表规则等等。Floodlight 是一个基于 Apache 协议,使用 Java 开发的企业级 OpenFlow 控制器。我们在下面的例子中演示如何安装 Floodlight,并连接管理 OVS 的过程。
Floodlight 的安装过程非常简单,在另外一台机器上, 下载 Floodlight 源码并编译
1 2 3 4
$ git clone git://github.com/floodlight/floodlight.git $ cd floodlight/ $ ant $ java -jar target/floodlight.jar
运行 Floodlight
1
$ java -jar floodlight.jar
在安装了 OVS 交换机的节点上,配置 OVS 交换机 ovs-switch,使用 Floodlight 作为控制器。默认情况下,Floodlight 在端口 6633 上进行监听,我们使用 ovs-vsctl 命令配置 OVS 交换机使用 TCP 协议连接到 Floodlight(IP 地址为 9.181.137.182,端口号 6633)。对于一个 OVS 交换机来说,可以同时配置一个或者多个控制器
$ ovs-vsctl set-controller ovs-switch tcp:9.181.137.182:6633
当 OVS 交换机连接到 Floodlight 控制器后,理论上所有的流表规则应该交给控制器来建立。由于 OVS 交换机和控制器之间是通过网络通讯来传递数据的,所以网络连接失败会影响到 Flow 的建立。针对这种情况,OVS 提供了两种处理模式:
standlone: 默认模式。如果 OVS 交换机超过三次无法正常连接到 OpenFlow 控制器,OVS 交换机自己会负责建立流表。在这种模式下,OVS 和常见的 L2 交换机相似。与此同时,OVS 也会继续尝试连接控制器,一旦网络连接恢复,OVS 会再次切换到使用控制器进行流表管理。
secure: 在 secure 模式下,如果 OVS 无法正常连接到 OpenFlow 控制器,OVS 会不停的尝试与控制器重新建立连接,而不会自己负责建立流表。
设置 OVS 的连接模式为 secure 模式
1
$ ovs-vsctl set Bridge ovs-switch fail-mode=secure
查看 OVS 的状态,“is_connected:true”代表 OVS 已经成功连接到了 Floodlight
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
$ ovs-vsctl show 30282710-d401-4187-8e13-52388f693df7 Bridge ovs-switch Controller "tcp:9.181.137.182:6633" is_connected: true Port ovs-switch Interface ovs-switch type: internal Port "p0" Interface "p0" type: internal Port "p1" tag: 101 Interface "p1" type: internal Port "p2" Interface "p2" type: internal