Using ipset for security group
Change-Id: I8b9a849c6a4612f6e043c70ca1269cdd6cdc0afb Implements blueprint add-ipset-to-security
This commit is contained in:
176
specs/juno/add-ipset-to-security.rst
Normal file
176
specs/juno/add-ipset-to-security.rst
Normal file
@@ -0,0 +1,176 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==========================================
|
||||
Add ipset to security group
|
||||
==========================================
|
||||
|
||||
https://blueprints.launchpad.net/neutron/+spec/add-ipset-to-security
|
||||
|
||||
Now neutron uses iptables to achieve security group functions, but iptables
|
||||
chain is linear storage and filtering, we can use ipset to improve security
|
||||
group's performance.
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Now neutron uses iptables to achieve security group functions, but there are
|
||||
following problems.
|
||||
|
||||
Problem 1:
|
||||
When a security group has many rules between other security group, this would
|
||||
affect security group's performance.
|
||||
|
||||
Problem 2:
|
||||
When a port is updated, the security group chain related to that port will
|
||||
be destroyed and rebuilt, this would affect L2 agent's performance.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
The proposal is to improve security group performance based on existing
|
||||
security group agent codes.
|
||||
|
||||
In L2 agent, it makes use of ipset to optimize the iptables rule chain. When a
|
||||
port is created, L2 agent will add a additional ipset chain to it's iptables
|
||||
chain, if the security group that this port belongs to has rules between other
|
||||
security group, the member of that security group will add to ipset chain.
|
||||
|
||||
When a port is created in default security group, its corresponding iptables
|
||||
rules in L2 agent like these(old result):
|
||||
-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
|
||||
|
||||
The new iptables rules by using 'iptables+ipset' like these:
|
||||
-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
|
||||
|
||||
The ipset chain like this:
|
||||
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
|
||||
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
1) iptables-save/iptables-load time will be greatly reduced, as we just need to
|
||||
modify one ipset per security group, and not all the bunch of duplicated rules
|
||||
per port.
|
||||
|
||||
2) With iptables, kernel has to linearly go evaluating after all iptables rules
|
||||
in chain order, while for an ipset in iptables, a lots of rules will become
|
||||
into a "hash" with much faster evaluation.
|
||||
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
Considered a deployer doesn't provide ipset in their system, using
|
||||
'iptables+ipset' to enhance security group will be optional.
|
||||
A configuration flag will be added to L2 agent configuration file:
|
||||
|
||||
[securitygroup]
|
||||
enable_ipset_enhancement = False
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
None.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
https://launchpad.net/~shihanzhang
|
||||
|
||||
Other contributors:
|
||||
https://launchpad.net/~mangelajo
|
||||
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Improve 'security_group_rules_for_devices'
|
||||
* Add ipset chain in '_add_rule_by_security_group'
|
||||
* Unit tests
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None.
|
||||
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
Unit tests should be enough, as this is to optimize already existing
|
||||
functionality which is already covered by tempest
|
||||
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
None.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* http://ipset.netfilter.org
|
Reference in New Issue
Block a user