移动端利用strongSwan搭建VPN服务器

2016-11-08
VPN

概要

使用strongSwan IKEv2 VPN协议搭建移动端VPN服务器,因iOS和Android支持的IKEv2协议类型不一样,所以要对iOS和Android分别使用不同的vpn配置

编译安装strongSwan

下载

https://strongswan.org/下载最新版本strongSwan代码,并解压

编译

进入解压后的strongSwan目录,开始编译和安装(configure -> make -> install)

  • 配置
    未指定配置文件目录,默认配置文件目录为/usr/local/etc

    1
    ./configure --enable-openssl --enable-nat-transport --disable-mysql --disable-ldap --disable-static --enable-shared --enable-md4 --enable-eap-mschapv2 --enable-eap-aka --enable-eap-aka-3gpp2 --enable-eap-gtc --enable-eap-identity --enable-eap-md5 --enable-eap-peap --enable-eap-radius --enable-eap-sim --enable-eap-sim-file --enable-eap-simaka-pseudonym --enable-eap-simaka-reauth --enable-eap-simaka-sql --enable-eap-tls --enable-eap-tnc --enable-eap-ttls
  • 编译

    1
    make
  • 安装

    1
    make install

生成证书

CA证书(根证书)

CA证书用于对服务器证书进行签名,并在Android客户端(iOS支持免证书认证)导入,用于认证服务器是否可信

  • 生成CA私钥

    1
    ipsec pki --gen --outform pem > ca.pem
  • 基于CA私钥生成CA证书

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

服务器证书

不同的服务器自身证书不同,但必须使用相同的CA证书进行签名

  • 生成服务器私钥

    1
    ipsec pki --gen --outform pem > server.pem
  • 用CA证书和服务器私钥签发服务器证书

    1
    ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=CN, O=QLVPN, CN=106.75.193.72" --san="106.75.193.72" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

–dn, –san,–flag 是一些客户端方面的特殊要求:

* iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
* Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),--flag serverAuth;
* 非 iOS 的 Mac OS X 要求了「IP 安全网络密钥互换居间(IP Security IKE Intermediate)」这种增强型密钥用法(EKU),--flag ikdeIntermediate;
* Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。
--------

不同的VPN服务器签发证书时参数不一致(IP地址不一致),一定要使用服务器对应的IP地址进行证书签发

Client证书(当前没有使用)

  • 生成私钥

    1
    ipsec pki --gen --outform pem > client.pem
  • 签发证书(用户客户端认证)

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

安装证书

将生成的CA证书、服务器证书、客户端证书拷贝到strongSwan相应的配置目录下

1
2
3
4
5
6
7
8
9
10
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
### 配置`ipsec.conf`
- 添加iOS配置信息

conn ios-ikev2
auto=add
dpdaction=clear
keyexchange=ikev2
left=%any
leftsubnet=0.0.0.0/0
leftauth=psk
leftid=qlvpn.server
right=%any
rightsourceip=192.168.0.0/24
rightauth=eap-mschapv2
rightid=qlvpn.client

1
- 添加Android配置信息

conn ipke2vpn
auto=add
keyexchange=ikev2
ike=aes256-sha1-modp1024!
rekey=no
left=%defaultroute
leftsubnet=0.0.0.0/0
leftauth=pubkey
leftcert=server.cert.pem
leftid=”C=CN, O=QLVPN, CN=106.75.193.72”
right=%any
rightsourceip=192.168.0.0/24
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any

1
2
3
4
**注意`leftid`必须和服务器证书`--dn`一致,为服务器的IP地址**
### 配置`ipsec.secrets`
添加如下配置

: PSK qlvpn_kd2014@
: RSA server.pem
qlvpn : EAP “kd2014@”
qlvpn : XAUTH “kd2014@”

1
2
3
* PSK为iOS共享KEY
### 配置`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

1
2
3
## 启动strongSwan
后台运行

ipsec start

1
2
滚动日志

ipsec start –nofork

1
2
## 配置`iptables`

sudo iptables -A INPUT -p udp –dport 500 -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp –dport 4500 -j ACCEPT
sudo iptables -A INPUT -p tcp –dport 4500 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
```

参考资料


Kommentare: