2月技术周 | OVS实现安全组,你需要知道这些!

防火墙

防火墙是避免网络信息基础设施免受复杂网络环境中安全***的必要设施。高效的防火墙则更需要实时跟踪来往于不同网络设备间的各类网络连接,即“有状态防火墙”。对于实际的硬件物理网络基础设施需要防火墙,对于虚拟网络设备,openstack在这样的云平台亦需要同样的防火墙进行网络保护。

在Openstack中,防火墙由“Security Group”和“FWaas”两大服务组成。其中Security Group在port级别提供对VM网络通信的访问控制。而Fwaas则运行在vrouter上在subnet的边界控制子网间的L3和L4流量。简而言之,“Security Group”保护port,“FWaas”保护subnet。

Openstack下的“Security Group”不仅保护租户VM,使其避免受到无价值数据流的影响,同时还限制租户VM,避免其主动发起ARP spoofing,DHCP spoofing等不安全网络行为。实际定位到底层,“Security Group”可以通过iptables和ovs 流表两种方式实现。本文将重点讲述基于OVS 流表实现的安全组(Security Group)。

OVS Conntrack 概述

无状态的防火墙只能通过静态的网络元组来过滤,阻拦,放行数据报文。这里的静态网络元组包括IP地址,端口,网络协议。无状态防火墙并不关心当前网络连接处于何种状态。相较于无状态防火墙,有状态防火墙增加了对当前网络连接状态的识别,同步使用静态的网络元祖对数据报文进行过滤,阻拦,放行。增加的识别标志在一定程度上消耗系统资源,但更加严格的规则却更能保障网络更加安全。

网络连接状态的识别通常是由CT模块(connection tracker)实现的。在linux内核中,CT是由conntrack实现。从OVS 2.5起,开始支持conntrack,并在openflow中体现相关CT状态的识别与处理。Openstack则从M版开始,使用OVS的新特性,来实现“有状态防火墙”中的“Security Group”功能。

从OVS提供的CT功能简图2来看,相对于原有流表处理,无非增加了提交连接数据包进入CT模块,标记连接状态,用于后续流表查询连接状态,匹配数据报文进行指定处理的过程。

图3列举了OVS实现的openflow 中新增的CT相关字段。(有删减,仅列举了后续流表分析时用到的字段)

这里需要重点解释下rel,inv,zone=value(ct_zone)这三条项目。

rel,即related。这里举个典型的例子描述下related数据包。当VM A ping 某外网IP地址B,发出一个ICMP Echo Request报文,当该Request报文到达路由器时,路由器判定外网IP地址不可达,回送一个ICMP Network Unreachable报文。那么这个ICMP Network Unreachable报文与先前发出的ICMP Echo Request报文就是存在related关系。因为对于ICMP Echo Request报文而言,只有ICMP Echo Reply报文是与它存在reply(rpl)关系的。

inv,即invalid。如果存在下述几种情况:linux内核中L3/L4协议处理程序不可用或者未加载;nf_conntrack_ipv4或nf_conntrack_ipv6模块没有加载;L3/L4协议判定数据包非法;数据包本身报文长度与协议本身不匹配,那么该数据包将被置位inv。例:UDP奇数字节报文,被某型网卡驱动末位padding 0,但未增加IP头部内长度信息,也未增加UDP头部内长度信息,导致该报文在OVS CT中判定inv,最终drop导致通信与预期不符。

通过查询系统连接跟踪条目,如图4所示,可知协议类型,源IP,目的IP,源端口,目的端口这5项元组共同构成了识别一条连接跟踪的索引。在openstack环境中,会有一定概率存在不同项目下的VM,使用相同网段的子网IP,且恰好被调度到同一台宿主机。在极其偶然的情况下这两台VM恰好使用同样的协议,同样的源端口去访问同一个目的IP的同一个目的端口。如果不加任何隔离处理必将导致连接跟踪条目的重叠冲突。

zone=value(ct_zone),很好的处理了这种冲突。zone可以称之为隔离连接跟踪条目的namespace。不同zone中的连接跟踪条目即使协议类型,源IP,目的IP,源端口,目的端口完全一致,也不会存在冲突。在Security Group的OVS驱动中,每条连接在提交至CT模块时,zone均被指定为该网络连接所处network在本节点上local vlan tag。(此处network为neutron下的network模型)

安全组相关特性

当一个port不添加任何安全组信息时,只有匹配该port的ARP报文,DHCP报文,和已建立的连接才会被初始化时下发的流表规则放行。当然,关闭port的port_security_enabled属性可以屏蔽anti ARP spoofing和anti DHCP spoofing流表规则的下发。Neutron中的一些特殊类型port,例如DHCP port,gateway port等被认为是security port,自然也是关闭port_security_enabled属性。如果需要在port上允许其他自定义的IP,MAC网络包的流通,也可以通过port的allowed_address_pairs添加相应信息。被添加的IP,MAC会在下发安全组规则时作为可信任的地址信息被填入流表。

当安全组A的一条ingress规则通过remote group id指向了安全组B,那么代表着所有通过安全组B的流量才能匹配这条ingress规则。也即意味着只有绑定了绑定了安全组B的port发出的流量才能匹配这条ingress规则。

OVS安全组流表分析

以“目的IP192.168.0.0/24目标端口22协议TCP出向放行”,“任意IP目标端口80协议TCP入向放行”两条安全组规则为例,分析流量具体经过的流表,如下图5所示。

OVS与iptables对比

不使用OVS情况下,Linux内核的连接跟踪模块仅限于IP协议层(L3)的Linux内核防火墙(iptables)使用。而实际VM流量从tap口流出时已经是L2层报文。因此额外添加了一层Linux bridge,配合ebtables,处理原有L2层报文后上送至iptables,从而在iptables中执行连接跟踪,所有Security Group规则也被转换成具体的iptables规则,配合连接状态,实现状态防火墙的功能。经过筛选处理后的报文再通过veth从Linux bridge流向br-int,执行外部交换与路由。

对比OVS与iptables实现的状态防火墙,多一层虚拟网络设备就多一次处理,这里必然导致多一重性能损耗。如图7所示,在Security Group 规则数量庞大的情况下,性能消耗则更加明显。

原文地址:https://blog.51cto.com/99cloud/2361733

时间: 2024-10-17 22:09:47

2月技术周 | OVS实现安全组,你需要知道这些!的相关文章

php 获取某个月的周次信息

在做统计的时候如果按照周统计 ,需要对某个月的周次信息进行计算,如果本月头一天不是星期一,则向上一个月取周一,本月最后的几天如果不能正好是一周,则忽略. 例如 2019-09月计算出来的结果 2016-08-29---2016-09-042016-09-05---2016-09-112016-09-12---2016-09-182016-09-19---2016-09-25 具体代码实现如下: <?php $current_year=2016; $current_month=9; $firstd

C# 根据年、月、周、星期获得日期等

原文:C# 根据年.月.周.星期获得日期等 [参考] http://blog.csdn.net/livening/article/details/6049341 http://zhidao.baidu.com/question/378600365.html http://www.cnblogs.com/roy117/archive/2008/03/25/1121584.html 楼上几层的代码都太多了,不用那么复杂. 先跟你说一下原理: 1.国际上的WeekDay是从周日到周六的顺序 2.再说C

自制时间比对函数处理 比对过去时间与当前时间相差多少年多少月多少周多少分 多少秒

附代码: <?php $time_start=time()-86600; $time_diff=time()-$time_start; $date_array=array('年'=>31536000,'月'=>2592000,'周'=>604800,'天'=>86400,'小时'=>3600,'分钟'=>60,'秒'=>1); $real_diff=""; foreach ($date_array as $key => $v) {

mybatis中关于年,季,月,周,日的统计问题

关于统计年,季,月,周,日数据问题如:销售额,访问量等,从网上百度了一些,但是我执行时不管用,在此基础上我改了一些代码如下方法: 年 SELECT COUNT(1) productCount,YEAR(createTime) years FROM `gm_buyerproduct` WHERE YEAR(createTime) = YEAR("2018-12-07 16:38:46") 季(控制在具体某年的哪个季度) SELECT COUNT(1) productCount,QUART

四个月技术写作,我写了些什么?

从去年国庆节开始,我连续更新了 4 个月公众号,累计发布原创文章 40 篇. 按照大多数个人订阅号的优良传统,号主应该在跨年的前后作年终总结.然而,一来我反应比较迟钝,没跟上节奏,二来当时我正在写比较重要的系列,没时间分心,所以还是慢了半拍. 现在,创作出现了空档期,而身体也出现一种魔幻性的跨移--从几千里外的城市回到分别了几百天的农村.这仿佛就在营造一种仪式感,逼使我要把这未完成的任务做个了结. 因此,现在我就来梳理梳理写出来的东西,说说我的想法吧. 1.Python猫的故事 这是我的主打系列

6月第二周学习总结--两次感冒

第一次感冒还没好,又来一次感冒,今天上午好难受,下午好一点了,换了个宿舍,终于没有人在宿舍抽烟了 微信实验一下午终于有人加我了,脸皮也许会变厚点,也不是啥坏事, 今天的任务恐怕又不能完成了,复习错题里面的编程题目 藏松已经开始看OC了,很多同学都看完了,我的指针还没看,差距有多大,今天玩微信和QQ花了太多时间,身体状况也不太好 还是要保重身体,12点之前睡下,早上6点起床,休息的时间可以间隔长一点,累了就休息充分一点,身体必须良好,不能猝死啊 忘了做题预习了,感冒了,鼻塞,头痛,鼻窦炎?没吃水果

mysql 按月按周统计

http://hi.baidu.com/liangjian1024/blog/item/6861541b1416094842a9ad7c.html 表finance有俩个字段如下 date date money double(15,2)     下面需要对表finance的2010年财务数据,按月进行统计 Sql代码 select DATE_FORMAT(date,'%Y-%m') as month,sum(money) as money from finance where DATE_FORM

月2 周5 (前半写于周2)

<天镜的阿尔德拉民> 8/12 <天镜的阿尔德拉民7> 10/12 <零之魔法书> 7/12 <剑刻的银乙女> 7/12 <一个人也能活下去> 6/12 <异世界和我,你喜欢哪一个>(七夕节狗粮啊) 5/12 <自称贤者弟子的贤者> 4/12 <异世界料理道> 7/12 <精灵幻想记> 3/12 <说谎的天使死了> 9/12 <欢迎来到实力至上主义教室> 8/12 <庶

2018年下载中心1月第一周资源下载TOP榜

2018年1月1日至2018年1月7日下载中心资源下载TOP榜 NO.10 下载数:82 资源标题: 6个问题竟能说服各种人:耶鲁心理学家教你迅速解决一切难题 资源地址:http://down.51cto.com/data/2387299 NO.9 下载数:84 资源标题:Linux awk高级应用和cut的使用 资源地址:http://down.51cto.com/data/2387529 NO.8 下载数:89 资源标题:Vistual Studio2017 v15.5.2 企业版 资源地址