将 ipset 添加到安全组¶
https://blueprints.launchpad.net/neutron/+spec/add-ipset-to-security
目前 neutron 使用 iptables 实现安全组功能,但 iptables 链是线性存储和过滤的,我们可以使用 ipset 来提高安全组的性能。
问题描述¶
目前 neutron 使用 iptables 实现安全组功能,但存在以下问题:
问题 1:当一个安全组有许多与其他安全组之间的规则时,这会影响安全组的性能。
问题 2:当一个端口更新时,与该端口相关的安全组链将被销毁并重建,这会影响 L2 agent 的性能。
提议的变更¶
该提案是在现有安全组 agent 代码的基础上改进安全组性能。
在 L2 agent 中,它利用 ipset 来优化 iptables 规则链。当创建一个端口时,L2 agent 会在其 iptables 链中添加一个额外的 ipset 链,如果该端口所属的安全组具有与其他安全组之间的规则,则该安全组的成员将被添加到 ipset 链中。
当在默认安全组中创建一个端口时,其在 L2 agent 中的相应 iptables 规则如下(旧结果):-A neutron-openvswi-i92605eaf-b -m state –state INVALID -j DROP -A neutron-openvswi-i92605eaf-b -m state –state RELATED,ESTABLISHED -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.20/32 -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.19/32 -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.16/32 -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.17/32 -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.18/32 -j RETURN -A neutron-openvswi-i92605eaf-b -s 192.168.83.15/32 -j RETURN
使用 ‘iptables+ipset’ 的新 iptables 规则如下:-A neutron-openvswi-i92605eaf-b -m state –state INVALID -j DROP -A neutron-openvswi-i92605eaf-b -m state –state RELATED,ESTABLISHED -j RETURN -A neutron-openvswi-i92605eaf-b -m set –match-set ${ipset_name} src -j RETURN
ipset 链如下:Name: ${ipset_name} Type: hash:ip Header: family inet hashsize 1024 maxelem 65536 Size in memory: 16632 References: 1 Members: 192.168.83.16 192.168.83.17 192.168.83.15 192.168.83.18 192.168.83.19 192.168.83.20
备选方案¶
无。
数据模型影响¶
无。
REST API 影响¶
无。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
1) iptables-save/iptables-load 的时间将大大缩短,因为我们只需要修改每个安全组的一个 ipset,而不需要修改每个端口的所有重复规则。
2) 使用 iptables 时,内核必须按链顺序线性地评估所有 iptables 规则,而对于 iptables 中的 ipset,许多规则将变成一个具有更快评估速度的“哈希”。
其他部署者影响¶
考虑到部署者没有在其系统中提供 ipset,使用 ‘iptables+ipset’ 增强安全组将是可选的。将添加一个配置标志到 L2 agent 配置文件
[securitygroup] enable_ipset_enhancement = False
开发人员影响¶
无。
实现¶
负责人¶
工作项¶
改进 ‘security_group_rules_for_devices’
在 ‘_add_rule_by_security_group’ 中添加 ipset 链
单元测试
依赖项¶
无。
测试¶
由于这是对已经存在的、并且已经被 tempest 覆盖的功能的优化,因此单元测试就足够了。
文档影响¶
无。