ikev1: Allow immediate deletion of rekeyed CHILD_SAs

When charon rekeys a CHILD_SA after a soft limit expired, it is only
deleted after the hard limit is reached.  In case of packet/byte limits
this may not be the case for a long time since the packets/bytes are
usually sent using the new SA.  This may result in a very large number of
stale CHILD_SAs and kernel states.  With enough connections configured this
will ultimately exhaust the memory of the system.

This patch adds a strongswan.conf setting that, if enabled, causes the old
CHILD_SA to be deleted by the initiator after a successful rekeying.

Enabling this setting might create problems with implementations that
continue to use rekeyed SAs (e.g. if the DELETE notify is lost).
This commit is contained in:
Tobias Brunner
2016-03-03 17:28:03 +01:00
parent 904f93f655
commit 2f3c08d268
2 changed files with 25 additions and 1 deletions
+8
View File
@@ -61,6 +61,14 @@ charon.crypto_test.required = no
charon.crypto_test.rng_true = no
Whether to test RNG with TRUE quality; requires a lot of entropy.
charon.delete_rekeyed = no
Delete CHILD_SAs right after they got successfully rekeyed (IKEv1 only).
Delete CHILD_SAs right after they got successfully rekeyed (IKEv1 only).
Reduces the number of stale CHILD_SAs in scenarios with a lot of rekeyings.
However, this might cause problems with implementations that continue to
use rekeyed SAs until they expire.
charon.dh_exponent_ansi_x9_42 = yes
Use ANSI X9.42 DH exponent size or optimum size matched to cryptographic
strength.
+17 -1
View File
@@ -170,6 +170,11 @@ struct private_quick_mode_t {
*/
u_int32_t rekey;
/**
* Delete old child after successful rekey
*/
bool delete;
/**
* Negotiated mode, tunnel or transport
*/
@@ -406,8 +411,17 @@ static bool install(private_quick_mode_t *this)
if (old)
{
charon->bus->child_rekey(charon->bus, old, this->child_sa);
/* rekeyed CHILD_SAs stay installed until they expire */
/* rekeyed CHILD_SAs stay installed until they expire or are deleted
* by the other peer */
old->set_state(old, CHILD_REKEYED);
/* as initiator we delete the CHILD_SA if configured to do so */
if (this->initiator && this->delete)
{
this->ike_sa->queue_task(this->ike_sa,
(task_t*)quick_delete_create(this->ike_sa,
this->proposal->get_protocol(this->proposal),
this->rekey, TRUE, FALSE));
}
}
else
{
@@ -1450,6 +1464,8 @@ quick_mode_t *quick_mode_create(ike_sa_t *ike_sa, child_cfg_t *config,
.tsi = tsi ? tsi->clone(tsi) : NULL,
.tsr = tsr ? tsr->clone(tsr) : NULL,
.proto = PROTO_ESP,
.delete = lib->settings->get_bool(lib->settings,
"%s.delete_rekeyed", FALSE, lib->ns),
);
if (config)