专栏名称: 刘超的通俗云计算
刘超,网易云解决方案首席架构师,代码级略懂OpenStack、Hadoop、Docker、Lucene、Mesos等开源软件,曾出版《Lucene应用开发揭秘》,个人博客可搜索popsuper1982。
目录
相关文章推荐
高可用架构  ·  Feed 流系统的架构设计方案 ·  昨天  
高可用架构  ·  Java方法设计原则与实践:从Effecti ... ·  2 天前  
架构师之路  ·  高可用架构:fail-over的三种经典模式 ... ·  3 天前  
51好读  ›  专栏  ›  刘超的通俗云计算

玩转Openvswitch第十站:Flow Table

刘超的通俗云计算  · 公众号  · 架构  · 2017-07-14 23:33

正文

对于Flow Table的管理,由ovs-ofctl来控制

  • add−flow switch flow

  • mod−flows switch flow

  • del−flows switch [flow]


一行flow entry主要有下面两部分组成:

  • Match Field

  • Actions


其中Match Field是对网络包进行解析,解析如下的字段,看这些字段是否能够匹配某个值。


这些字段分别在TCP/IP协议栈的各个层次。



Actions有以下的操作:

  • output:port 和 output:NXM_NX_REG0[16..31]

  • enqueue:port:queue

  • mod_vlan_vid:vlan_vid

  • strip_vlan

  • mod_dl_src:mac 和 mod_dl_dst:mac

  • mod_nw_src:ip 和 mod_nw_dst:ip

  • mod_tp_src:port 和 mod_tp_dst:port

  • set_tunnel:id

  • resubmit([port],[table])

  • move:src[start..end]−>dst[start..end]

  • load:value−>dst[start..end]

  • learn(argument[,argument]...)


我们做一个实验,实现如下的拓扑结构,并通过操作flow表改变流向。



其中的flow表设计如下:


接下来我们逐步创建整个拓扑结构和流表。


配置拓扑结构:在三台机器上都运行。


ovs-vsctl add-br br-int

ovs-vsctl add-br br-tun

ip link add br-int-pair type veth peer name br-tun-pair

ip link set br-int-pair up

ip link set br-tun-pair up

ovs-vsctl add-port br-int br-int-pair

ovs-vsctl add-port br-tun br-tun-pair

ip link add vnic0 type veth peer name vnic0-br-int

ip link set vnic0 up

ip link set vnic0-br-int up

ovs-vsctl add-port br-int vnic0-br-int

ifconfig vnic0 10.0.0.1/24

ip link add vnic1 type veth peer name vnic1-br-int

ip link set vnic1 up

ip link set vnic1-br-int up

ovs-vsctl add-port br-int vnic1-br-int

ifconfig vnic1 10.0.1.1/24

ovs-vsctl set Port vnic0-br-int tag=1

ovs-vsctl set Port vnic1-br-int tag=2

ovs-vsctl add-port br-tun gre0 -- set Interface gre0 type=gre options:local_ip=192.168.100.100 options:in_key=flow options:remote_ip=192.168.100.101 options:out_key=flow

ovs-vsctl add-port br-tun gre1 -- set Interface gre1 type=gre options:local_ip=192.168.100.100 options:in_key=flow options:remote_ip=192.168.100.102 options:out_key=flow


执行结果如下:



接下来我们配置Flow。


1. 删除所有的Flow


ovs-ofctl del-flows br-tun


2. 配置Table 0


从port 1进来的,由table 1处理


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=1 actions=resubmit(,1)"


从port 2/3进来的,由Table 3处理


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=2 actions=resubmit(,3)"

ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 in_port=3 actions=resubmit(,3)"


默认丢弃


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 actions=drop"


3. 配置Table 1


对于单播,由table 20处理


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=1 dl_dst=00:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,20)"


对于多播,由table 21处理


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=1 dl_dst=01:00:00:00:00:00/01:00:00:00:00:00 actions=resubmit(,21)"


4. 配置Table 2


默认丢弃


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=2 actions=drop"


5. 配置Table 3


默认丢弃


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=3 actions=drop"


Tunnel ID -> VLAN ID


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x1 actions=mod_vlan_vid:1,resubmit(,10)"

ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=3 tun_id=0x2 actions=mod_vlan_vid:2,resubmit(,10)"


6. 配置Table 10


MAC地址学习


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=10  actions=learn(table=20,priority=1,hard_timeout=300,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1"



  • Table 10是用来学习MAC地址的,学习的结果放在Table 20里面,Table20被称为MAC learning table

  • NXM_OF_VLAN_TCI这个是VLAN Tag,在MAC Learning table中,每一个entry都是仅仅对某一个VLAN来说的,不同VLAN的learning table是分开的。在学习的结果的entry中,会标出这个entry是对于哪个VLAN的。

  • NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[]这个的意思是当前包里面的MAC Source Address会被放在学习结果的entry里面的dl_dst里面。这是因为每个switch都是通过Ingress包来学习,某个MAC从某个port进来,switch就应该记住以后发往这个MAC的包要从这个port出去,因而MAC source address就被放在了Mac destination address里面,因为这是为发送用的。

  • load:0->NXM_OF_VLAN_TCI[]意思是发送出去的时候,vlan tag设为0,所以结果中有actions=strip_vlan

  • load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[]意思是发出去的时候,设置tunnel id,进来的时候是多少,发送的时候就是多少,所以结果中有set_tunnel:0x3e9

  • output:NXM_OF_IN_PORT[]意思是发送给哪个port,由于是从port2进来的,因而结果中有output:2


7. 配置Table 20


这个是MAC Address Learning Table,如果不空就按照规则处理。


如果为空,就使用默认规则,交给Table 21处理。


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=20 actions=resubmit(,21)"


8. 配置Table 21


默认丢弃


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=0 table=21 actions=drop"


VLAN ID -> Tunnel ID


ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=21 dl_vlan=1 actions=strip_vlan,set_tunnel:0x1,output:2,output:3"

ovs-ofctl add-flow br-tun "hard_timeout=0 idle_timeout=0 priority=1 table=21 dl_vlan=2 actions=strip_vlan,set_tunnel:0x2,output:2,output:3"


最后我们看一下结果。


从10.0.0.1 ping 10.0.0.2


在Instance01上监听br-int上的端口



在Instance01上监听eth0



在Instance02上监听eth0



在Instance02上监听br-int上的端口