Netvirt之流表分析(五):Security groups & LBaaS

Security groups

在neutron中使用iptables实现的,但是在netvirt中使用ovs的flow rule来实现的,这样VM port与br-int之间的bridge不在需要了,简化拓扑。

ovs通过(ingress/egrss), protocol, port range与ip prefix属性来创建security group rule. Table 40 用于egress 方向流量过滤,Table 90用于ingress方向流量过滤。

1. 有状态实现

security group有两种实现方式,一种是有状态实现,一种是无状态实现,有状态实现需要ovs 2.5与linux kernel 4.3以上版本支持,ovs通过通过集成netfiler框架,根据5元组跟踪连接。这样在ovs中存在两种表,一种是ovs的静态流表,一种是netfilter维护的动态session表,ovs首先会静态流表来识别流是否需要被track,如果需要那么会将其交给netfiler来处理,处理完成后返回相应的flag,ovs根据返回的flag做下一步处理,丢弃,转发或是其他action。

flag定义:

+trk: 连接已经保存在netfilter中了
-trk: 连接还未被保存

new:这是一个新的连接,只能用于出于uncommited 的连接。
est: 已经建立起来的连接,只能用与处于committed的连接
rel:已经存在的连接,处理icmp与ftp连接,只能用与处于committed的连接
inv:不合法的状态,netfilter不能识别这个连接,这里flag处理因为一些错误导致traffic不能被netfiler处理,例如协议错误,报文长度错误,没有加载nf_conntrack_ipv4等。

+trk+est: 表明这个连接是合法的,已经被跟踪,并且被netfilter标记为允许通过的连接。
+trk+new: 表明这是一个新的连接,如果netfiler允许这个连接通过并cache这个连接,commit 后,下一个包到达后netfilter将返回+trk+est flag。如果netfilter不允许连接通过,这个连接将被丢弃。

2. 无状态实现

无状态的实现对ovs版本没有要求,对于tcp连接,通过tcp syn flag建立伪连接进行连接状态跟踪,默认syn packets是drop的,除非有rule允许其通过。对于其他协议,全部允许通过。

3. pipeline

当VM启动后,默认会为VM所在的端口创建fixed rules,包括dhcp ,arp与contrack rules。contrack rules 仅在有状态的ovs中支持。
3.1 dhcp fixed rules
1.Allow dhcp server traffic ingress, client listen to 68, server listen to 67

2. Allow DHCP client traffic egress.

3.2 Arp fixed rules

3.3 Conntrack fixed rules

  • 如果packet没有被track(state=-trk),那么将被发送的netfilter处理
  • 如果packet状态为+trk+est,那么允许packet通过
  • 默认drop其他类型的包

3.4 TCP Syn fixed rule
默认丢弃所有tcp syn的packets

4 小节

最后用户也可以根据自己的需要创建自己的security grouprules,ovs可以实现与iptables相同的功能。当前ODL支持的rules:

Protocol

Port Range

IP Prefix

Remote Security Group supported

Any Any Any Yes
TCP 1 - 65535 0.0.0.0/0 Yes
UDP 1 - 65535 0.0.0.0/0 Yes
ICMP Any 0.0.0.0/0 Yes

LBaaS

1. 实现原理

图 1 LBaaS实现

LBaaS利用OpenVSwitch的mutipath功能来实现的,mutipath的action中的max_link代表后端资源池的数目。

当通过vip访问VM中的服务时,根据目的IP报文被路由到OVS节点,进入pipeline进行处理,在表50中,OpenVSwitch对报文的5元组做hash,hash结果(1~max_link-1)放到reg1中,根据link值,修改报文的目的MAC为VM的MAC,让后将报文送到VM中。
LBaaS的实现类似于LVS的DR模式,也是通过修改报文的目的MAC来实现的。因为是通过对5元组进行hash来选择server的,所以仅支持RR调度,而LVS支持3种调度方式,8种流量调度算法,LBaaS的不足之处还有:

1 每个子网只允许创建一个LBaaS实例
2 不能实时监控后端服务器的状态,如果后端服务不可用后,不能动态删除与添加
3 LBaas只能实现3层负载分担,不支持4,7层。
4 不支持HA

从中可以看出当前LBaaS的实现还是一个prototype,离实际应用还很远。

2 pipeline

2.1 external network access
1.inboudflow:

2. outbound:

2.2 intra-subnet access

对于内部子网的LB,因为没有分配floatingip,所以需要为VIP创建一个dummy端口,例如端口的ip的10.0.0.5,mac为fa:16:3e:d1:70:1f
1.inbound

2.outbound

总结

netvirt项目开始于2013年,受限于当时ODL的plugin还不是很多,ovs还不支持conntrack功能,netvirt的功能基本上都是采用ovs的静态流表实现的,随着odl plugin的越来越丰富,功能也越来越稳定,社区正在对netvirt进行重新设计包括pipeline,引入odl中其他plugin,例如ARP,DHCP交给dhcpservice进行处理,L2使用ELAN manager来管理等等。

参考资料

https://wiki.opendaylight.org/view/NetVirt
http://www.flaviof.com/blog/work/how-to-odl-with-openstack-part1.html
http://www.flaviof.com/blog/work/how-to-odl-with-openstack-part2.html
http://www.flaviof.com/blog/work/how-to-odl-with-openstack-part3.html

作者简介:胡西宁,搞过neutron,对SDN/NFV有浓厚兴趣,一直从事相关工作,现在某通信公司工作


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/17597.html
分享到:
相关文章
条评论

登录后才可以评论

胡西宁 发表于16-08-12
0