在 Ubuntu 服务器搭建 IKEv2 VPN 的纪要
参考的是 DigitalOcean 的这一篇教程 How to Set Up an IKEv2 VPN Server with StrongSwan on Ubuntu 22.04,(可以在 Debian 10/11/12 或者 Ubuntu 20/22/24 安装)但是实际安装过程中有如下问题。
1. TPM 报错
在经过精简版本的机器(比如 bwg 的机器)上运行
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
会得到如下错误
TPM 2.0 - could not load "libtss2-tcti-tabrmd.so.0" plugin 'tpm': failed to load - tpm_plugin_create returned NULL
根据 Claude 的解答,我安装了TPM库:
sudo apt-get update sudo apt-get install libtss2-tcti-tabrmd0
重新运行命令即可。
2. 加密算法与多平台支持
在根据上述教程安装 IKEv2 VPN 以后,我发现虽然在 Windows 设备可以连接,但是在 iOS 设备连接时会失败(无提示,toggle 刚开就关掉了)。
在 /etc/ipsec.conf 这一路径可以看到 IPSec 配置文件,当中包含以下两行,规定了加密和认证算法,
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
这两行最后的 ! 代表“感叹号后面的任何算法都不会被使用,即使对方提议使用它们。”Claude 建议我改为
ike=aes256-sha256-modp2048,aes128-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048 esp=aes256-sha256,aes128-sha256,aes256-sha1,aes128-sha1
这样改了以后,iOS 是可以连接了,但是 Windows 又不能连接了。最后我把这两行这样改,iOS 和 Windows 都能够正常连接。
ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,aes256-sha256-modp2048,aes128-sha256-modp2048,aes256-sha1-modp2048,aes128-sha1-modp2048,3des-sha1-modp1024! esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
修改以后需要运行这个命令让更动生效。
sudo systemctl restart strongswan-starter
3. ipsec.conf 配置文件的其他选项
在上述教程中,数据包压缩默认关闭
compress=no
询问 Claude 以后,得知这个选项会使用机器的 CPU 压缩数据包以后再传输,会节省网络带宽。可以尝试开启。
compress=yes
Claude 同时建议在国际出口拥堵的地方加入如下配置选项,
- 增加 DPD(Dead Peer Detection)检查频率,以更快地检测和处理连接问题:
dpddelay=30s dpdtimeout=60s dpdaction=restart
- 启用 TCP encapsulation,可能有助于穿透某些网络限制:
forceencaps=yes
- 调整 MTU 大小,避免分片:
mtu=1400
修改以后需要运行这个命令让更动生效。
sudo systemctl restart strongswan-starter
4. 创建 .mobileconfig 文件供 iOS 一键配置
普通的客户端配置方式是,先把 ca-cert.pem 作为受信任的根证书导入到系统(无论是 iOS 还是 Windows),用于验证服务器,之后再按照“用户名/密码”的方式做客户端验证。
对于 iOS 设备,可以使用 iMazing 的免费软件 Profile Editor 创建一个移动电话配置文件发送到 iOS 设备,只要点击一下就可以作为配置文件在设置 app 里面安装。还有好处是可以配置“按需求使用”让连接断开自动重连。
Profile Editor 可以在这里下载到,支持 Windows 和 macOS 系统。
软件当中选择 VPN 并输入 identifier(也就是 IP 地址或者主机域名)和协议(IKEv2)以后,把 Authentication Moethod 设置为“None”并勾选 Enable EAP-only authentication(如果不选的话,iOS 会问你要预共享密钥,而我们不是用这个做验证的),之后再输入用户名和密码。保存即可。
如果想加入“On Demand”即按需求连接(可以在开启情况下自动重连),可以在配置文件“IKEv2”key 之下<dict>里面重开一行加入,
<key>OnDemandEnabled</key> <integer>0</integer> <key>OnDemandRules</key> <array> <dict> <key>Action</key> <string>Connect</string> </dict> </array>
这样安装的 VPN 在点入以后会看到一个 toggle 叫做“按需求连接”。由于并没有设置按需求连接的规则(只规定了动作“连接”),在 toggle 开启的情况下,VPN 在网络断开后会自动重连。
Reply