openstack安全组ovs实现原理

访问vm的数据包流表匹配

目标IP:10.211.202.16
目标mac:fa:16:3e:f1:2a:30
该网络对应的外部vlan id:202
分析ssh 10.211.202.16时的流表匹配过程

1、进入br-bond1虚拟交换机

[root@xs-compute07 ~]# ovs-ofctl dump-flows br-bond1
cookie=0x9eedb808458e18cb, duration=11354519.037s, table=0, n_packets=682083853, n_bytes=201236764900, priority=0 actions=NORMAL

以上规则会放行(normal)进入的流量

2、进入br-int虚拟交换机

[root@xs-compute07 ~]# ovs-ofctl dump-flows br-int|grep 'in_port=1,'
 cookie=0x15dc71101f8d4543, duration=10899451.078s, table=0, n_packets=172929377, n_bytes=22752624935, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=203 actions=mod_vlan_vid:2,resubmit(,60)
 cookie=0x15dc71101f8d4543, duration=9456683.601s, table=0, n_packets=221698989, n_bytes=84670387007, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=202 actions=mod_vlan_vid:3,resubmit(,60)

将外部vlan转换为内部vlan(202->3),并提交到60号表

3、查看60号表规则

[root@xs-compute07 ~]# ovs-ofctl dump-flows br-int|grep 'table=60'
...
 cookie=0x15dc71101f8d4543, duration=1665303.968s, table=60, n_packets=20426879, n_bytes=2381752266, idle_age=2, hard_age=65534, priority=90,dl_vlan=2,dl_dst=fa:16:3e:33:d3:e6 actions=load:0x9->NXM_NX_REG5[],load:0x2->NXM_NX_REG6[],strip_vlan,resubmit(,81)
 cookie=0x15dc71101f8d4543, duration=2729.235s, table=60, n_packets=413, n_bytes=48828, idle_age=4, priority=90,dl_vlan=3,dl_dst=fa:16:3e:f1:2a:30 actions=load:0x11->NXM_NX_REG5[],load:0x3->NXM_NX_REG6[],strip_vlan,resubmit(,81)
 cookie=0x15dc71101f8d4543, duration=11355648.212s, table=60, n_packets=25365663, n_bytes=3397813240, idle_age=0, hard_age=65534, priority=3 actions=NORMAL
 ...

根据目标mac、内部vlan信息匹配中第二条流表,对应的action为:
load:0x11->NXM_NX_REG5[],load:0x3->NXM_NX_REG6[],strip_vlan,resubmit(,81)

NXM_NX_REG5是指openflow协议定义的一些变量,叫寄存器,用在流表匹配过程中临时存储一些中间数据,供后续使用

4、查找81号流表

[root@xs-compute07 ~]# ovs-ofctl dump-flows br-int|grep 'table=81'|grep -v arp|grep -v icmp|grep -v udp|grep -v ipv6|grep reg5=0x11
 cookie=0x15dc71101f8d4543, duration=3946.445s, table=81, n_packets=382, n_bytes=47176, idle_age=1, priority=90,ct_state=-trk,ip,reg5=0x11 actions=ct(table=82,zone=NXM_NX_REG6[0..15])
 cookie=0x15dc71101f8d4543, duration=3946.445s, table=81, n_packets=0, n_bytes=0, idle_age=4773, priority=80,ct_state=+trk,reg5=0x11 actions=resubmit(,82)

根据步骤三中寄存器内容(0x11)匹配第二条流表,对应action:
actions=ct(table=82,zone=NXM_NX_REG6[0…15])
ct(conntrack):链接跟踪模块主要被用于有状态的数据报检测。ct([argument][,argument…])
table=number: 将数据报流水线复制为两份。原始的数据报作为未被跟踪的数据报在当前的动作流水线中继续处理。被复制的数据报被发送到链接跟踪模块,这些数据报会重新回到Openflow流水线中触发后续的处理,但是这些数据报中的ct_state和其他的ct字段被置位。
zone=value OR zone=src[start…end]: 16位的上下文id,其被用于将链接隔离到不同的域,将叠加的网络映射到不同的区域中。zone的默认值为0。

5、查找82号表

[root@xs-compute07 ~]# ovs-ofctl dump-flows br-int|grep 'table=82'|grep reg5=0x11
cookie=0x15dc71101f8d4543, duration=4575.807s, table=82, n_packets=46, n_bytes=7698, idle_age=2517, priority=77,ct_state=+est-rel-rpl,tcp,reg5=0x11,nw_src=10.211.8.0/24,tp_dst=22 actions=output:17,resubmit(,92)
 cookie=0x15dc71101f8d4543, duration=4575.807s, table=82, n_packets=2, n_bytes=148, idle_age=2525, priority=77,ct_state=+new-est,tcp,reg5=0x11,nw_src=10.211.8.0/24,tp_dst=22 actions=ct(commit,zone=NXM_NX_REG6[0..15]),output:17,resubmit(,92)

nw_src=10.211.8.0/24,tp_dst=22 为我们的安全组规则
匹配中第一条规则后执行动作:output:17,resubmit(,92)

6、查看17号口是否为我们的目标主机

[root@xs-compute07 ~]# ovs-ofctl show br-int
 17(tapabd12273-43): addr:fe:16:3e:f1:2a:30
     config:     0
     state:      0
     current:    10MB-FD COPPER
     speed: 10 Mbps now, 0 Mbps max

正是我们要访问的目标主机,至此匹配完安全组规则后到达主机

你可能感兴趣的:(openstack安全组ovs实现原理)