Ubuntu14.04 搭建 Cisco IPsec VPN

背景

现在PPTP-VPN已经不安全了,虽然搭建PPTP服务很简单,安全对于我们一般用户来说也不说很在意,但是比较麻烦的是MAC OSX以及IOS的最新版本已经强制将PPTP服务从系统中移除,无法使用之前便捷的VPN服务,因此搭建一个新一代安全的VPN服务还是很有必要的。

L2TP/IPsec VPN的问题

其实一开始的时候,我是打算搭建L2TP服务器的。就个人了解来说,这个用的还比较广,听得比较多,自然认为搭建比较简单,也找到了一些很官方的教程,但是接下来一堆坑就出现了。

搭建到一半,IPsec的验证就失败,在百度上查询相应的错误,得知是缺少必要的软件包。 不过我安装了之后依旧无法通过验证,网上也没找到相关的配置教程(可能是不同电脑不一样)。最后发现配置一下软件包rng-tool,将/etc/default/rng-tools的配置改成HRNGDEVICE=/dev/urandom才能正常通过验证。成功搭建完毕后,搭建好的VPN无法成功启动,具体原因是我的系统是Ubuntu14.04的,教程是为12.04设计的,相应的软件包版本不一样,而且Ubuntu 14.04里面的默认源里面的openswan貌似还有BUG,于是乎进一步在Github上找到了这个问题,更改了一下配置才解决该问题。

终于可以连接后,我发现只有WINDOWS可以100%成功链接,我的安卓机子一个可以连接(MIUI8 ANDROID 5.1),一个不行(MIUI8 ANDROID 6.0),这个问题不止我一个人遇到,可以参考这里。搭建好后拿室友的Iphone测试了一下可以连接,结果当我女朋友想用她的手机连接的时候又不知道怎么就挂了,再次拿室友的Iphone测试,竟然也不行了。

总之,L2TP部署中遇到太多的坑了,于是去网上了解了一下别的VPN,发现IPsec非常符合我的要求,因为我的主要目的就是为我女朋友(苹果系列,不支持PPTP)搭建一个可以使用的VPN服务器。

IPsec部署 – MAC OSX, IOS, ANDROID

如果你部署的服务器仅仅想提供给安卓,苹果以及MAC用户使用的话,那其实还是很简单的,因为他们都可以用XAUTH的方式进行认证。

话不多说,直接开始具体的配置过程。首先,你需要安装一些软件包,使用这个命令即可:

apt-get install strongswan strongswan-plugin-xauth-generic

安装完之后你的系统应该就可以运行ipsec命令了,这个就是你的VPN服务的控制程序了。不过先别急,为了能提供VPN服务,你还需要进行配置。

首先配置IPsec连接,利用vim或者其他工具编辑配置文件/etc/ipsec.conf,填入以下配置

config setup
    cachecrls=yes
    uniqueids=yes
conn ios_android
    keyexchange=ikev1
    authby=xauthpsk #支持上述所有客户端,不支持WINDOWS
    xauth=server
    left=xxx.xxx.xxx.xxx  # 外网IP
    leftsubnet=0.0.0.0/0
    right=%any
    rightdns=223.5.5.5 
    rightsourceip=10.0.15.0/24 # 别人连接你的VPN,你分配给他的内部IP地址段
    auto=add

接下来,配置你的连接密钥已经客户的用户名密码信息,编辑文件/etc/ipsec.secrets,填入以下配置

: PSK "miyao"
test : XAUTH "pwd"

到这里你就完成所有的配置了。是的,你没有听错,真的是相当的简单。接下来,执行命令ipsec start即可启动VPN服务,理论上应该是没有什么错误的。

对于安卓来说,连接方式可以参考这里,具体要主要类型要选择IPsec XAUTH PSK, 预共享密钥就是miyao,账号密码就是上面的test和pwd,服务器地址你服务器的外网IP。

对于苹果(MAC IOS)用户来说也是一样的,可以参考这里,填写方法和安卓一样,类型选择Cisco IPsec, 群组名称可以不填。

兼容 Windows (WP) 客户端

如果想让你的VPN服务器同时能兼容Windows客户端,这个就很复杂了。Windows要求以证书的形式验证服务器的安全性,想要连接的话还必须要导入一个证书,然后服务端也需要相应的进行一些更改,下面来具体一步步的分析。

服务端部署 – 认证方式

为了让IPsec能支持Windows,我们还需要安装一个插件,以支持微软的认证方式eap-mschapv2

sudo apt-get install strongswan-plugin-eap-mschapv2

一开始我以为之前安装的strongswan已经自带了,并且很多教程也没有提到这个事情(因为他们都是直接编译源码安装的strongswan,直接开启了eap-mschapv2支持)。通过查看系统日志/var/log/syslog发现每次连接的时候都会出现error loading eap-mschapv2 才意识到这个问题。

除了认证方式的问题,还有一大堆关于证书的问题要解决,windows客户端连接不仅仅需要用户密码以及密钥的认证,还需要证书的认证,具体的原理我暂时也没有弄得很清楚,这里引用别人博客里面关于证书配置的内容

服务端部署 – 证书配置( 转自这里)

每一个完整的 ssl 证书都有一个公钥和一个私钥。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。
生成CA证书的私钥,并使用私钥,签名CA证书

ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=StrongSwan CA" --ca --lifetime 3650 --outform pem >ca.cert.pem

这里C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。O 表示组织名。CN 为通用名

生成服务器证书所需的私钥,并用CA证书签发服务器证书

ipsec pki --gen --outform pem > server.pem  
ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem \
    --cakey ca.pem --dn "C=CN, O=VPN, CN=vpn.linsir.org" \
    --san="x.x.x.x" --san="vpn.linsir.org" --flag serverAuth --flag ikeIntermediate \
    --outform pem > server.cert.pem

这里C、O的值要跟第一步的一致,CN值及–san值是服务器公网地址或url,另外这里可以设置多个–san值。否则会出现错误 13801:IKE身份验证凭证不可接受.

生成客户端证书

 ipsec pki --gen --outform pem > client.pem
     ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem \
    --cakey ca.pem --dn "C=CN, O=VPN, CN=VPN Client" \
    --outform pem > client.cert.pem

这里C、O的值要跟第一步的一致

生成 pkcs12 证书 pkcs12 证书用来导入手机或电脑的,这个过程会让你输入密码,到时候客户端导入证书时需要输入

openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "VPN Client"\
         -certfile ca.cert.pem -caname "vpn.linsir.org"  -out client.cert.p12

安装证书
把证书复制到strongswan目录下。

cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pem /etc/strongswan/ipsec.d/private/
cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r client.pem /etc/strongswan/ipsec.d/private/

服务端部署 – 配置文件

配置完证书后,服务端只需要再增加一个提供给windows的链接以及相应的用户和密码,具体如下。
首先在/etc/ipsec.conf中加一个新的连接

conn win7
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    rekey=no
    left=xxx.xxx.xxx.xxx  # 外网IP
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightdns=223.5.5.5
    rightsourceip=10.0.15.0/24
    rightsendcert=never
    eap_identity=%any
    auto=add

其次更改密钥文件

: PSK "miyao"
: RSA server.pem  # 证书验证

test: XAUTH "pwd"
win: EAP "pwd"  # for windows login

这样就可以完成所以服务端的配置了。

Win 系列客户端连接

Win系列(包括Windows7以上,WP等系统)直接采用内建的ikev2方式进行连接。不过在连接前必须导入之前生成的client.cert.p12文件,具体的配置方式可以参考这里。WindowsXp及以下的系统需要借助第三方软件 Shrew Soft VPN Client 。

总结

总的来说,Cisco IPSec 的配置还是相对比较简单的,如果只要兼容IOS以及安卓,那么配置可以在10分钟内完成,而且连接速度又快又稳定。为了兼容Windows客户端,也可以在搭建一个PPTP服务器,同时运行两个VPN服务端,教程可以参考这里

参考文献

使用 Strongswan 架设 Ipsec VPN CSDN
使用 Strongswan 架设 Ipsec VPN opensuse
CentOS7下Strongswan架设IPSec-CSDN.NET
Ubuntu 14.04 搭建 Cisco IPSec VPN 服务器教程- CSDN.NET

评论 在此处输入想要评论的文本。

标题和URL已复制