我有第二个:
我的公司购买了带有 iOS 应用程序的 VPN 服务器,用于管理与该服务器的 VPN 连接。我需要为 Android 设备编写相同的应用程序。我从来没有在 Android 上使用过 VPN 连接。
在 Swift 代码中有一些操作:
let prtcl = NEVPNProtocolIPSec()
prtcl.username = vpnAcc.vpnAcc
prtcl.passwordReference = keychainService.load(key: "password")
prtcl.serverAddress = vpnAcc.server
prtcl.remoteIdentifier = vpnAcc.remoteID
prtcl.authenticationMethod = NEVPNIKEAuthenticationMethod.sharedSecret
prtcl.sharedSecretReference = keychainService.load(key: "shared")
prtcl.useExtendedAuthentication = true
prtcl.disconnectOnSleep = false
VPN 服务器有:IP、用户名、密码、用于建立连接的 PSK(预共享密钥)。
在 Google 上搜索有关 NEVPNProtocolIPSec 的 Apple 文档后,我发现这是 IPSec IKEv1 VPN 连接。
首先,我尝试在不同版本的设备(11、10 和 7 操作系统版本)上使用 Android 上的内置 VPN 客户端。该客户端位于“设置”-“网络”-“VPN”(在不同设备上可能有所不同)。当我选择添加配置文件时,有一些类型的连接:PPTP、L2TP/IPSec PSK、L2TP/IPSec RSA、IPSec Xauth PSK、IPSec Xauth RSA、IPSec Hybrid RSA、IKEv2/IPSec MSCHAPv2、IKEv2/IPSec PSK、IKEv2/IPSec RSA。
因此,我尝试使用 IPSec Xauth PSK 添加配置文件,在相应字段中输入 IP、用户名、密码和 PSK,但这不起作用,连接未建立。我还尝试了名称中包含“PSK”的所有内容:L2TP/IPSec PSK 和 IKEv2/IPSec PSK。而且还没有结果。
Android 操作系统中的 IPSec 可能有一些限制吗?
我用谷歌搜索了很多次,尝试构建 Strongswan 库,但没有对 IKEv1 连接的 PSK 支持。
我可以做什么来建立 VPN 连接吗?可能我的公司必须将服务器升级到 IKEv2?升级后如何以编程方式建立 VPN 连接?
libreswan 和 Strongswan(均得到积极维护)均获得 GPL 许可,因此 Apple 和 Android 无法将它们用于 IPsec IKEv1 和 IKEv2 实现。相反,Apple 和 Android 使用 ipsec-tools 来实现其 IPsec IKEv1(但不适用于 IKEv2,因为 ipsec-tools 不提供 IKEv2 支持)。
以下内容摘自 NetBSD 的 ipsec-tools README 文件的历史记录部分,该文件位于 : https://github.com/NetBSD/src/tree/trunk/crypto/dist/ipsec-tools我在括号中添加了更多上下文:
Ipsec-tools 最初由 KAME 项目开发。然后它被转移到 SourceForge 上,地址如下: http://ipsec-tools.sourceforge.net/
由于提交访问过于受限,开发陷入停滞,源代码被移至 NetBSD 的 CVS 存储库(2006 年)。
但是,许多发行版仍然从 SourceForge 获取 tarball(仅包含 2014 年之前的 tarball),并且每个发行版都维护本地补丁。-
NetBSD 的 ipsec-tools 似乎是通过查看上述 github 页面中的提交来积极维护的,这与上面的 Ipsec-tools SourceForge 页面不同,该页面指出 开发已于 2014 年被放弃,您不应该使用它并切换到安全替代方案 .
Apple 维护自己的 ipsec-tools 修补版本: https://github.com/apple-oss-distributions/ipsec
Android AOSP 有自己的 ipsec-tools 修补版本: https://android.googlesource.com/platform/external/ipsec-tools/
ipsec-tools 的 Apple 和 Android 分支已经有些偏离,Apple 实现提供了更多 IKEv1 提案,其中包括强大的算法,而 Android 则仅提供现在被认为较弱或损坏的旧算法(MODP1024 及较弱) ,一些较新的 VPN 服务器不再接受。
理想情况下,您应该查看客户端或 VPN 服务器端日志,以获取有关 VPN 连接失败原因的提示。
您可以尝试向 VPN 服务器查询其 IKEv1 算法建议。安装大多数 Linux 发行版提供的
ike-scan
软件包,然后运行以下脚本:
#!/bin/sh
# Encryption algorithms: 3des=5, aes128=7/128, aes192=7/192, aes256=7/256
ENCLIST="5 7/128 7/192 7/256"
# Hash algorithms: md5=1, sha1=2, sha256=5, sha384=6, sha512=7
HASHLIST="1 2 5 6 7"
# Diffie-Hellman groups: 1, 2, 5, 14, 15, 19, 20, 21
GROUPLIST="1 2 5 14 15 19 20 21"
# Authentication method: Preshared Key=1, RSA signatures=3
AUTHLIST="1 3"
for ENC in $ENCLIST; do
for HASH in $HASHLIST; do
for GROUP in $GROUPLIST; do
for AUTH in $AUTHLIST; do
echo ike-scan --trans=$ENC,$HASH,$AUTH,$GROUP -M "$@"
ike-scan --trans=$ENC,$HASH,$AUTH,$GROUP -M "$@"
done
done
done
done
假设上面的脚本已被复制并粘贴到名为
ike-scan.sh
的文件中。要运行该脚本,请在命令行上发出类似以下内容的命令。注意:ike-scan 需要 UDP 端口 500 空闲,这可以通过停止任何正在运行的 IPsec 服务来实现(例如 sudo ipsec stop
)。将下面的 123.54.76.9
替换为您的 VPN 服务器,我们将 grep 查找 SA(即 IPsec 安全关联),这是我们感兴趣的主要内容。
sudo ipsec stop
chmod a+rx ./ike-scan.sh
sudo ./ike-scan.sh 123.54.76.9 | grep SA=
脚本可能需要几分钟才能运行完成,输出应类似于:
SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=2:modp1024 LifeType=Seconds LifeDuration(4)=0x00007080)
SA=(Enc=AES Hash=SHA1 Auth=PSK Group=14:modp2048 KeyLength=128 LifeType=Seconds LifeDuration(4)=0x00007080
如果 VPN 服务器不提供 modp1024,那么您将无法连接 Android 内置 IPsec 实现。