Openstack中的安全组实现相互信任的虚拟机之间的通信,绑定同一个安全组的虚拟机使用相同的安全策略。安全组作用范围是在虚拟机上,更具体来说是作用在虚拟机的端口而不是网络上。Openstack中安全组基于Iptables实现,由于当前OpenvSwitch(ovs)不能使用iptables rule,所以虚拟机先连接linux bridge,再连接到ovs网桥。参考链接[1]。
使用Iptables时,报文的状态可以归类为四种:NEW ESTABLISEDRELATED INVAILD. Netfilter就是通过conntrack实现连接追踪的。Conntrack是linux的一个内核模块,使用 conntrack entry记录连接的状态信息,具体可参考[2]。
1. sg without conntrack-tool
Neutron最初实现安全组功能时并没有考虑对conntrack的处理,从而导致一些问题。如图1虚拟机vm1(1.1.1.8) vm2(1.1.1.9)属于同一子网,位于同一个计算节点,都绑定default安全组,执行vm1 ping vm2后能够ping通。此时删除default安全组中ingress规则保留egress规则,发现vm1 ping vm2仍未中断[3]。
究其原因,ICMP报文到达vm2连接的linux bridge时进入Iptables处理阶段。iptables中vm2对应的i链(参考[4])有一条规则为-mstate --state RELATED,ESTABLISHED -m comment -j RETURN(默认规则) ,表示状态为RELATED ESTABLISHED的连接可以流入vm2。
由于删除ingress规则后,neutron没有对conntrack执行任何操作,外界也没有执行停止vm1 ping vm2的操作,对应的conntrack entry一直存在并且不会过期。所以即使default安全组中已删除ingress规则通信仍未中断。
$ sudo conntrack -L -p icmp
icmp 1 29 src=1.1.1.8 dst=1.1.1.9 type=8 code=0 id=11521 src=1.1.1.9dst=1.1.1.8 type=0 code=0 id=11521 mark=0 use=1
conntrack v1.4.1 (conntrack-tools): 1 flowentries have been shown.
此时如果重新执行vm1 ping vm2,发现这次不能ping通。这次报文仍会进入Iptables的处理,因为default安全组已删除了ingress规则,所以ICMP报文能够流入vm2的条件仍然是要能够满足state为RELATED,ESTABLISHED。
但这次的ICMP报文被认为是NEW状态。查看conntrack发现虽然旧的entry(ID 11521)仍存在,但是重新ping的过程被看作新的连接,对应新的entry (ID 12033),UNREPLIED表明此次连接还未建立。
$ sudo conntrack -L -p icmp
icmp 1 26 src=1.1.1.8 dst=1.1.1.9 type=8 code=0 id=11521 src=1.1.1.9dst=1.1.1.8 type=0 code=0 id=11521 mark=0 use=1
icmp 1 29 src=1.1.1.8 dst=1.1.1.9 type=8 code=0 id=12033 [UNREPLIED]src=1.1.1.9 dst=1.1.1.8 type=0 code=0 id=12033 mark=0 use=1
conntrack v1.4.1 (conntrack-tools): 2 flowentries have been shown.
另外,没有对conntrack处理还造成了租户隔离的问题:如租户1创建了虚拟机vm1(1.1.1.8) vm2(1.1.1.9),如图1;租户2创建相同IP的虚拟机vm3(1.1.1.8) vm4(1.1.1.9)且vm1/2/3/4都在同一计算节点,则vm1/2通信产生的conntrack entry会对vm3/4之间的通信产生影响,参考[5]。
2. sg with conntrack-tool
相关bug在2014年就提出,直到2015年8月这些问题才得以解决。StableLiberty版本中使用conntrack tool 实现对conntrackentry的管理。
仍然使用图1所示环境,default安全组ingress与egress规则都存在时执行vm1 ping vm2并查看conntrack:
$ sudo conntrack -L -p icmp
icmp 1 29 src=1.1.1.8 dst=1.1.1.9 type=8 code=0 id=10753 src=1.1.1.9dst=1.1.1.8 type=0 code=0 id=10753 mark=0 zone=2use=1
conntrack v1.4.1 (conntrack-tools): 1 flowentries have been shown.
此时删除ingress规则,发现通信会立即中断,这是由于上述conntrack entry被立即删除了。
另外,上述conntrack entry增加了一个zone属性,此属性是为避免[5]中出现的租户隔离问题而设计的。在每个计算节点上,虚拟机所属的网络与local vlan有一一对应关系,zone的值设置为local vlan,实现了conntrack entry的本地租户隔离。
参考链接:
[1]https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux_OpenStack_Platform/4/html/Configuration_Reference_Guide/section_networking-scenarios.html
[2]http://www.iptables.info/en/connection-state.html
[3]https://bugs.launchpad.net/neutron/+bug/1335375
[4]http://blog.csdn.net/yeasy/article/details/21612151?utm_source=tuicool&utm_medium=referral
[5]https://bugs.launchpad.net/neutron/+bug/1359523