由于OpenVZ的限制以前使用Racoon和xl2tpd组合的方式无法在这类VPS使用,只好购买价格更贵的Xen的。开源的世界总是三十年河东,三十年河西, 从Openswan到Racoon, 现在轮到Strongswan了。得益于灵活的插件体系结构,Strongswan具备良好的扩展性, 架设一个L2TP/IPSec的服务器你再也不需要其他的组件,Strongswan就一站式提供了。 尤其是kernel-libipsec 插件使得在OpenVZ这样的受限的VPS上也能轻松的使用L2TP/IPec了, 一般的IPSec/IKE实现都要在kernel的IPsec stack中实现,libipsec提供另一种实现方式, 即利用TUN设备,Strongswan的守护程序在收到ESP的UDP包后,通过libipsec进行解密,解密后的明文注入到TUN设备来实现网络连接。

大概了解了基本原理,下面就开始动手安装吧,首先记得去VPS的控制面板下启用TUN/TAP设备, 安装过程稍微有点麻烦,首先需要最新的Strongswan(5.1.3)版本,各发行版不一定有最新的版本, 所以需要手动编译。这里简单说一下在CentOS 6 上的安装, 我习惯用yum 编译安装.

编译安装

# rpm -ivh http://mirror.es.its.nyu.edu/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm install yum-utils
$ yumdownloader --source strongswan
$ rpm -ivh strongswan-5.1.3-1.el6.src.rpm

修改 rpmbuild/SPECS/strongswan.spec , diff 如下:

--- rpmbuild/SPECS/strongswan.spec.bak	2014-04-15 11:20:24.000000000 +0400
+++ rpmbuild/SPECS/strongswan.spec	2014-06-29 12:21:20.061817133 +0400
@@ -129,7 +129,8 @@
     --enable-eap-radius \
     --enable-curl \
     --enable-eap-identity \
-    --enable-cmd
+    --enable-cmd \
+    --enable-kernel-libipsec
 make %{?_smp_mflags}
 
 %install
@@ -204,6 +205,8 @@
 %{_libdir}/%{name}/libtls.so.0.0.0
 %{_libdir}/%{name}/libpttls.so.0
 %{_libdir}/%{name}/libpttls.so.0.0.0
+%{_libdir}/%{name}/libipsec.so.0
+%{_libdir}/%{name}/libipsec.so.0.0.0
 %{_libdir}/%{name}/lib%{name}.so.0
 %{_libdir}/%{name}/lib%{name}.so.0.0.0
 %dir %{_libdir}/%{name}/plugins
@@ -252,6 +255,7 @@
 %{_libdir}/%{name}/plugins/lib%{name}-dhcp.so
 %{_libdir}/%{name}/plugins/lib%{name}-curl.so
 %{_libdir}/%{name}/plugins/lib%{name}-eap-identity.so
+%{_libdir}/%{name}/plugins/lib%{name}-kernel-libipsec.so
 %dir %{_libexecdir}/%{name}
 %{_libexecdir}/%{name}/_copyright
 %{_libexecdir}/%{name}/_updown
@@ -335,6 +339,7 @@
 %{_sysconfdir}/%{name}/%{name}.d/charon/xauth-generic.conf
 %{_sysconfdir}/%{name}/%{name}.d/charon/xauth-pam.conf
 %{_sysconfdir}/%{name}/%{name}.d/charon/xcbc.conf
+%{_sysconfdir}/%{name}/%{name}.d/charon/kernel-libipsec.conf
 %{_sysconfdir}/%{name}/%{name}.d/imcv.conf
 %{_sysconfdir}/%{name}/%{name}.d/pacman.conf
 %{_sysconfdir}/%{name}/%{name}.d/starter.conf
@@ -397,6 +402,7 @@
 %{_datadir}/%{name}/templates/config/plugins/xauth-generic.conf
 %{_datadir}/%{name}/templates/config/plugins/xauth-pam.conf
 %{_datadir}/%{name}/templates/config/plugins/xcbc.conf
+%{_datadir}/%{name}/templates/config/plugins/kernel-libipsec.conf
 %{_datadir}/%{name}/templates/config/%{name}.conf
 %{_datadir}/%{name}/templates/config/%{name}.d/attest.conf
 %{_datadir}/%{name}/templates/config/%{name}.d/charon-logging.conf

修改完之后进行打包和安装

  $ rpmbuild -bb rpmbuild/SPECS/strongswan.spec
  # rpm -ivh rpmbuild/RPMS/i686/strongswan-5.1.3-1.el6.i686.rpm 

配置

这里的设置使用PSK+Xauth的认证方式

/etc/strongswan/ipsec.conf

config setup
	# strictcrlpolicy=yes
	# uniqueids = no
        # charondebug="ike 1, chd 1, knl 1, cfg 0"

conn %default
	ikelifetime=24h
	keylife=8h
	rekeymargin=3m
	keyingtries=1
        fragmentation=yes
        left=%defaultroute
        leftsubnet=0.0.0.0/0

conn nat-t 
        right=%any
        rightsourceip=10.8.0.0/24
        leftauth=psk
        rightauth=psk
        rightauth2=xauth
        auto=add

/etc/strongswan/ipsec.secrets

 : PSK 'mypsk'    #预共享密钥

username : XAUTH "password"  #用户名和密码

/etc/strongswan/strongswan.d/charon.conf

    ...
    #这里省略了其他的默认配置, 指定DNS服务器
    dns1=8.8.8.8
    dns2=8.8.4.4
    ...

启动服务

 # service strongswan start

配置转发和SNAT

启用转发

  # vi /etc/sysctl.conf # 修改 net.ipv4.ip_forward = 1
  # sysctl -p

启用SNAT

  # iptables -t nat -A POSTROUTING -j SANT --to-source a.b.c.d # VPS的外部IP地址

客户端配置

Android手机: VPN 配置类型中选择IPSec Xautu PSK, 预共享密钥和用户名密码为/etc/strongswan/ipsec.secrets中的设置

Mac OSX: VPN类型选用CISCO IPSEC, 预共享密钥和用户名密码同上,群组名称记得留空