On Tue, Jun 09, 2020 at 08:13:53PM +0000, Leclerc, Sebastien wrote:
> > > > Before 6.7 iked didn't start DPD in this particular case.
> > > > It kicks in if the tunnel is up and there haven't been any incoming ESP
> > > > packets
> > > > in the last 5 minutes.
> > > > A possible workaround would be to ping through the tunnel to have at
> > > > least one
> > > > incoming packet every 5 minutes.
> > >
> > > There is definitely ESP packets continuously, as there are 3-8 RDP
> > > sessions
> > > in this tunnel during workhours. That's why it's a problem, people get
> > > their
> > > RDP session disconnected every 8 minutes.
> > >
> >
> > If true that would certainly be a bug.
> > Could you try running iked with -dvv and look for ikev2_ike_sa_alive
> > messages?
> > It should look like this:
> >
> > ikev2_ike_sa_alive: incoming CHILD SA spi 0x88888888 last used 0 second(s)
> > ago
>
> spi=0x09ce404cdca4ee1d: ikev2_childsa_enable: loaded SPIs: 0x4cd06b6d,
> 0x0e7dbe7d
> spi=0x09ce404cdca4ee1d: ikev2_childsa_enable: loaded flows:
> ESP-192.168.1.0/24=192.168.100.0/24(0),
> ESP-192.168.1.0/24=192.168.150.0/24(0), ESP-192.0.2.2/32=192.0.2.199/32(0)
> spi=0x09ce404cdca4ee1d: sa_state: VALID -> ESTABLISHED from 192.0.2.199:500
> to 192.0.2.2:500 policy 'POLICYNAME'
> spi=0x09ce404cdca4ee1d: established peer 192.0.2.199:500[IPV4/192.0.2.199]
> local 192.0.2.2:500[IPV4/192.0.2.2] policy 'POLICYNAME' as initiator
> ...
> ikev2_ike_sa_alive: incoming CHILD SA spi 0x0e7dbe7d last used 1 second(s) ago
>
> I don't see the ikev2_ike_sa_alive message for the other SPI (0x4cd06b6d), is
> it normal?
This is normal.
> And then it doesn't reply back :
>
> ikev2_ike_sa_alive: IKE SA 0xed2d646c000 ispi 0x09ce404cdca4ee1d rspi
> 0x714a5bb2f7ccc4d4 last received 300 second(s) ago
> ikev2_ike_sa_alive: sending alive check
> ikev2_msg_encrypt: decrypted length 4
> ikev2_msg_encrypt: padded length 16
> ikev2_msg_encrypt: length 5, padding 11, output length 44
> ikev2_next_payload: length 48 nextpayload NONE
> ikev2_msg_integr: message length 76
> ikev2_msg_integr: integrity checksum length 12
> ikev2_pld_parse: header ispi 0x09ce404cdca4ee1d rspi 0x714a5bb2f7ccc4d4
> nextpayload SK version 0x20 exchange INFORMATIONAL flags 0x08 msgid 2 length
> 76 response 0
> ikev2_pld_payloads: payload SK nextpayload NONE critical 0x00 length 48
> ikev2_msg_decrypt: IV length 16
> ikev2_msg_decrypt: encrypted payload length 16
> ikev2_msg_decrypt: integrity checksum length 12
> ikev2_msg_decrypt: integrity check succeeded
> ikev2_msg_decrypt: decrypted payload length 16/16 padding 11
> spi=0x09ce404cdca4ee1d: send INFORMATIONAL req 2 peer 192.0.2.199:500 local
> 192.0.2.2:500, 76 bytes
> ...
> spi=0x09ce404cdca4ee1d: retransmit 1 INFORMATIONAL req 2 peer 192.0.2.199:500
> local 192.0.2.2:500
> ...
> spi=0x09ce404cdca4ee1d: retransmit 2 INFORMATIONAL req 2 peer 192.0.2.199:500
> local 192.0.2.2:500
> spi=0x09ce404cdca4ee1d: retransmit 3 INFORMATIONAL req 2 peer 192.0.2.199:500
> local 192.0.2.2:500
> spi=0x09ce404cdca4ee1d: retransmit 4 INFORMATIONAL req 2 peer 192.0.2.199:500
> local 192.0.2.2:500
> ...
> ikev2_ike_sa_alive: IKE SA 0xed2d646c000 ispi 0x09ce404cdca4ee1d rspi
> 0x714a5bb2f7ccc4d4 last received 360 second(s) ago
> ...
> spi=0x09ce404cdca4ee1d: retransmit 5 INFORMATIONAL req 2 peer 192.0.2.199:500
> local 192.0.2.2:500
> ...
> ikev2_ike_sa_alive: IKE SA 0xed2d646c000 ispi 0x09ce404cdca4ee1d rspi
> 0x714a5bb2f7ccc4d4 last received 420 second(s) ago
> ...
> ikev2_msg_retransmit_timeout: retransmit limit reached for req 2
> spi=0x09ce404cdca4ee1d: sa_free: retransmit limit reached
> config_free_proposals: free 0xed2a4156f80
> config_free_proposals: free 0xed2a4156180
> config_free_childsas: free 0xed2c6179700
> config_free_childsas: free 0xed275c07400
> config_free_childsas: free 0xed33fcbba00
> config_free_childsas: free 0xed2c6177200
> sa_free_flows: free 0xed247848800
> sa_free_flows: free 0xed2b3308800
> sa_free_flows: free 0xed2e78cfc00
> sa_free_flows: free 0xed247849800
> sa_free_flows: free 0xed2e78cf000
> sa_free_flows: free 0xed247848c00
>
>
> > "ipsecctl -sa -v" shows you SA packet counters, if you find one that has
> > 0 input packets that's probably the cause.
>
> All SAs have packet counters > 0, see those for this tunnel :
>
> esp tunnel from 192.0.2.2 to 192.0.2.199 spi 0x4cd06b6a auth hmac-sha1 enc aes
> sa: spi 0x4cd06b6a auth hmac-sha1 enc aes
> state mature replay 64 flags 0x4<tunnel>
> lifetime_cur: alloc 0 bytes 501965 add 1591730080 first 1591730081
> lifetime_hard: alloc 0 bytes 536870912 add 10800 first 0
> lifetime_soft: alloc 0 bytes 497679335 add 10011 first 0
> address_src: 192.0.2.2
> address_dst: 192.0.2.199
> identity_src: type prefix id 0: IPV4/192.0.2.2
> identity_dst: type prefix id 0: IPV4/192.0.2.199
> lifetime_lastuse: alloc 0 bytes 0 add 0 first 1591730260
> counter:
> 1557 output packets
> 601368 output bytes
> 533105 output bytes, uncompressed
>
> esp tunnel from 192.0.2.199 to 192.0.2.2 spi 0xa2f3ce44 auth hmac-sha1 enc aes
> sa: spi 0xa2f3ce44 auth hmac-sha1 enc aes
> state mature replay 64 flags 0x4<tunnel>
> lifetime_cur: alloc 0 bytes 308016 add 1591730080 first 1591730081
> lifetime_hard: alloc 0 bytes 536870912 add 10800 first 0
> lifetime_soft: alloc 0 bytes 461708984 add 9288 first 0
> address_src: 192.0.2.199
> address_dst: 192.0.2.2
> identity_src: type prefix id 0: IPV4/192.0.2.199
> identity_dst: type prefix id 0: IPV4/192.0.2.2
> lifetime_lastuse: alloc 0 bytes 0 add 0 first 1591730260
> counter:
> 1555 input packets
> 703112 input bytes
> 323408 input bytes, decompressed
>
I seems I got it wrong before. Even when there was ESP traffic, iked is going
to start DPD when there hasn't been any incoming IKE message in the last
5 minutes.
My advice would be to just disable DPD in iked for this specific case.
To do this you will have to patch it and build it from the sources.
Below is a diff that should do the trick.
Index: ikev2.c
===================================================================
RCS file: /cvs/src/sbin/iked/ikev2.c,v
retrieving revision 1.231
diff -u -p -r1.231 ikev2.c
--- ikev2.c 9 Jun 2020 21:53:26 -0000 1.231
+++ ikev2.c 10 Jun 2020 11:02:39 -0000
@@ -4391,7 +4391,7 @@ ikev2_ike_sa_alive(struct iked *env, voi
* SA, or if we haven't received an IKE message. but only if we
* are not already waiting for an answer.
*/
- if (((!foundin && foundout) || ikeidle) &&
+ if ((!foundin && foundout) &&
(sa->sa_stateflags & (IKED_REQ_CHILDSA|IKED_REQ_INF)) == 0) {
log_debug("%s: sending alive check", __func__);
ikev2_send_ike_e(env, sa, NULL, IKEV2_PAYLOAD_NONE,