OpenVZ上使用IPSec

OpenVZ核心在042stab084.8及以后的版本可以在container内部使用IPSec。提供IPSec支持的OpenVZ VPS商家不是很多,所以如果打算在OpenVZ上搭建VPN使用IKEv1/IKEv2的话请务必先咨询服务商,并且要使用IPSec的话需要container内部的系统是x64(与host的架构一致)。

Ubuntu 14.04的Strongswan里面带有kernel-libipsec插件,理论上凭借这个加上合适的OpenVZ平台就可以使用IKEv1了。然而由于源代码里面的一个疏忽(debian/rules里面dh_install的选项-Xlibstrongswan-kernel不拷贝安装的内核插件,而很不幸地kernel-libipsec正好是内核插件),实际提供的二进制包libstrongswan-kernel-libipsec里面没有提供/usr/lib/ipsec/plugins/libstrongswan-kernel-libipsec.so这个文件,因而无法使用kernel-libipsec

解决办法很简单,用apt-get把源代码下回来,./configure --enable-kernel-libipsec && make之后能在src/libcharon/plugins/kernel_libipsec/.libs/里面找到编译好的libstrongswan-kernel-libipsec.so,拷到/usr/lib/ipsec/plugins/即可。 不过目前似乎kernel-libipsec与L2TP有冲突,即使L2TP设置了type=tunnel也没用,log里面会提示IPsec SA: unsupported mode

更新:在bug tracker里面询问了开发者,libipsec只支持tunnel模式,而iOS和Windows自带的L2TP/IPSec客户端都只支持transport,并且strongswan如果收到客户端请求使用transport模式的话会自动转为transport,忽略掉设定里面的type=tunnel