在 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 在网络断开后会自动重连。