group作用
1、存储多个动作:group匹配到一个合适的动作后可以执行多个动作,优化了流表一个匹配+一个动作的工作模式
2、流量复制:group可将流量复制成多份,在广播、组播中广泛使用
3、设置备用路径:group可对一条flow设置备份出接口,当识别主接口down,自动切换到备用出接口
4、负载分流:group可以选择动作中的一个执行
group组成
Group Identifier:uint32,组表在交换机中的身份
Group Type:组的类型
Counters:数据包被组处理时跟新数值
Action Buckets:动作桶的有序列表,每一个桶包含多个动作可以去执行。动作桶中的动作是无重复的结合。
Action Buckets:
动作桶的典型动作是修改数据包并转发到另一个端口。
动作桶里的动作可以调用另一个组的,前提是交换机支持这种组表调用链。
一个组表没有动作桶默认是丢弃数据。一个动作桶没有任何动作,会默认丢弃掉匹配的数据包。
Group Type:
all: 执行组表中所有的动作。这种类型通常被用在组播或者广播转发。数据包非常高效的复制给每一个桶。每一个数据都被组表中的动作桶执行。
如果一个动作是直接将数据包转发到进入的端口,这个包的复制会被放弃。如果控制器中写入了转发到进端口的流表,组表必须包含一个转发动作为OFPT_IN_PORT的保留动作。
select: 执行组表中的一个动作桶。数据包被组表中一个桶处理,具体是哪一个动作通取决于交换机的选择算法。所有关于选择算法的配置和状态都是独立于OpenFlow协议之外的。
indirect: 执行组表中的一个动作桶。这种组表只支持一个动作桶。允许多个流表条目或者组表指向这个id,支持更快,更高校的聚合。这种组类型是所有组类型中最高效的方式。
fast failover: 执行第一个活动的桶。每个动作桶和特殊的端口或组表有关系,可以控制动作桶的存活。
动作桶有序的定义在组表中,第一个和活动的端口有关系的桶会被选择。这种类型可以修改交换机的流表而不需要控制器下发流表。如果没有动作桶是活动的,数据包会被丢弃。
收到未知单播帧泛红
1、搭建环境
物理机:1台
虚拟机:2台
1:vnet1
2:vnet2
3:vxlan口
2、使用ns代替vm
ovs-vsctl add-br br-int
ip netns add ns1
ip link add veth1 type veth peer name vnet1
ip link set veth1 netns ns1
ovs-vsctl add-port br-int vnet1
ip link set vnet1 up
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1
ip netns exec ns1 ifconfig veth1 hw ether fe:fe:fe:fe:fe:aa
ip netns exec ns1 arp -s 10.0.0.2 fe:fe:fe:fe:fe:bb
ip netns exec ns1 arp -s 10.0.0.3 fe:fe:fe:fe:fe:cc
ip netns add ns2
ip link add veth2 type veth peer name vnet2
ip link set veth2 netns ns2
ovs-vsctl add-port br-int vnet2
ip link set vnet2 up
ip netns exec ns2 ip link set veth2 up
ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2
ip netns exec ns2 ifconfig veth2 hw ether fe:fe:fe:fe:fe:bb
ip netns exec ns2 arp -s 10.0.0.1 fe:fe:fe:fe:fe:aa
3、下发流表
ovs-ofctl add-flow br-int -O OpenFlow13 "table=0,priority=100,in_port="vnet1" actions=resubmit(,1)"
ovs-ofctl add-flow br-int -O OpenFlow13 "table=0,priority=100,in_port="vnet2" actions=resubmit(,1)"
ovs-ofctl add-flow br-int -O OpenFlow13 "table=0,priority=0 actions=drop"
# 已知单播帧
ovs-ofctl add-flow br-int -O OpenFlow13 "table=1,priority=100,dl_dst="fe:fe:fe:fe:fe:aa" actions=output:vnet1"
ovs-ofctl add-flow br-int -O OpenFlow13 "table=1,priority=100,dl_dst="fe:fe:fe:fe:fe:bb" actions=output:vnet2"
# 广播
ovs-ofctl add-flow br-int -O OpenFlow13 "table=1,priority=100,dl_dst="ff:ff:ff:ff:ff:ff" actions=resubmit(,2),resubmit(,3)"
# 组播
ovs-ofctl add-flow br-int -O OpenFlow13 "table=1,priority=50,dl_dst="01:00:00:00:00:00/01:00:00:00:00:00" actions=resubmit(,2),resubmit(,3)"
# 未知单播帧
ovs-ofctl add-flow br-int -O OpenFlow13 "table=1,priority=50 actions=resubmit(,2),resubmit(,3)"
# 流量引到group组
ovs-ofctl add-flow br-int -O OpenFlow13 "table=2,priority=100 actions=group:10"
ovs-ofctl add-flow br-int -O OpenFlow13 "table=3,priority=100 actions=group:110"
# 创建ovs group 组
ovs-ofctl add-group br-int -O OpenFlow13 group_id=10,type=all,bucket=output:vnet1,bucket=output:vnet2
# 添加group type和bucket
ovs-ofctl add-group br-int -O OpenFlow13 group_id=110,type=all,bucket=output:1
# 查看group
ovs-ofctl dump-groups br-int -O openflow13
4、查看结果
# ns1 ping 10.0.0.2(已知单播帧)互通
ip netns exec ns1 ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.556 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.065 ms
10:57:43.245125 fe:fe:fe:fe:fe:bb > fe:fe:fe:fe:fe:aa, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 51665, offset 0, flags [none], proto ICMP (1), length 84)
10.0.0.2 > 10.0.0.1: ICMP echo reply, id 56955, seq 1, length 64
0x0000: 4500 0054 c9d1 0000 4001 9cd5 0a00 0002 E..T....@.......
0x0010: 0a00 0001 0000 6701 de7b 0001 a790 cd61 ......g..{.....a
0x0020: 0000 0000 83bc 0300 0000 0000 1011 1213 ................
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637
# ns1 ping 10.0.0.3(未知单播帧)没有回包
ip netns exec ns1 ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
# 在ns2接口抓包可以看到ns2收到了去往10.0.0.3的流量,group复制生效
tcpdump -i vnet2 -nn -vv -e -X
11:00:37.056462 fe:fe:fe:fe:fe:aa > fe:fe:fe:fe:fe:cc, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 34746, offset 0, flags [DF], proto ICMP (1), length 84)
10.0.0.1 > 10.0.0.3: ICMP echo request, id 57038, seq 1, length 64
0x0000: 4500 0054 87ba 4000 4001 9eeb 0a00 0001 E..T..@.@.......
0x0010: 0a00 0003 0800 1b8f dece 0001 5591 cd61 ............U..a
0x0020: 0000 0000 1bdb 0000 0000 0000 1011 1213 ................
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 .............!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637
5、涉及流表
# 删除group组
ovs-ofctl -O OpenFlow13 del-groups br-int group_id=10
# 删除流表时:使用--strict代表精确匹配整条流,可以加上priority
ovs-ofctl --strict del-flows br-int -O OpenFlow13 "table=0,priority=100,arp"
# trace追踪
ovs-appctl ofproto/trace br-int in_port=vnet1,icmp,dl_src=fe:fe:fe:fe:fe:aa,dl_dst=fe:fe:fe:fe:fe:bb,nw_src=10.0.0.1,nw_dst=10.0.0.2,icmp_type=8,icmp_code=0,nw_ttl=64