Cisco IPsec VPN with strongSwan on Xen VPS

【Update 2012.05.30】 对比起StrongSWAN,我发现用IPSec-Tools/racoon来做IPsec VPN Server能同时支持IKE Phase 1 main mode /aggressive mode,因此不管在iOS,OSX,Windows又或者DD-WRT/Tomato/Openware都可以用,具体步骤可以参考这里:

Pure IPsec VPN with IPsec-Tools/Racoon on CentOS

 

iPhone4s升级到5.1之后,jailbreak不能,Openvpn又不能在iphone上用了,于是,我决定在我的Linode上把Cisco IPsec VPN server也折腾一下,

Google一圈之后,发现在openswan和strongswan这两个option之间,openswan是没有一个比较正常的howto教怎么做的,strongswan的wiki上倒是有一个,于是我决定用strongswan,


以下的运行环境是Linode的Xen VPS,系统为CentOS 5.5


安装的过程其实还是蛮简单的,跟着官方wiki的示例一步一步往下做好了,

http://wiki.strongswan.org/projects/strongswan/wiki/InstallationDocumentation

首先去下载页面 http://download.strongswan.org/ 找到最新的版本(当前是4.6.2),下载

wget http://download.strongswan.org/strongswan-4.6.2.tar.bz2

解压

tar xjvf strongswan-4.6.2.tar.bz2; cd strongswan-4.6.2


编译之前,需要对源代码做一些小小的fix,否则会有连接48分钟后的rekey失败问题,

修正代码的来源在此 https://lists.strongswan.org/pipermail/users/2011-September/006613.html


strongswan-4.6.2/src/pluto/ipsec_doi.c

@@ -977,6 +977,18 @@

 add_pending(dup_any(whack_sock), st, c, policy, 1

 , predecessor == NULL? SOS_NOBODY : predecessor->st_serialno);

 }

+

+/* copy xauth/modecfg data from last isakmp state */

+if (predecessor)

+{

+st->st_xauth.started   = predecessor->st_xauth.started ;

+st->st_xauth.status    = predecessor->st_xauth.status ;

+st->st_modecfg.started = predecessor->st_modecfg.started ;

+DBG(DBG_CONTROL,

+DBG_log(“copy XAUTH/ModeCfg status from #%d”, predecessor->st_serialno)

+)

+        }

+

 if (predecessor == NULL)

 {

 plog(“initiating Main Mode”);

@@ -3137,6 +3149,18 @@

 st->st_doi = ISAKMP_DOI_IPSEC;

 st->st_situation = SIT_IDENTITY_ONLY; /* We only support this */

 

+/* copy xauth/modecfg data from last isakmp state */

+         struct state * predecessor = find_phase1_state(c, ISAKMP_SA_ESTABLISHED_STATES | PHASE1_INITIATOR_STATES);

+         if (predecessor)

+{

+st->st_xauth.started   = predecessor->st_xauth.started ;

+st->st_xauth.status    = predecessor->st_xauth.status ;

+st->st_modecfg.started = predecessor->st_modecfg.started ;

+DBG(DBG_CONTROL,

+DBG_log(“copy XAUTH/ModeCfg status from #%d”, predecessor->st_serialno)

+)

+        }

+

 if ((c->kind == CK_INSTANCE) && (c->spd.that.host_port != pluto_port))

 {

    plog(“responding to Main Mode from unknown peer %s:%u”


另外连接后的banner默认是”Welcome to strongSwan – the Linux VPN Solution!”, 如果看着不顺眼,可以自己改一下,

strongswan-4.6.2/src/pluto/modecfg.c


@@ -44,7 +44,7 @@
 
 #define MAX_XAUTH_TRIES         3
 
-#define DEFAULT_UNITY_BANNER”Welcome to strongSwan – the Linux VPN Solution!\n”
+#define DEFAULT_UNITY_BANNER”YOUR PREFERRED BANNER\n”
 
 /**
  * Creates a modecfg_attribute_t object

编译,有些文章说要enable cisco-quirks,但是貌似wiki上的howto是说不用的,anyway,还是enable吧,并且disable了几个不需要的option,

./configure -prefix=/usr -sysconfdir=/etc –enable-cisco-quirks –enable-openssl –enable-nat-transport –disable-mysql –disable-ldap –disable-static –enable-shared

make

make install


安装完了之后,可以根据wiki上的教程配置,

http://wiki.strongswan.org/projects/strongswan/wiki/IOS_(Apple)

根据wiki,iOS貌似只支持IKEv1,所以以下的配置都是针对IKEv1的,同时相比起证书认证,我还是更喜欢pre-shared key比较多,至少不用到处导入证书什么的,于是我们可以跳过前面的证书生成部分,直接进入配置部分 /etc/ipsec.conf


config setup

        plutostart=yes  #这个是IKEv1对应的守护进程,必须启动

        nat_traversal=yes #启用对NAT穿透的支持



conn IPSec

        keyexchange=ikev1 #使用IKE1v1

        authby=xauthpsk #相对教程用证书认证交换KEY,这里改成xauthpsk改为使用pre-shared key

        xauth=server 

        left=%defaultroute

        leftsubnet=0.0.0.0/0

        leftfirewall=yes

        right=%any

        rightsubnet=10.11.0.0/24 #这里配置客户端可分得的IP地址网段,需跟iptables的配置对应

        rightsourceip=10.11.0.0/24 #相对wiki配置示例的指定单一IP地址,这里同样配置为网段就可以多用户接入了,IP Address Pool要strongswan 4.4以上版本才支持

        pfs=no

        auto=add


配置完ipsec.conf之后,接着需要配置pre-shared key和用户名,密码,配置文件为/etc/ipsec.secrets


: PSK “YOUR RSK HERE” #这里配置PSK,注意前面的冒号是必须的

USERNAME : XAUTH “PASSWORD” #这里配置用户名和密码,中间的冒号也是必须的


最后是在iptables增加对应的策略,编辑 /etc/sysconfig/iptables

1) 允许ISAKMP和IPSec NAT Traversal数据包通过防火墙


-A INPUT -p udp –dport 500 -j ACCEPT #ISAMKP数据包

-A INPUT -p udp –dport 4500 -j ACCEPT #IPSec NAT Traversal数据包

2) NAT地址转换

-A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE #这里的地址就是上面配置中分配给客户端的地址段

3) 数据包转发

-A FORWARD -s 10.11.0.0/24 -j ACCEPT #这里的地址就是上面配置中分配给客户端的地址段


最后重启iptables和ipsec服务即可,

service iptables restart #重启iptables服务

ipsec restart #重启ipsec服务


客户端的配置,

iOS配置时不选择Use Certificate,Group Name留空,其他填入正确内容就好~

IMG_1983


OSX,在网络设置中先添加一个VPN接口,类型为Cisco VPN

System Preferences

然后同样填入相应信息就好

System Preferences-1

14 comments

  1. 你好,我用你的说的方法一步步配下来,手机客户端无法连接到vpn服务器,请问这可能是什么原因呢?
    PS:
    ios版本5.0.1,配置时唯一的区别就是配iptables时-A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE改成了iptables -t nat -A POSTROUTING -o eth0 -s  10.11.0.0 /24 -j SNAT –to x.x.x.x     因为貌似MASQUERADE只能针对动态ip

    1. Hi,

      你可以先试试用命令watch iptables -nvL看看你配置的iptables策略是否有数据活动,例如应该可以看到:

      Chain INPUT (policy DROP 33614 packets, 4512K bytes)

      2070 739K ACCEPT udp — * * 0.0.0.0/0 0.0.0.0/0 udp dpt:500
      6291K 2668M ACCEPT udp — * * 0.0.0.0/0 0.0.0.0/0 udp dpt:4500

      Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

      8853 631K ACCEPT all — * * 10.10.0.0/24 0.0.0.0/0
      333 24151 ACCEPT all — * * 10.11.0.0/24 0.0.0.0/0

    1. 可以的亲,android上装个vpnc widget就可以鸟(其实也是vpnc,只不过加了个配置的GUI和widget启动而已),

      对了,系统必须有tun.ko,如果你在用cyanogenmod的话是自带的~

  2. 谢谢博主分享,按教程搞定了,不过
    iptables -A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE
    这行我这里出错,我改用了
    iptables -t nat -A POSTROUTING -s 10.11.0.0/24 -o eth0 -j MASQUERADE

    另,按strongswan官网教程,需要在/etc/strongswan.conf里添加dns,比如
    pluto {
    dns1 = 8.8.8.8
    }
    还有,需要修改/etc/sysctl.conf文件里的net.ipv4.ip_forward=1,否则我的iphone 4S连上VPN后却无法访问互联网。

  3. 编译安装了strongswan5.0.4,/etc下根本没有ipsec.secrets文件,而且ipsec.conf文件内容也和文中完全不同。求如何使用啊!!! 本人DO的VPS,使用CentOS.

    1. 没有新建一个就行了…
      如果你的strongswan在/usr/local/下,那么ipsec.secrets就要放在/usr/local/etc/下(我debian上编译安装就5.0.4是这样)
      如果你的strongswan在/etc/strongswan/下,那么ipsec.secrets就要放在/etc/strongswan/下,(我centos epel-testing安装的5.0.4是这样)
      这篇文章是strongswan 4的配置与5的配置有些区别,具体还是请自己去看wiki吧…

  4. 你好,我用strongSwan安装在linode centos上,win/win phone8.1/iphone都能连接上,但就是不能访问网页,IP可以,是不是DNS配置问题。我已经在strongswan.conf 上添加dns1 dns2 nbns1 nbns2了还是不可以。

Leave a Reply

Your email address will not be published.