本来Strongswan搭建IKEv2 VPN有一篇很好的教程(在nsshell.com上),但是貌似nsshell.com貌似挂了(反正我打不开),于是我就做个搬运,把教程拿过来。。正好原文中有一两处遗漏,我也好补上去。

重要说明:本文原本只是给自己留一个参考,但似乎已经有很多人参考了这篇文章。一个月来我已经人工帮助了将近10个人无偿排查疑难问题。而作为一个学生,并没有多余的精力做这些事情。因此以后请不要找我问如何搭建VPN,谢谢。

条件:
RAM大小合适的VPS或者服务器(96MB RAM就足够了,64MB RAM未测试)
可以是OpenVZ,但注意看教程中标注的针对OpenVZ的特殊步骤。

1.准备工作
请在虚拟机或服务器上安装好Ubuntu操作系统,32位、64位均可,建议14.04 LTS,并执行以下命令:

apt-get update
apt-get install libpam0g-dev libssl-dev make gcc

将PAM库和SSL库安装在系统中

2.下载最新的strongswan源代码并编译

wget http://download.strongswan.org/strongswan.tar.gz
tar xzf strongswan.tar.gz
cd strongswan-*

OpenVZ使用以下参数

./configure  --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap  \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap  \
--enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity  \
--enable-certexpire --enable-radattr --enable-tools --enable-openssl --disable-gmp --enable-kernel-libipsec

其它服务器执行

./configure  --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap  \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap  \
--enable-xauth-pam  --enable-dhcp  --enable-openssl  --enable-addrblock --enable-unity  \
--enable-certexpire --enable-radattr --enable-tools --enable-openssl --disable-gmp

等待这个过程结束后,执行以下命令:

make; make install

耐心地等待编译,性能不同编译所需时间也有所不同。

完成后使用命令ipsec version检查是否出现版本号等信息,如下图

若出现ipsec: command not found则代表没有成功编译安装。

3.配置strongswan和证书

生成CA证书
生成私钥

ipsec pki --gen --outform pem > ca.pem  

利用私钥,签名CA证书

ipsec pki --self --in ca.pem --dn "C=com, O=myvpn, CN=VPN CA" --ca --outform pem >ca.cert.pem

服务器证书 生成私钥

ipsec pki --gen --outform pem > server.pem

用CA证书签发服务器证书

首先确认访问服务器的IP地址或域名,连接时不可使用其它地址,只能使用证书中的地址,请将下面一句命令中的123.123.123.123替换为自己服务器的IP地址或域名,连接时使用,一共需要替换两处

ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem \
--cakey ca.pem --dn "C=com, O=myvpn, CN=123.123.123.123" \
--san="123.123.123.123" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem

客户端证书 生成私钥

ipsec pki --gen --outform pem > client.pem

利用CA签名客户端证书

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

生成pkcs12证书

openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA"  -out client.cert.p12

安装证书

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

证书安装完成,接下来配置strongswan,编辑/usr/local/etc/ipsec.conf

config setup
    uniqueids=never 

conn iOS_cert
    keyexchange=ikev1
    # strongswan version >= 5.0.2, compatible with iOS 6.0,6.0.1
    fragmentation=yes
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem
    auto=add

conn android_xauth_psk
    keyexchange=ikev1
    left=%defaultroute
    leftauth=psk
    leftsubnet=0.0.0.0/0
    right=%any
    rightauth=psk
    rightauth2=xauth
    rightsourceip=10.31.2.0/24
    auto=add

conn networkmanager-strongswan
    keyexchange=ikev2
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=pubkey
    rightsourceip=10.31.2.0/24
    rightcert=client.cert.pem
    auto=add

conn windows7
    keyexchange=ikev2
    ike=aes256-sha1-modp1024! 
    rekey=no
    left=%defaultroute
    leftauth=pubkey
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=eap-mschapv2
    rightsourceip=10.31.2.0/24
    rightsendcert=never
    eap_identity=%any
    auto=add

编辑/usr/local/etc/strongswan.conf

 charon {
         load_modular = yes
         duplicheck.enable = no
         compress = yes
         plugins {
                 include strongswan.d/charon/*.conf
         }
         dns1 = 8.8.8.8
         dns2 = 8.8.4.4
         nbns1 = 8.8.8.8
         nbns2 = 8.8.4.4
 }
 include strongswan.d/*.conf

编辑/usr/local/etc/ipsec.secrets中的用户名、密码

: RSA server.pem
: PSK "mykey"
: XAUTH "mykey"
[用户名] %any : EAP "[密码]"

注意将PSK、XAUTH处的"mykey"编辑为唯一且私密的字符串,并且将[用户名]改为自己想要的登录名,[密码]改为自己想要的密码([]符号去掉),可以添加多行,得到多个用户。

4.修改系统转发以及防火墙配置
首先编辑/etc/sysctl.conf,将net.ipv4.ip_forward=1一行前面的#号去掉,保存后执行sysctl -p
接下来修改iptables。
OpenVZ执行:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.31.0.0/24  -j ACCEPT
iptables -A FORWARD -s 10.31.1.0/24  -j ACCEPT
iptables -A FORWARD -s 10.31.2.0/24  -j ACCEPT
iptables -A INPUT -i venet0 -p esp -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i venet0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i venet0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i venet0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o venet0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o venet0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o venet0 -j MASQUERADE

其它服务器执行

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.31.0.0/24  -j ACCEPT
iptables -A FORWARD -s 10.31.1.0/24  -j ACCEPT
iptables -A FORWARD -s 10.31.2.0/24  -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE

接下来(公共部分)保存iptables配置并配置开机自动载入

iptables-save > /etc/iptables.rules
cat > /etc/network/if-up.d/iptables<<EOF
#!/bin/sh
iptables-restore < /etc/iptables.rules
EOF
chmod +x /etc/network/if-up.d/iptables

5.尝试连接
WP8.1手机安装ca.cert.pem,进入设置-VPN添加IKEv2连接,地址为证书中的地址或IP,通过用户名-密码连接。
Windows连接也是一样,但注意将证书导入本地计算机而不是当前用户的“受信任的证书颁发机构”
iOS/Android/Mac OS X设备添加Cisco IPSec PSK验证方式,预共享密钥是/usr/local/etc/ipsec.secrets中PSK后的字符串(不含引号),用户名密码同上,可以通过任意域名或IP连接,不需要证书