将 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

开发人员影响

无。

实现

负责人

主要负责人

https://launchpad.net/~shihanzhang

其他贡献者

https://launchpad.net/~mangelajo

工作项

  • 改进 ‘security_group_rules_for_devices’

  • 在 ‘_add_rule_by_security_group’ 中添加 ipset 链

  • 单元测试

依赖项

无。

测试

由于这是对已经存在的、并且已经被 tempest 覆盖的功能的优化,因此单元测试就足够了。

文档影响

无。

参考资料