Openstack安全组机制浅析(基于linux-bridge和iptables实现)(1)
1、安全组是什么?
Openstack中,neutron提供了安全组(security-group)机制,用来提供对port(虚拟机网卡)的通信进行控制的能力。
安全组的特点是有计算节点进行包过滤,只与L2实现耦合,不依赖三层网络机制(与ACL等机制的最主要区别就在这里),即使在同一个子网内部,安全组也可以提供通信控制能力。
2、安全组是如何实现的?
在较早版本中,由于OVS无法直接绑定iptables,因此在OVS二层实现中,为了使用安全组规则,虚拟机并非直接连接到OVS,而是先经过一个linux网桥,再连接到OVS(现在已经可以使用直接由OVS实现安全组规则,本文暂不讨论这种场景)
在虚拟机运行的计算节点上查询iptables规则,可以看到如下的规则,显示的两条规则中引用的chain就是该网卡的入口和出口的安全组规则的chain:
其中以neutron-openvswi-i开头的是(对虚拟机来说的)入规则,neutron-openvswi-o开头的是(对虚拟机来说的)出规则(注意后面的match部分的in和out是相对于网桥来说的,因此与从虚拟机角度看到的出入方向相反)
使用iptables -n -L [chain名],查看相应的规则:
出规则:
入规则:
下面分析各链中的规则:
出规则:
此条为将所有源端口为68而目的端口为67的UDP包放行(RETURN回neutron-openvswi-sg-chain链后最后ACCPET),源端口为68而目的端口为67的UDP包为DHCP客户端的DHCP请求,此规则即是允许虚拟机向外发送DHCP请求。
============================================================================================
此条引用了另一个链,该链内容为:
即是只允许虚拟机用系统分配的IP的MAC向外发包,禁止修改IP和伪造MAC。
如果使用以下命令增加允许通过的mac-ip对的话,则会在本链增加规则:
neutron port-update [port_id] --allowed_address_pairs type=dict list=true mac_address=[mac地址],ip_address=[IP地址/掩码]
============================================================================================
此条为将所有源端口为67而目的端口为68的UDP包丢弃,源端口为68而目的端口为67的UDP包为DHCP服务端的DHCP相应,本规则即是禁止虚拟机对外提供DHCP服务。
============================================================================================
这两条为丢弃INVALID状态的包,而接受RELATED和ESTABLISHED状态的包,这两条是实现基于连接状态的防火墙,基于之前的包的状态判断后面的包的处理。
============================================================================================
本条为放行所有包,对应openstck安全组的默认规则(出方向全放行)
============================================================================================
此为经过上面所有规则后,未被匹配的包被转发到此链并丢弃
(未完待续)
- 点赞
- 收藏
- 关注作者
评论(0)