基于 Open vSwitch 的 OpenFlow 亲测实践(2)

查看 datapath 的信息

# ovs-dpctl show system@ovs-system: lookups: hit:34 missed:21 lost:0 flows: 0 port 0: ovs-system (internal) port 1: ovs-switch (internal) port 2: p0 (internal) port 3: p1 (internal) port 4: p2 (internal)

查看mac地址

ip netns exec ns0 ping 192.168.1.100 ip netns exec ns0 ping 192.168.1.101 ip netns exec ns0 ping 192.168.1.102

然后运行

# ovs-appctl fdb/show ovs-switch port VLAN MAC Age 102 0 22:8e:52:36:92:25 17 100 0 d6:0f:7e:ed:11:e4 4 101 0 f2:0d:06:ff:79:d7 4

查看交换机所有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 的以太网广播数据包

$ 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"

修改数据包,添加新的 OpenFlow 条目,修改从端口 p0 收到的数据包的源地址为 9.181.137.1

ovs-ofctl add-flow ovs-switch "priority=1 idle_timeout=0,\ in_port=100,actions=mod_nw_src:9.181.137.1,normal"

从端口 p0(192.168.1.100)发送测试数据到端口 p1(192.168.1.101),就是没啥响应

# ip netns exec ns0 ping 192.168.1.101 PING 192.168.1.101 (192.168.1.101) 56(84) bytes of data.

再打开一个ssh终端,登录进去,运行tcpdump,需要等待几分钟,才能看到响应

~# ip netns exec ns1 tcpdump -i p1 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on p1, link-type EN10MB (Ethernet), capture size 65535 bytes 06:21:23.802308 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 4533, seq 19, length 64 06:21:24.802358 IP 9.181.137.1 > 192.168.1.101: ICMP echo request, id 4533, seq 20, length 64

重定向数据包

添加新的 OpenFlow 条目,重定向所有的 ICMP 数据包到端口 p2

ovs-ofctl add-flow ovs-switch idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:102

从端口 p0 (192.168.1.100)发送数据到端口 p1(192.168.1.101)

ip netns exec ns0 ping 192.168.1.101

这个时候你从p2里,可以看到

# ip netns exec ns2 tcpdump -i p2 icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on p2, link-type EN10MB (Ethernet), capture size 65535 bytes 06:25:38.252471 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 4668, seq 35, length 64 06:25:39.260438 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 4668, seq 36, length 64 06:25:40.268419 IP 192.168.1.100 > 192.168.1.101: ICMP echo request, id 4668, seq 37, length 64 修改vlan tag

修改端口 p1 的 VLAN tag 为 101,使端口 p1 成为一个隶属于 VLAN 101 的端口

ovs-vsctl set Port p1 tag=101

现在由于端口 p0 和 p1 属于不同的 VLAN,它们之间无法进行数据交换。我们使用 ovs-appctl ofproto/trace 生成一个从端口 p0 发送到端口 p1 的数据包,这个数据包不包含任何 VLAN tag,并观察 OVS 的处理过程

ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=d6:0f:7e:ed:11:e4,\ dl_dst=f2:0d:06:ff:79:d7 -generate

注意:上面��一个mac地址,是p0的,第二个mac地址是p1的,你需要替换,上面有获取mac地址的方法。

# ovs-appctl ofproto/trace ovs-switch in_port=100,dl_src=d6:0f:7e:ed:11:e4,\ > dl_dst=f2:0d:06:ff:79:d7 -generate Flow: metadata=0,in_port=100,vlan_tci=0x0000,dl_src=d6:0f:7e:ed:11:e4,dl_dst=f2:0d:06:ff:79:d7,dl_type=0x0000 Rule: table=0 cookie=0 priority=1,in_port=100 OpenFlow actions=mod_nw_src:9.181.137.1,NORMAL no learned MAC for destination, flooding Final flow: unchanged Relevant fields: skb_priority=0,in_port=100,vlan_tci=0x0000/0x1fff,dl_src=d6:0f:7e:ed:11:e4, dl_dst=f2:0d:06:ff:79:d7,dl_type=0x0000,nw_src=0.0.0.0,nw_proto=0,nw_frag=no Datapath actions: 1,4

在第一行输出中,“Flow:”之后的字段描述了输入的流的信息。由于我们没有指定太多信息,所以多数字段 (例如 dl_type 和 vlan_tci)被 OVS 设置为空值。

在第二行的输出中,“Rule:” 之后的字段描述了匹配成功的流表项。

在第三行的输出中,“OpenFlow actions”之后的字段描述了实际执行的操作。

最后一段以”Final flow”开始的字段是整个处理过程的总结,“Datapath actions: 4,1”代表数据包被发送到 datapath 的 4 和 1 号端口。

创建一条新的 Flow

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13744.html