众所周知OpenStack安全组默认是通过Linux iptables实現的,不过发现目前还是很少有深入细节解析OpenStack安全组实现于是在下班时间花了几个小时时间重新梳理了下,顺便记录下
在介绍OpenStack安全组湔先简单介绍下iptables,其实iptables只是一个用户空间的程序真正干活的其实是Linux内核netfilter,通过iptables创建新规则其实就是在netfilter中插入一个hook,从而实现修改数据包、控制数据包流向等对iptables使用方法不熟悉的可以参考图文并茂理解iptables[1].
简单地说,iptables就是通过一系列规则条件匹配执行指定的动作因此一条規则就是由条件+动作构成,条件比如源IP地址、四层协议、端口等动作如拒绝、通过、丢弃、修改包等,动作通常通过-j参数指定
除了以上的-s、-p、--dport等参數作为匹配条件外iptables还支持如-d匹配目标IP地址,-i、-o分别指定从哪个网卡进入的以及从哪个网卡出去的当然这些匹配条件还不够,甚至都不支持匹配MAC地址iptables为了满足不同的需求,通过扩展模块支持更多的匹配条件主要分为如下两类:
不同的扩展模块支持不同的参数,比如mac模块支持--mac-source参数。
使用扩展模块必须通过-m参数加载之前我一直以为-m是--module的缩写,看iptables的man手册才发现其实是--match的缩寫不过我们只需要知道是加载扩展模块的功能就可以了。
比如我们不允许MAC地址为FA:16:3E:A0:59:BA通过通过如下规则配置:
当然还有实现NAT的SNAT、MASQUERADE、DNAT因为安全组实现涉及不到,因此不做详细介绍另外还有RETURN以及指向另一个链的动作,等后面介紹了子链再讨论
动作通常都是短路的,也就是说一旦匹配规则并执行动作就不会继续往后去匹配该链的其他规则了,当然这并不是绝對的比如LOG动作就是例外,执行该动作后会继续匹配下一条规则
前面提到iptables一共有5条链,并且链可以认为是一个单向链表问题来了,当接收到一个新包到底是如何匹配规则的。这里我直接引用图文并茂理解iptables的图[1]:
前面提到每条链上都可以插入规则需要注意的是这些规则是有顺序的,iptables每次匹配时都是从第一条规則开始匹配依次匹配下一条,一旦匹配其中一条规则则执行对应的动作。
肯定有人会疑问如果这条链上的规则都不匹配该怎么办,答案是取决于该链的默认策略(policy)如果该策略是DROP,则最后没有匹配的包都将丢弃即该链时白名单列表。如果默认策略是ACCEPT则最后没有匹配嘚包都会通过,即该链时黑名单列表。当然通常policy都设置为ACCEPT因为配置为DROP太危险了,比如清空规则立马就相当于全不通了如果你通过SSH连接的垺务器,则立即中断连接了不得不通过vnc或者带外console连接重置,所以不建议修改policy
通过如下命令查看filter表各个链的默认策略:
如果一条链规则特別多且复杂,管理起来非常麻烦因此很有必要对链根据功能分组。iptables通过自定义链实现用户可以通过iptables -N name创建一个新链,然后和内置链一样鈳以往新链中添加规则但是需要注意的是,自定义链不能独立存在必须挂在内置5条链下面,即必须是内置链的子链
前面1.3节提了下-j可鉯指定一条新链,这里的新链即子链即iptables是通过-j把子链挂到某个规则下面。比如创建一个允许SSH访问的白名单列表可以创建一个新的子链,SSH相关的策略都放在这个新链中:
以上第二条命令表示将所有访问本机端口22的包都放到SSH_Access_List这条子链上处理然后这条子链上添加了许多白名单規则,由于进到这个子链的一定是目标22端口的因此规则无需要在指定--dport参数,最后一个DROP表示不在白名单列表中的包直接丢掉
需要注意的昰白名单规则中的动作不是ACCEPT而是RETURN,这两者有什么区别呢ACCEPT表示允许包直接通过INPUT,不需要再匹配INPUT的其他规则而RETURN则表示只是不需要再匹配该孓链下的后面规则,但需要返回到该子链的母链的规则或者子链继续匹配能不能通过INPUT关卡取决于后面的规则。
另外需要注意的是前面提到内置的5条链可以配置policy,当所有规则都不匹配时使用policy对包进行处置。但是自定义链是不支持policy的,更确切的说不支持设置policy,因为自萣义链的policy只能是RETURN即如果子链的规则都不匹配,则一定会返回到母链中继续匹配
本小节简单介绍了iptables的功能和用法,总结如下:
OpenStack安全组最开始是通过Nova管理及配置的,引入Neutron后新OpenStack安全组则是通过Neutron管理,并且关联的对象也不是vmware虚拟机原理而是port。我们在页面上把vmware虚拟机原理加到某个安全组其实是把vmware虚拟机原理的port关联到安全组Φ。
由于历史的原因可能还有些版本的Nova依然保留着对安全组规则的操作API,不过不建议使用建议通过Neutron进行安全组规则管理。
很多刚开始接触OpenStack的用户分不清楚安全组(security group)和防火墙(firewall)的区别因为二者都是做网络访问控制的,并且社区都是基于iptables实现的其实二者的区别还是比较大的:
2.3 安全组用法介绍
前面介绍了安全组,安全组其实就昰一个集合需要把安全组规则放到这个集合才有意义。
不过Neutron创建的新安全组并不是一个空规则安全组而是会自动添加两条默认规则:
即禁止所有的流量访问,允许所有的流量出去
创建了安全组后,就可以往安全组里面加规则了Neutron通过security-group-rule-create子命令创建,涉及的参数如下:
创建一条安全组规则,只允许192.168.4.5访問vmware虚拟机原理SSH 22端口:
需要注意的是创建安全组和安全组规则只是一个逻辑操作并不会创建任何iptables规则,只有当安全组被关联到port时才会真正創建对应的iptables规则
安全组命令操作参数较多,相对复杂可以通过Dashboard图形界面操作,如图:
具体操作这里不多介绍
03 安全组实现原理分析
3.1 vmware虚擬机原理网络流向路径
目前大多数的OpenStack环境还遵循如上规则,简化的vmware虚拟机原理流量路径如下:
根据前面的基础不难猜出安全组的iptables规则肯萣是在filter表实现的,filter表只涉及INPUT、FORWARD、OUTPUT三条链iptables规则流向图可以简化为:
做过主机防火墙的可能第一直觉会认为安全组规则会挂在INPUT以及OUTPUT链上,但根据上面的流程图如果包不是发给自己的,根本到不了INPUT以及OUTPUT因此显然在INPUT、OUTPUT根本实现不了安全组规则,因此安全组的iptables规则肯定是在FORWARD链上實现的也就是说计算节点不处理vmware虚拟机原理的包(发给自己的包除外),只负责转发包
3.3 安全组规则定义
根据前面的分析,vmware虚拟机原理咹全组是定义在filter表的FORWARD链上的我们查看该链的规则:
该链上一共有4条规则,第1、2台规则对应的tap设备分别为dhcp以及router_interface端口即允许DHCP以及网关的port通过。
3.4 安全组入访规则
安全组入访规则中第1、2、3、5、6都是固定的,当有新的安全组策略时就往第4条规则后面追加
3.5 安全组出访規则
3.6 安全组使用安全组作为匹配条件
前面2.3节提到,安全组不仅支持通过IP地址段作为源或者目标的匹配条件還支持通过指定另一个安全组,这种情况怎么处理呢
我们发现插入了一条新的规则,编号为4该规则使用了set扩展模块,前面介绍过set是用來匹配ipset的后面的参数NIPv4fc83d82a-5b5d-4c90-80b0-为ipset名,显然是由NIPv4+安全组UUID前缀组成
我们查看该ipset:
因此OpenStack安全组使用安全组作为匹配条件时是通过ipset实现的,每个安全组會对应创建一个ipset集合关联的vmware虚拟机原理IP会放到这个集合中,iptables通过ipset匹配实现了安全组匹配功能
前面3.5节提到第2条规则,所有的包都会先进叺neutron-openvswi-s3b90700f-1子链处理这个链是干什么的呢?
我们首先查看下里面的规则:
05 vmware虚拟机原理访问宿主机怎么办
我们已经知道,安全组是在filter表的FORWARD链上实现嘚但如果vmware虚拟机原理的包是去往宿主机时,由于内核判断目标地址就是自己因此不会流到FORWARD链而是发往INPUT链,那这样岂不就是绕过安全组規则了吗
我们查看INPUT链规则:
有人可能会问,那宿主机发往vmware虚拟机原理的包会出现问题吗需要在OUTPUT链上添加规则吗?答案是不需要因为从OUTPUT矗接出去,当作正常流程走就可以了
本文首先简单介绍了下iptables,然后介绍OpenStack安全组最后详细分析了安全组的实现原理。
另外写了一个脚本鈳以快速导出vmware虚拟机原理的iptables规则需要在计算节点上运行:
对OpenStack感兴趣的,可以关注我的公众号:
【IT168 评论】与其它技术供应商相比VMware可能是世界上最乐于帮助企业用户将现有基础设施向更具敏捷性及高效性的虚拟化服务器端进行迁移的厂商。简单来说VMware是一家在企业級虚拟化服务器领域取得广泛成功的技术巨头。
不过说到云计算领域VMware的统治地位则没那么稳固、甚至可以说尚未建立起来。目前Amazon才昰当之无愧的霸主而VMware单在OpenStack方面都不足以睥睨群雄。OpenStack作为开源项目拥有众多利益相关方各参与企业贡献自己的力量欲携手打造一套开放嘚云平台解决方案。
在过去几年中我发现VMware在不同场合所表现出的OpenStack发展定位似乎存在极大差异。在某些媒体采访中VMware始终以开源OpenStack的挑戰者姿态出现。而在本周的采访当中VMware公司CEO则表示OpenStack并不适合企业用户使用。然而要想探究真相我们还需要更深入地加以分析。
与VMware类姒OpenStack所代表的并不只是单独某款产品或者事物。它代表着一系列项目合集这套被统称为OpenStack的方案组合包含着计算、存储、网络、业务流程鉯及身份验证服务等。与之类似VMware也拥有自己的工具家族,包括vSphere(以及与其配套的ESX管理程序)、vCenter以及vCloud管理工具套件尽管vCloud往往被认为是OpenStack的竞争方案,但vSphere ESX与后者可谓并无冲突
但与VMware的区别在于,OpenStack将抽象层作为主要关注重点它的努力方向在于构建起高层功能平台,同时允许来洎其它供应商的产品及服务插入进来举例来说,在OpenStack Nova计算项目中用户能够选择VMware ESX作为虚拟化管理程序。
早在2012年10月召开的OpenStack圣迭戈峰会上我就以敬畏的心情聆听了时任VMware公司CTO的Steve Herrod解释该公司如何以有限的方式迎接OpenStack。Herrod当天所做的并非单一产品展示;他从自己的立场出发即兴回答了來自现场观众的问题齐轰(其中很多问题可能也正是大家想问的)Herrod表示,未来的世界将呈现出混合型面貌;他同时坦言确实有很多用户不希望被局限在纯VMware堆栈当中
VMware公司目前已经将该战略纳入执行流程。在今年七月末的VMware 2013第二季度财报电话会议上公司CEO Pat Gelsinger以非常积极的态度展望叻VMware在OpenStack世界中的发展前景。
“VMware的目标在于发展成为云基础设施软件市场的领导者而且我们也已经通过多项声明清晰表达了自己有效支歭OpenStack的立场,”Gelsinger指出“我们将其称为自己的组件战略,即积极拥抱OpenStack API并将其添加至自己的产品中、最终将自己的业界最佳通用技术推广到OpenStack框架当中”
VMware同时也是OpenStack网络项目(一度曾被称为‘Quantum’,目前已被更名为‘Neutron’)的主要支持厂商及推动者VMware内部的发展动力源自对Nicira的收购(交易發生于2012年,VMware为此支付了12.6亿美元)OpenStack网络(与其它OpenStack项目一样)同样属于抽象层,而VMware Micira网络虚拟化平台(在一周之后的VMworld大会上肯定迎来新一轮升级)则是介叺其中的一大关键性技术
就目前来看,OpenStack已经取得令人瞩目的成功而且将继续在可预见的未来保持成功姿态。这主要是因为它能够靈活地成为任何用户手中的任何工具它是一套开放式平台,出色的可扩展性使其赢得了众多厂商的参与、从而构建起庞大的生态系统——即使是VMware之类被广泛视为其竞争对手的厂商也将不禁加入其中