Hi,

I'm trying to set up my OpenBSD 6.0 box as an L2TP/IPsec server for my
Android phone to connect to. It appears that recent Android versions have a
bug that can prevent it to successfully use HMAC_SHA2_256 for its built-in
L2TP/IPsec VPN client. (Whether the bug occurs seems to depend on the
specifics of the Linux kernel that happens to be used for the device. See
https://code.google.com/p/android/issues/detail?id=196939 for more
information).

I suspect I'm hit by this bug. The isakmpd negotiations seem to work fine,
but npppd doesn't see any traffic. When tcpdumping the external interface
of the OpenBSD box, I see incoming encrypted traffic, but on a
simultaneously running tcpdump on the enc0 interface, I see no traffic at
all. This behavior is consistent with the Android bug description: Android
is requesting a SHA2 HMAC, but it is using a DRAFT version that is
incompatible with the final RFC.

So, to validate that I'm indeed hitting this bug (and also as a workaround)
I tried to set up the OpenBSD side to not use SHA2. I haven't been able to
get this running yet: isakmpd always seems to offer HMAC_SHA2_256.

Here is /etc/ipsec.conf:

ike passive esp transport \
  proto udp from egress to any port 1701 \
  main auth "hmac-sha1" enc "aes" group modp1024 \
  quick auth "hmac-sha1" enc "aes" group modp1024 \
  psk "SHARED_SEEKRIT"

With this configuration, isakmpd still offers HMAC_SHA2_256. See a snippet
of the output of tcpdumping the pcap file created by isakmpd below. The "
ziggo.nl" address is OpenBSD, the "static.kpn.net" address is my Android
phone connected to the cellular network):

15:31:00.865423 static.kpn.net.ipsec-nat-t >
5356F312.cm-6-7d.dynamic.ziggo.nl.isakmp: [bad udp cksum e50! -> 74e4]
udpencap: isakmp v1.0 exchange QUICK_MODE
        cookie: 0f659aa030f4904d->64d8256cce1ec37b msgid: 8281d122 len: 460
        payload: HASH len: 24
        payload: SA len: 336 DOI: 1(IPSEC) situation: IDENTITY_ONLY
            payload: PROPOSAL len: 324 proposal: 1 proto: IPSEC_ESP spisz:
4 xforms: 12 SPI: 0x0a89e2b7
                payload: TRANSFORM len: 28
                    transform: 1 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 256
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA2_256
                payload: TRANSFORM len: 28
                    transform: 2 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 256
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA
                payload: TRANSFORM len: 28
                    transform: 3 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 256
                        attribute AUTHENTICATION_ALGORITHM = HMAC_MD5
                payload: TRANSFORM len: 28
                    transform: 4 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 128
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA2_256
                payload: TRANSFORM len: 28
                    transform: 5 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 128
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA
                payload: TRANSFORM len: 28
                    transform: 6 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 128
                        attribute AUTHENTICATION_ALGORITHM = HMAC_MD5
                payload: TRANSFORM len: 24
                    transform: 7 ID: 3DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA2_256
                payload: TRANSFORM len: 24
                    transform: 8 ID: 3DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA
                payload: TRANSFORM len: 24
                    transform: 9 ID: 3DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_MD5
                payload: TRANSFORM len: 24
                    transform: 10 ID: DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA2_256
                payload: TRANSFORM len: 24
                    transform: 11 ID: DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA
                payload: TRANSFORM len: 24
                    transform: 12 ID: DES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute AUTHENTICATION_ALGORITHM = HMAC_MD5
        payload: NONCE len: 20
        payload: ID len: 12 proto: 17 port: 0 type: IPV4_ADDR =
100.93.193.197
        payload: ID len: 12 proto: 17 port: 1701 type: IPV4_ADDR =
83.86.243.18 [ttl 0] (id 1, len 492)
15:31:00.865689 5356F312.cm-6-7d.dynamic.ziggo.nl.ipsec-nat-t >
static.kpn.net.ipsec-nat-t: [bad udp cksum 9d3a! -> 1d43] udpencap: isakmp
v1.0 exchange QUICK_MODE
        cookie: 0f659aa030f4904d->64d8256cce1ec37b msgid: 8281d122 len: 148
        payload: HASH len: 24
        payload: SA len: 52 DOI: 1(IPSEC) situation: IDENTITY_ONLY
            payload: PROPOSAL len: 40 proposal: 1 proto: IPSEC_ESP spisz: 4
xforms: 1 SPI: 0xacb10a8a
                payload: TRANSFORM len: 28
                    transform: 1 ID: AES
                        attribute LIFE_TYPE = SECONDS
                        attribute LIFE_DURATION = 28800
                        attribute ENCAPSULATION_MODE = UDP_ENCAP_TRANSPORT
                        attribute KEY_LENGTH = 256
                        attribute AUTHENTICATION_ALGORITHM = HMAC_SHA2_256
        payload: NONCE len: 20
        payload: ID len: 12 proto: 17 port: 0 type: IPV4_ADDR =
100.93.193.197
        payload: ID len: 12 proto: 17 port: 1701 type: IPV4_ADDR =
83.86.243.18 [ttl 0] (id 1, len 180)


ipsecctl shows that hmac-sha2-256 is indeed selected:

# ipsecctl -s all
FLOWS:
flow esp in proto udp from 31.161.203.40 to 83.86.243.18 port l2tp peer
31.161.203.40 srcid 83.86.243.18/32 dstid 100.93.193.197/32 type use
flow esp out proto udp from 83.86.243.18 port l2tp to 31.161.203.40 peer
31.161.203.40 srcid 83.86.243.18/32 dstid 100.93.193.197/32 type require

SAD:
esp transport from 83.86.243.18 to 31.161.203.40 spi 0x030ab16e auth
hmac-sha2-256 enc aes-256
esp transport from 31.161.203.40 to 83.86.243.18 spi 0xa31bf5b1 auth
hmac-sha2-256 enc aes-256


Using the FIFO based interface to isakmpd, I verified that HMAC_SHA is
configured:

# get "[Phase 2]:Connections"
# get "[Phase 2]:Passive-Connections"
from-re1=17-to-0.0.0.0/0=17:1701
# get "[from-re1=17-to-0.0.0.0/0=17:1701]:Configuration"
phase2-from-re1=17-to-0.0.0.0/0=17:1701
# get "[phase2-from-re1=17-to-0.0.0.0/0=17:1701]:Suites"
phase2-suite-from-re1=17-to-0.0.0.0/0=17:1701
# get "[phase2-suite-from-re1=17-to-0.0.0.0/0=17:1701]:Protocols"
phase2-protocol-from-re1=17-to-0.0.0.0/0=17:1701
# get "[phase2-protocol-from-re1=17-to-0.0.0.0/0=17:1701]:PROTOCOL_ID"
IPSEC_ESP
# get "[phase2-protocol-from-re1=17-to-0.0.0.0/0=17:1701]:Transforms"
phase2-transform-from-re1=17-to-0.0.0.0/0=17:1701-AES128-SHA-MODP_1024-TRANSPORT
# get
"[phase2-transform-from-re1=17-to-0.0.0.0/0=17:1701-AES128-SHA-MODP_1024-TRANSPORT]:AUTHENTICATION_ALGORITHM"
HMAC_SHA
#

I'm likely to miss something obvious here. Why is isakmpd negotiating
HMAC_SHA2_256 instead of HMAC_SHA, as it is configured to do? Any hints
would be much appreciated.

Thanks,

Jurjen Oskam

Reply via email to