###原创内容,转载请注明出处###

本文主要介绍在Debian上部署strongswan VPN服务器,同时支持IKE1, IKE2的IPSec VPN服务器。客户端采用证书或PSK方式+账号密码进行认证。支持的客户端有Linux,Android,Windows XP/7, iOS等。

本文基于Debian系统,Strongswan 5.1.1版本,其他Linux系统请自行修改对应的shell 命令。

本文操作在Linode VPS上和Histogation KVM VPS上以及locvps的香港主机上测试通过。

安装Strongswan

首先安装PAM library到Debian系统,安装前请自行运行”apt-get update”命令更新资源库。

apt-get install libpam0g-dev libssl-dev

下载最新的Strongswan 5.x版本,并编译安装。当前版本 5.1.1。

cd /tmp
wget http://download.strongswan.org/strongswan.tar.gz
tar zxvf strongswan.tar.gz
cd strongswan-5.1.1

[wp_ad_camp_3]

./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

默认安装到/usr/local/目录下,ipsec命令位于/usr/local/sbin,配置文件位于/usr/local/etc

签发并安装证书

生成CA证书

生成私钥

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

利用私钥,签名CA证书

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

服务器证书

生成私钥

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

用CA证书签发服务器证书

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

注意–dn –san中的域名或者IP地址必须和客户端访问服务器时使用的URL或IP一致,即服务器用于服务的URL或IP

[wp_ad_camp_1]

客户端证书

生成私钥

 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=nsshell, CN=Nsshell 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 "Nsshell 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/

注意,本章节创建和签名证书的过程中,使用的DN除CN外其他必须一致,例如,–dn “C=com, O=nsshell, CN=Client…”,创建p12证书时使用的caname需要和ca证书的CN值一致。

将上面得到的ca证书(ca.cert.pem)、客户证书(client.pem, client.cert.pem)、p12证书(client.cert.p12)打包发给客户端用户安装、建立VPN链接。

[wp_ad_camp_3]

进行Stringswan的配置

ipsec.conf文件(/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

# also supports iOS PSK and Shrew on Windows
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

# compatible with "strongSwan VPN Client" for Android 4.0+
# and Windows 7 cert mode.
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

注意上面我使用了自定义的IP段(10.31.2.0/24),需要根据自己情况修改对应地址。同时需要修改防火墙设置。

ipsec.secrets(/usr/local/etc/ipsec.secrets)

#
# ipsec.secrets
#
# This file holds the RSA private keys or the PSK preshared secrets for
# the IKE/IPsec authentication. See the ipsec.secrets(5) manual page.
#
# 使用证书认证,注意server.pem位置是在strongswan证书目录下的private目录
: RSA server.pem
# PSK认证方式,nsshell.com即为密匙
: PSK "nsshell.com"
# XAUTH认证,用户名随意,密码为nsshell.com
: XAUTH "nsshell.com"
%any %any : EAP "nsshell.com"

strongswan.conf

# strongswan.conf - strongSwan configuration file
charon {
       duplicheck.enable = no

       dns1 = 208.67.222.222
       dns2 = 208.67.220.220

       # for Windows only
       nbns1 = 208.67.222.222
       nbns2 = 208.67.220.220

       filelog {
               /var/log/strongswan.charon.log {
                   time_format = %b %e %T
                   default = 2
                   append = no
                   flush_line = yes
               }
       }
}

启动/停止strongswan服务

ipsec start
ipsec stop

检查ipsec状态、证书等

ipsec statusall
ipsec listcerts
ipsec --help

log文件位于/var/log目录下,另外strongswan开发还处于活跃状态,出现问题在wiki.strongswan.org提问后很快有回复。

修改防火墙设置—参见这里

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-save > /etc/iptables.rules

在/etc/network/if-up.d/目录下创建iptables文件,如下:

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

修改iptables文件权限,这样每次启动后都会设置好IP转发

chmod +x /etc/network/if-up.d/iptables

参考:

http://bao3.blogspot.com/2013/05/racoonstrongswanvpn.html

https://zh.opensuse.org/index.php?title=SDB:Setup_Ipsec_VPN_with_Strongswan&variant=zh-cn#.E5.AE.89.E8.A3.85_Srongswan

http://serverfault.com/questions/536092/strongswan-ikev2-windows-7-agile-vpn-what-is-causing-error-13801