表 1. 流表常用字段
字段名称 | 说明 |
---|---|
in_port=port | 传递数据包的端口的 OpenFlow 端口编号 |
dl_vlan=vlan | 数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包 |
dl_src=<MAC> dl_dst=<MAC> | 匹配源或者目标的 MAC 地址 01:00:00:00:00:00/01:00:00:00:00:00 代表广播地址 00:00:00:00:00:00/01:00:00:00:00:00 代表单播地址 |
dl_type=ethertype | 匹配以太网协议类型,其中: dl_type=0x0800 代表 IPv4 协议 dl_type=0x086dd 代表 IPv6 协议 dl_type=0x0806 代表 ARP 协议 完整的的类型列表可以参见以太网协议类型列表 |
nw_src=ip[/netmask] nw_dst=ip[/netmask] | 当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址,可以使 IP 地址或者域名 |
nw_proto=proto | 和 dl_type 字段协同使用。 当 dl_type=0x0800 时,匹配 IP 协议编号 当 dl_type=0x086dd 代表 IPv6 协议编号 完整的 IP 协议编号可以参见IP 协议编号列表 |
table=number | 指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0。通过使用流表编号,可以创建或者修改多个 Table 中的 Flow |
reg<idx>=value[/mask] | 交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值 |
对于 add−flow,add−flows 和 mod−flows 这三个命令,还需要指定要执行的动作:actions=[target][,target...]
一个流规则中可能有多个动作,按照指定的先后顺序执行。
常见的操作有:
- output:port: 输出数据包到指定的端口。port 是指端口的 OpenFlow 端口编号
- mod_vlan_vid: 修改数据包中的 VLAN tag
- strip_vlan: 移除数据包中的 VLAN tag
- mod_dl_src/ mod_dl_dest: 修改源或者目标的 MAC 地址信息
- mod_nw_src/mod_nw_dst: 修改源或者目标的 IPv4 地址信息
- resubmit:port: 替换流表的 in_port 字段,并重新进行匹配
- load:value−>dst[start..end]: 写数据到指定的字段
ip | Same asdl_type=0x0800. |
icmp | Same asdl_type=0x0800,nw_proto=1. |
tcp | Same asdl_type=0x0800,nw_proto=6. |
udp | Same asdl_type=0x0800,nw_proto=17. |
arp | Same asdl_type=0x0806. |
rarp | Same asdl_type=0x8035. |
1、添加一条flow:屏蔽 STP 协议的广播数据包
[root@kunpeng82 devuser]# ovs-ofctl add-flow vswitch1 "table=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, actions=drop"
[root@kunpeng82 devuser]# ovs-appctl ofproto/trace br0 in_port=1,dl_dst=01:80:c2:00:00:05br0: unknown bridge ovs-appctl: ovs-vswitchd: server returned an error [root@kunpeng82 devuser]# ovs-appctl ofproto/trace vswitch1 in_port=1,dl_dst=01:80:c2:00:00:05Flow: in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:05,dl_type=0x0000 bridge("vswitch1") ------------------ 0. dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0, priority 32768drop Final flow: unchanged Megaflow: recirc_id=0,eth,in_port=1,dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0,dl_type=0x0000Datapath actions: drop [root@kunpeng82 devuser]# ovs-appctl ofproto/trace vswitch1 in_port=1,dl_dst=01:80:c2:00:00:15Flow: in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:15,dl_type=0x0000 bridge("vswitch1") ------------------ 0. priority 0NORMAL >>>> received packet on unknown port 1 <<<< >>no input bundle, dropping Final flow: unchanged Megaflow: recirc_id=0,eth,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:15,dl_type=0x0000Datapath actions: drop
2、再添加一条flow:
ovs-ofctl add-flow vswitch1 "table=0, priority=0, actions=resubmit(,1)"
添加之后talbe不存在actions=normal的flow:cookie=0x0, duration=177867.865s, table=0, n_packets=153445, n_bytes=16182100, priority=0 actions=NORMAL
[root@kunpeng82 devuser]# ovs-ofctl dump-flows vswitch1
cookie=0x0, duration=1424.340s, table=0, n_packets=0, n_bytes=0, dl_dst=01:80:c2:00:00:00/ff:ff:ff:ff:ff:f0 actions=drop
cookie=0x0, duration=552.220s, table=0, n_packets=6, n_bytes=420, priority=0 actions=resubmit(,1)
[root@kunpeng82 devuser]# ovs-appctl ofproto/trace vswitch1 in_port=1,dl_dst=01:80:c2:00:00:15Flow: in_port=1,vlan_tci=0x0000,dl_src=00:00:00:00:00:00,dl_dst=01:80:c2:00:00:15,dl_type=0x0000 bridge("vswitch1") ------------------ 0. priority 0resubmit(,1) 1. No match. drop Final flow: unchanged Megaflow: recirc_id=0,eth,in_port=1,dl_dst=01:80:c2:00:00:10/ff:ff:ff:ff:ff:f0,dl_type=0x0000Datapath actions: drop [root@kunpeng82 devuser]#