无法使用 Radius 后端连接 Android 原生 IKEv2 VPN 客户端?

无法使用 Radius 后端连接 Android 原生 IKEv2 VPN 客户端?

我可以看到 Android 原生 VPN 客户端支持 IKEv2/MSCHAPv2,因此理论上可以从 Android 连接到 Strongswan VPN 服务器,而无需安装额外的软件(如 Strongswan VPN 客户端)。

然而:在实践中,让它发挥作用并不是那么容易。

我的服务器使用 FreeRadius 作为后端,并且运行良好:

  • iPhone 原生 VPN 客户端
  • Windows 10/11 原生 VPN 客户端
  • 适用于 Android 的 StrongVPN 客户端。

所以我认为强行支持 Android 原生客户端应该很容易,因为上述内容并不难。

但事实证明事情并没有那么简单。

阅读日志以找出所需内容,我发现了这一行:

14[CFG] received proposals: 
IKE:AES_CBC_256/AES_CBC_128/HMAC_SHA2_512_256/HMAC_SHA2_384_192/HMAC_SHA2_256_128/HMAC_SHA1_96/PRF_HMAC_SHA2_512/PRF_HMAC_SHA2_384/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048_256/ECP_384/ECP_256/MODP_2048/MODP_1536,
IKE:AES_GCM_16_256/AES_GCM_16_128/PRF_HMAC_SHA2_512/PRF_HMAC_SHA2_384/PRF_HMAC_SHA2_256/PRF_HMAC_SHA1/MODP_2048_256/ECP_384/ECP_256/MODP_2048/MODP_1536

据我所知,这是 Android 告诉 Strongswan 它支持哪种加密密码。

使用:StrongSwans 密码套件文档我发现我应该提出一个包含以下内容的密码提案:

aes256/aes128sha512/sha384/sha256/sha1prfsha512/prfsha384/prfsha256/prfsha1的组合modp2048s256/ecp384/ecp256/modp2048/modp1536

或者:

aes256gcm16/aes128gcm16prfsha512/prfsha384/prfsha256/prfsha1和的组合modp2048s256/ecp384/ecp256/modp2048/modp1536

这使我想到这个针对 IKE 传输的建议:aes256-sha512-prfsha512-modp2048s256

我的Android配置文件配置如下:

conn-defaults {
    local_addrs = SERVER.IP.ADDRESS

    local {
      auth = pubkey
      certs = example.com-ecdsa.cer
      id = example.com
    }

    version = 2
    send_certreq = no
    send_cert = always
    unique = never
    fragmentation = yes
    encap = yes
    dpd_delay = 60s

    rekey_time = 0s
}

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

eap-android : eap-default {
  remote {
    # Do NOT define eap_id, since Radius won't get triggered on login.
    auth = eap-radius
    id = *@example.com    
  }
}

connections
{
  conn-android : conn-defaults, eap-android {

    children {
      net {
        local_ts = 0.0.0.0/0
      }

      esp_proposals = aes256-sha512-prfsha512-modp2048s256
    }

    pools = IkeVPN-ipv4
    proposals = aes256-sha512-prfsha512-modp2048s256
  }

  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-ipv4
  }

  conn-ios : conn-defaults, eap-defaults {

    local {
      auth = pubkey
      certs = example.com-rsa.cer
      id = example.com
    }

    children {
      net {
        local_ts = 0.0.0.0/0
      }

      esp_proposals = aes256-sha256
    }

    pools = IkeVPN-ipv4
    proposals = aes256-sha256-prfsha256-modp2048
  }
}

pools
{
  IkeVPN-ipv4 {
    addrs = 192.168.201.0/24

    #My DNS server is hosted on another internal net.
    dns = 192.168.200.1
  }
}

关于我的 VPN 服务器上的证书的简要说明。我安装了 2 个 Let's Encrypt 证书。

2048 位 RSA 证书(iPhone 用户使用,因为他们无法连接到 ECDSA 证书?)。

256 位 ECDSA 证书,所有支持 ECDSA 的操作系统都使用该证书。

经过一点点的反复尝试,我找到了该eap-android部分的配置,但从那时起,我有点不知所措。

首先:在配置 Andoid VPN 期间,我很快了解到我必须定义,ipsec identifier尽管我有点不确定它在登录期间用于什么。

我确实注意到,无论我在 中用作值,都会与 部分中的属性ipsec identifier匹配。因此,我只是将内容从复制到 中。idremoteusernameipsec identifier

然而,当我尝试登录 VPN 服务器 Android 原生客户端时,我在日志中看到了以下输出(略有删减):

14[CFG] looking for peer configs matching SERVER.IP.ADDRESS[%any]...CLIENT.IP.ADDRESS[[email protected]]
14[CFG] selected peer config 'conn-android'
14[CFG] sending RADIUS Access-Request to server '192.168.200.1'
14[CFG] received RADIUS Access-Challenge from server '192.168.200.1'
14[IKE] initiating EAP_TTLS method (id 0x01)
14[IKE] peer supports MOBIKE
14[IKE] authentication of 'example.com' (myself) with ECDSA_WITH_SHA256_DER successful
14[IKE] sending end entity cert "CN=EXAMPLE.COM"
14[IKE] sending issuer cert "C=US, O=Let's Encrypt, CN=R3"
14[ENC] generating IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/TTLS ]
14[NET] sending packet: from SERVER.IP.ADDRESS[4500] to CLIENT.IP.ADDRESS[6727] (3056 bytes)
07[NET] received packet: from SERVER.IP.ADDRESS[6727] to CLIENT.IP.ADDRESS[4500] (96 bytes)
07[ENC] parsed INFORMATIONAL request 2 [ N(AUTH_FAILED) ]
07[ENC] generating INFORMATIONAL response 2 [ N(AUTH_FAILED) ]
07[NET] sending packet: from SERVER.IP.ADDRESS[4500] to CLIENT.IP.ADDRESS[6727] (96 bytes)

通过进一步运行 FreeRadius,freeradius -X我发现 Freeradius 收到了用户名并将挑战发送回 VPN 客户端,但它从未收到来自 VPN 客户端对挑战的响应。

有谁知道用户名验证在登录过程中挂断是怎么回事?

更新:

感谢@AryaS 提供的提示adb logcat

这确实让我了解了正在发生的事情。

我通过无线调试连接到我的手机,以下是来自adb logcat -s charon:*

W charon  : 10[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
W charon  : 10[IKE] local host is behind NAT, sending keep alives
W charon  : 10[IKE] remote host is behind NAT
W charon  : 10[IKE] sending cert request for "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
E charon  : 10[IKE] establishing CHILD_SA android{1}
W charon  : 10[ENC] generating IKE_AUTH request 1 [ IDi CERTREQ CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(ADD_6_ADDR) N(ADD_6_ADDR) N(MULT_AUTH) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]
W charon  : 10[NET] sending packet: from 192.168.0.175[56045] to SERVER.IP.ADDRESS[4500] (400 bytes)
W charon  : 11[NET] received packet: from SERVER.IP.ADDRESS[4500] to 192.168.0.175[56045] (2720 bytes)
W charon  : 11[ENC] parsed IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/ID ]
W charon  : 11[IKE] received end entity cert "CN=example.com"
W charon  : 11[IKE] received issuer cert "C=US, O=Let's Encrypt, CN=R3"
W charon  : 11[CFG]   using certificate "CN=example.com"
W charon  : 11[CFG]   using untrusted intermediate certificate "C=US, O=Let's Encrypt, CN=R3"
W charon  : 11[CFG]   using trusted intermediate ca certificate "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
W charon  : 11[CFG] no issuer certificate found for "C=US, O=Internet Security Research Group, CN=ISRG Root X1"
W charon  : 11[CFG]   issuer is "O=Digital Signature Trust Co., CN=DST Root CA X3"
W charon  : 11[IKE] no trusted ECDSA public key found for 'example.com'
W charon  : 11[CFG] closed tun device due to charon will be shutdown
W charon  : 11[CFG] created abort file after scheduled shutdown job
W charon  : 11[ENC] generating INFORMATIONAL request 2 [ N(AUTH_FAILED) ]
W charon  : 11[NET] sending packet: from 192.168.0.175[56045] to SERVER.IP.ADDRESS[4500] (80 bytes)
W charon  : 00[DMN] signal of type SIGTERM received. Shutting down

...所以我想一切都归结为DST Root CA X3Let's Encrypt 的证书不属于我手机的受信任证书列表?

答案1

抱歉,我没有足够的要点来评论,所以我不知道正确的后续方法。我还没有测试 Let's Encrypt,似乎我甚至不应该费心。但你们都说三星 Android charon 确实接受自签名用户 CA 证书,但我的只是在 adb 日志中说它没有找到颁发机构证书,尽管我确信签名颁发机构证书已安装并在 IKE VPN 配置中选择。

相关内容