使用strongSwan搭建IPSec VPN for iOS

2011年10月4日 | 分类: 翻墙相关 | 标签: , , ,

一直困扰我的VPN问题终于得到了完美的解决,我终于可以“安全的”无墙了!期间也在网络上找了很多文章,看了很多人的Blog和FAQ,终于解决 了iOS的Cisco VPN(IPSec VPN)问题。经验一定要分享,下面我会把如何搭建和配置Cisco VPN的过程做个详细的介绍。
还是先说一下iOS设备的一些限制,也就是为啥非要选用Cisco VPN:
1. iOS设备如果不越狱,支持的VPN有PPTP, L2TP, Cisco VPN, Cisco AnyConnect和Juniper的Junos Pulse。如果越狱就可以使用openVPN。
2. PPTP已经被GFW给block了,很多人都在使用L2TP,L2TP支持标准的安全特性CHAP和PAP,可以进行用户身份认证。在安全性考虑上,L2TP仅定义了控制消息的加密传输方式,对传输中的数据并不加密。不安全,不考虑。
3. Cisco AnyConnect需要连接Cisco的Router,ASA或者PIX设备,Junos Pulse需要连接Juniper的SA系列VPN产品。这都需要花钱买,都很贵的,不考虑。
4. 有人会问了,openVPN也是一个选择啊。对,没错,但是iOS设备安装openVPN Client需要越狱。这点是我不能接受的。不考虑。
5. 剩下唯一的解决方案就是找到一个软件,能够支持Cisco VPN Client。
感谢google的强大,终于找到了一款opensource的软件strongSwan。strongSwan可以支持Cisco VPN Client,而且在其官方网页上居然给出了配置方法,很详细,详情请见这里。不得不说strongSwan为我们GFW内的人们做了一件大好事儿啊。
我这里给出的配置步骤是根据官方网站的文档和我自己配置过程中的一些体会结合而成,不多说了,开始配吧!
1. 首先要在无墙国家有一台主机(总要有个连接点吧,要不连到哪儿去呢?跟谁建VPN呢?)。我选择的是linode,一个评价相当高的VPS服务提供商。如果大家也选择这里作为您的VPN Server,请从这里注册,因为是我推荐的哦,如果您follow我的link注册成功,并且使用满90天,linode就能够赠送我$20,也就是一个月的使用期。嘻嘻。我的推荐码:2d244ab3d3fe4d033eb494266b87dc7fbb046407
2. 选用操作系统,我选的是Ubuntu。Centos我的一个同事也测试过,没问题。
3. 下载strongSwan:

* wget http://download.strongswan.org/strongswan-4.5.2.tar.bz2
* tar jxvf strongswan-4.5.2.tar.bz2.1.
* cd strongswan-4.5.2

4. 编译,安装strongSwan:

* ./configure –prefix=/usr –sysconfdir=/etc –libexecdir=/usr/lib –with-ipsecdir=/usr/lib/strongswan –enable-cisco-quirks –enable-openssl –enable-nat-transport –disable-mysql –disable-ldap –disable-static –enable-shared
* 这里–enable-cisco-quirks和 –enable-nat-transport非常关键,必须的!
* make
* make install

5. 生成CA证书:

* ipsec pki –gen –outform pem > caKey.pem
* ipsec pki –self –in caKey.pem –dn “C=CN, O=test, CN=Test CA” –ca –outform pem > caCert.pem

6. 生成Server端证书:

* ipsec pki –gen –outform pem > serverKey.pem
* ipsec pki –pub –in serverKey.pem | ipsec pki –issue –cacert caCert.pem –cakey caKey.pem –dn “C=CN, O=test, CN=vpn.test.com” –flag serverAuth –outform pem > serverCert.pem

7. 生成Client端证书:

* ipsec pki –gen –outform pem > clientKey.pem
* ipsec pki –pub –in clientKey.pem | ipsec pki –issue –cacert caCert.pem –cakey caKey.pem –dn “C=CN, O=test, CN=client” –outform pem > clientCert.pem

8. 将CA证书转换为.cer格式,将Client证书转换为.p12格式(解释一下原因,这里转换的这两个证书都是要安装在iOS设备上的,iOS设备也能 够支持pem格式的,但是有些朋友使用pem格式的导入iOS设备时出了一些问题,所以为了保险起见,还是cer的吧。Client的.p12格式是因为 p12格式的可以即包含key,也包含证书文件,为了方便,省得导入两个文件了)

* openssl x509 –inform PEM –outform DER –in caCert.pem –out caCert.cer
* openssl pkcs12 -export -inkey clientKey.pem -in clientCert.pem -name “client” -certfile caCert.pem -caname “Test CA” -out clientCert.p12

9. Copy生成的key和证书文件到相应的目录:

* cp caCert.pem /etc/ipsec.d/cacerts/
* cp serverCert.pem /etc/ipsec.d/certs/
* cp serverKey.pem /etc/ipsec.d/private/
* cp clientCert.pem /etc/ipsec.d/certs/
* cp clientKey.pem /etc/ipsec.d/private/

10. 配置/etc/ipsec.conf文件
config setup
plutostart=yes
nat_traversal=yes

conn ios
keyexchange=ikev1
authby=xauthrsasig
xauth=server
left=%defaultroute
leftsubnet=0.0.0.0/0
leftfirewall=yes
leftcert=serverCert.pem
right=%any
rightsubnet=10.0.0.0/24 (VPN连接后分配给iOS设备的地址所在网段)
rightsourceip=10.0.0.2
rightcert=clientCert.pem
pfs=no
auto=add
11. 创建ipsec.secrets文件 /etc/ipsec.secrets,并编辑:
# /etc/ipsec.secrets – strongSwan IPsec secrets file

: RSA serverKey.pem (Server的Key文件)
test : XAUTH “password” (test为用户名,password为密码,这里的密码一定要用“”引起来)
12. 配置/etc/strongswan.conf文件,需要分配一个没有任何污染的DSN给VPN连接成功的iOS设备:
# /etc/strongswan.conf – strongSwan configuration file

charon {
# …
}

pluto {
dns1 = 8.8.8.8 (google的DNS,google又做的一件好事儿!)
}
13. 配置iOS设备:
将生成的caCert.cer和clientCert.p12通过邮件的方式或者通过web方式下载到iOS设备上,并进行证书安装。
选择 Settings 选择 General > Network > VPN > Add VPN Configuration
选中IPSec VPN
description用来标识你的vpn的,没有特别的限制
Server一定要填入签发Server端证书时,输入的“CN=vpn.test.com”的=后的部分,即vpn.test.com。如果不一致,iOS设备会报错,Server验证失败。
Account填入ipsec.secrets的用户名
Password填入ipsec.secrects的密码
切换Use Certificate到on,并选择导入和Clent的证书
14. VPN连接:
在Settings > VPN下,将 VPN 切换到 ON 开始进行IPSec VPN的协商和连接。
连接好后,会给出一个Notification“Welcome to strongSwan – the Linux VPN Soluution!”。看到该notificatio后,恭喜你,连接成功了!!
BTW:我顺便说一下iptables的配置:
1. strongSwan用到的端口就是UDP 500和4500,所以在iptables的filter表的INPUT 链要加入允许UDP 500和4500进入,即:

-A INPUT -p udp –dport 500 -j ACCEPT
-A INPUT -p udp –dport 4500 -j ACCEPT
2. 大家使用VPN的主要目的是为了访问大量的信息,所以需要配置NAT,具体配置如下:
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
3. 需要配置filter表的Forward链:
-A FORWARD -s 10.0.0.0/24 -j ACCEPT
大功告成!
大家可以安全放心的使用VPN啦!经我的测试,WIFI通过NAT Router连接和GPRS连接都没问题。联通的网络我没有试过,如果有试过的请告知大家结果。谢谢!
如果大家在配置过程中有问题可以DM我@henrywangxf,也可以comment,我有时间一定

原文http://www.xxqww.com/?p=22

  1. Ruby
    2011年10月6日03:35

    泪流满面….作为一个newbie….真痛苦…
    作者在安装strongswan之前编译内容有误….具体可参考官网….所有 “–”都被省略成了-…而且最好每条编译前都先加上一个.configure比较好….
    也许不是有误….只是centos不接受这个命令….ubantu也许可以?
    我是linux纯小白,拍砖请轻一点….

  2. Ruby
    2011年10月5日11:55

    不苟同 :“PPTP已经被GFW给block了”
    不会吧,我的iphone上有5个速度很不错的pptp可随时用
    “iOS设备安装openVPN Client需要越狱。这点是我不能接受的”
    这个嘛,如果是用iphone和ipad的,越狱应该不是什么不能接受的,甚至有时候会反过来
    这个原作者的观点有点与众不同

    楼上这位仁兄的意见个人才不敢苟同呢
    99%的人越狱只是因为习惯了一直以来的免费而已
    不过,免费是好事?
    啊,对啊,你看,几百刀的windows我们随便用呢….

    殊不知,正是这样的想法导致了当下国内it业少创新并远远落后于美国甚至印度的现状….
    对此,我只想说,滚丫的蛋!
    PS:以上仅指越狱只为免费,同时叫嚣推崇盗版无罪盗版有理的渣们…
    ——————————————————————
    激动了,打错了,先前那条评论如果可以的话,辛苦博主删除一下…..

  3. 不苟同
    2011年10月4日23:36

    “PPTP已经被GFW给block了”
    不会吧,我的iphone上有5个速度很不错的pptp可随时用
    “iOS设备安装openVPN Client需要越狱。这点是我不能接受的”
    这个嘛,如果是用iphone和ipad的,越狱应该不是什么不能接受的,甚至有时候会反过来

    这个原作者的观点有点与众不同

    • iGFW
      2011年10月5日11:07

      他大概是指前些时候有人在推特上说PPTP很容易被GFW破解解密的事情吧,不过pptp的确不太安全,也很容易被移动运营商封锁。