OpenFlow:简述对流表项Flow的了解
一、流表项Flow规则
每条流表项Flow(流表规则)由一系列字段组成,分为基本字段、条件字段和动作字段三部分:
- 基本字段
基本字段包括生效时间duration_sec、所属表项table_id、优先级priority、处理的数据包数n_packets,空闲超时时间idle_timeout等。空闲超时时间idle_timeout以秒为单位,超过设置的空闲超时时间后该流规则将被自动删除,空闲超时时间设置为0表示该流规则永不过期,idle_timeout将不包含于ovs-ofctl dump-flows brname的输出中。
- 条件字段
条件字段包括输入端口号in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、数据包类型dl_type、网络层协议类型nw_proto等。可以为这些字段的任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值,而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd 中的流规则将全部丢失,网络无法连接。
- 动作字段
动作字段包括正常转发normal、定向到某交换机端口output:port、丢弃drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。
二、流表项Flow常用字段
- in_port=port 传递数据包的端口的 OpenFlow 端口编号
- dl_vlan=vlan 数据包的 VLAN Tag 值,范围是 0-4095,0xffff 代表不包含 VLAN Tag 的数据包
- dl_src=和dl_dst= 匹配源或者目标的 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 协议编号
- table=number 指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0。通过使用流表编号,可以创建或者修改多个 Table 中的 Flow
- reg=value[/mask] 交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值
三、流表项Flow常见的操作
- 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]: 写数据到指定的字段
四、流表项Flow示例
1.流规则中可包含通配符和简写形式,任何字段都可等于*或ANY,如丢弃所有收到的数据包。
ovs-ofctl add-flow flow0 dl_type=*,nw_src=ANY,actions=drop
2.简写形式为将字段组简写为协议名,目前支持的简写有ip,arp,icmp,tcp,udp,与流规则条件字段的对应关系如下:
dl_type=0x0800 <=>ip
dl_type=0x0806 <=>arp
dl_type=0x0800,nw_proto=1 <=> icmp
dl_type=0x0800,nw_proto=6 <=> tcp
dl_type=0x0800,nw_proto=17 <=> udp
dl_type=0x86dd. <=> ipv6
dl_type=0x86dd,nw_proto=6. <=> tcp6
dl_type=0x86dd,nw_proto=17. <=> udp6
dl_type=0x86dd,nw_proto=58. <=> icmp6
3.屏蔽某个IP
ovs-ofctl add-flow flow0 idle_timeout=0,dl_type=0x0800,nw_src=119.75.213.50,actions=drop
4.数据包重定向
ovs-ofctl add-flow flow0 idle_timeout=0,dl_type=0x0800,nw_proto=1,actions=output:4
5.去除VLAN tag
ovs-ofctl add-flow flow0 idle_timeout=0,in_port=3,actions=strip_vlan,normal
6.更改数据包源IP地址后转发
ovs-ofctl add-flow flow0 idle_timeout=0,in_port=3,actions=mod_nw_src:211.68.52.32,normal
7.注包
格式为:ovs-ofctl packet-out switch in_port actions packet。其中,packet为hex格式数据包
ovs-ofctl packet-out br0 none output:2 040815162342FFFFFFFFFFFF07C30000
8.跟踪数据包的处理过程
ovs-appctl ofproto/trace br0 in_port=3,tcp,nw_src=10.0.0.2,tcp_dst=22
ovs-appctl ofproto/trace br0 in_port=1,dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02 -generate