David Wierbowski writes: > I agree with what you stated here, but I feel you are addressing something > that is not limited to a simultaneous rekey of the IKE SA. It deals with > any > rekey of an IKE SA. In my opinion the text is misplaced and should be in a > section that deals with handling of outstanding exchanges when an IKE SA > is rekeyed.
True. This wait is not really because of simultaneous rekey, but rekey in general. The reason I brought this up here, is that I think that wait is important and the solution for simulatenous rekey should be one that works with such wait. > With that said I'm not sure I agree with how you propose to > handle the outstanding exchanges. I do not think there is any other way than to wait some time to get them finished (or at least failed and acked). The other end who started those outstanding exchanges MUST know whether they were processed or not. If IKE SA is deleted immediately there is no way other end can know that as after IKE SA is deleted the other end does not send ACKs back. > > I agree it should mark the SA so that it is no longer used for the new > > SAs initiated from this end, but the other end might have its own > > exchanges ongoing when the rekey started, and waiting those to finish > > makes protocol work better. When both end mark the old SA as being > > "old", meaning no new exchanges are started on it, but old exchanges > > are allowed to finished then when those old exchanges are finished, > > then the old IKE SA should be deleted (and all operations done on the > > old IKE SA should be moved to the winning SA). > > This sounds like a good idea, but it's not what 4306 required and is a > protocol change. Not really. The RFC4306 do say that you MUST be able to process incoming requests while having your own requests out: 2.3. Window Size for Overlapping Requests ... .... An IKE endpoint MUST be prepared to accept and process a request while it has a request outstanding in order to avoid a deadlock in this situation. An IKE endpoint SHOULD be prepared to accept and process multiple requests while it has a request outstanding. I.e. when you have REKEY started and even when the rekey itself has finished, and delete request sent out (and even replied), you still might receive requests from the other end which were started before the REKEY was started. I agree that the behavior how to handle the deleting of IKE SA after rekey is not described explicitly in RFC4306, but the generic text that you MUST be able toprocess incoming requests while having your own requests out is there, and that is regardless what those requests are. > Based on 4306 I think when an informational exchange request is received > containing the delete of an IKE_SA that the receiver can conclude that most > likely any outstanding request will fail once a response to the delete is > sent. The receiver of the delete request has ways to deal with this. The other end cannot know that, and IKEv2 is deterministic protocol, thus such "most likely" is not enough for it. Here is example to show the situation: Host A Host B -------- ---------- <-- sends request packet is dropped by network it never reaches the host A starts rekey --> <-- replies to rekey starts IKE SA delete --> <-- replies to IKE SA delete Now Host A will delete all of the state of old IKE SA and cannot then process the request from Host B even if it ever reaches it. It cannot even send error back as the crypto keys and so on are already deleted. Host B does not know whether the request was processed or not, as situation could have also been this: Host A Host B -------- ---------- <-- sends request processes request and sends reply --> reply packet is dropped by network it never reaches the host B starts rekey --> <-- replies to rekey starts IKE SA delete --> <-- replies to IKE SA delete Now Host A thinks that the request host B sent was done and finished before rekey, but the Host B does not know that. Host A will not retransmit the reply packet unless host B retransmits its request, but if the IKE SA is deleted by A before that host B might not have time to ever send retransmission for its request, thus B does not know whether its request was processed or not. If host A delays deleting of the IKE SA so long that Host B's retransmissions reach it (i.e. time depending on the retransmission timers, i.e. for example 31.5 seconds if original retry timer is 500 ms, and retry timer is doubled after each retry, and retry limit is 6 packets) then after that time it knows that host B should have been able to finish ongoing exchanges during that time, thus it is safe to delete IKE SA after that. During that time it can either process the requests or fail them (I.e. it can fail the CREATE_CHILD_SA exchanges trying to create new Child SAs, or it can finish them, but if it finishes them, then it should make sure the Child SAs are moved to new IKE SA before old IKE SA is deleted. > It can delay sending a response until it receives responses to all > outstanding requests. It cannot as that could reach deadlock situation, and would be against the MUST in RFC4306, which says you MUST be able process a request while it has a request outstanding. > It can send a response immediately and conclude > that all outstanding requests will fail. In that case it can restart the > outstanding request on a newer IKE_SA or wait for traffic to require the > creation of a new SA. As the host A might have already processed the outstanding request before it even started the rekey, but the reply was lost, that would mean that the host A and B are out of sync. > > Sending some more suitable error could most likely also work, but > > still the IKE SA cannot be deleted immediately. It can only be deleted > > when ongoing exchanges have been finished. > > > > I have not checked out if your suggested version works with all > > possible combinations of simulatenous rekeys, but from the first look > > it seems it might also work. > > > > On the other hand there is no text indicating such behavior in the > > IKEv2 document, so it is protocol change compared to the old text > > which said that simulatenous rekey is processed by checking out the > > nonces. The rekeys in this case are simulatenous even when Host A > > didn't initially detect that. > > > > Agreed, so we have two possible protocol changes if we need to mandate one > or we could allow implementations solve the problem as they see fit. I > think > my solution is consistent with what is stated in Section 5.11.4 of RFC > 4718. > You are introducing the need to detect a simultaneous rekey after the fact. The RFC4306 says what you need to do when you see simultaneous rekey, and it only gives you one option: Check for the nonces. The rekey is simultaneous, if either end detects it was simultanoues, it is completely possible that other end didn't notice it. Not the that RFC4718 do consider even that case as simultanoues rekey, as given by the 5.11.3 as last example. It does give the N(NO_PROPOSAL_CHOSEN) option for handling that instead of checking for nonces, but I think RFC4718 is in error there, as RFC4306 still says you should use nonces even there. 5.11.4 says the simultaneous rekey is detect in the same way as was done in 5.11.3. And I think the 5.11.4 is also quite wrong there. Remember that RFC4718 is only Information RFC trying to clarify things in the RFC4306, the RFC4306 is still the standard track document which specifies how things are supposed to work. > > > That delay does not have anything to do with simultaneous rekey, it is > > needed to allow the ongoing exchanges to finish before old IKE SA is > > deleted. > > As I said earlier I think the ongoing exchange issue should be documented > separately from the simultaneous rekey case, although I agree there can > be a tie to it if your solution is agreed to. Yes, we need to add text for that in the ikev2bis somewhere. Where do you think it would be best? > > On the other hand RFC4306 specifies exactly ONE way to handle > > simulatenous rekey and that is by checking the nonces. The rekey is > > simulatenous even when one host didn't immediately detect it as > > simulatenous because some packet was lost. > > > > I agree now that "MUST NOT immediately delete" was too strong, so > > "SHOULD NOT immediately delete" is better. If implementation does not > > implement larger window sizes, and is used in environments where there > > is very limited number of CHILD SAs per IKE SA, so the probability of > > getting CREATE_CHILD_SA just when other ends decides to rekey is so > > small, that it does not matter even if the whole IKE SA gets deleted > > in that case then it can ignore that SHOULD. > > I think "SHOULD NOT immediately delete" is still too strong. I think > "MAY delay the deletion to allow ongoing exchanges to complete" is > more appropriate at this point. I think we should encourage people to allow ongoing exchanes to complete in the rekey case, so I think SHOULD is better than MAY. -- kivi...@iki.fi _______________________________________________ IPsec mailing list IPsec@ietf.org https://www.ietf.org/mailman/listinfo/ipsec