Debian + StrongSwan 配置 IKEv2 VPN 科学上网

Step 1. 安装 StrongSwan

Debian 8 使用直接 apt-get 就可以了

1
apt-get install strongswan libcharon-extra-plugins

经过实验,Debian 7 也是完美支持的不过要加一个 repo

1
2
3
echo "deb http://ftp.debian.org/debian wheezy-backports main" > /etc/apt/sources.list.d/wheezy-backports.list
apt-get update
apt-get -t wheezy-backports install strongswan libcharon-extra-plugins

Step 2. 生成根证书

生成证书的过程都是类似的:先生成一个私钥,再签一个证书

1
2
3
cd /etc/ipsec.d/
ipsec pki --gen --outform pem > private/ca.pem
ipsec pki --self --ca --in private/ca.pem --type rsa --dn "C=CH, O=strongSwan, CN=strongSwan Root CA" --outform pem > cacerts/ca.cert.pem

--self 表示自签证书,'--dn'为判别名,解释一下:

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

Step 3. 生成服务器证书

替换下面的vpn.ericfu.me为自己服务器的域名或IP,如果域名不一致会造成无法连接。(这里写域名,则客户端连接的时候也用域名;这里写IP,则客户端连接的时候也用IP)

1
2
3
cd /etc/ipsec.d/
ipsec pki --gen --outform pem > private/server.pem
ipsec pki --pub --in private/server.pem --type rsa | ipsec pki --issue --cacert cacerts/ca.cert.pem --cakey private/ca.pem --dn "C=CH, O=strongSwan, CN=vpn.ericfu.me" --san vpn.ericfu.me --flag serverAuth --flag ikeIntermediate --outform pem > certs/server.cert.pem

解释一下:

ipsec pki --pub --in server.pem 是从我们刚生成的私钥里把公钥提取出来,然后用公钥去参与后面的服务器证书签发(这个是 VPN 连接时候要用的,你不想把私钥也给它吧?那样跟没签证书一样...)。

--issue, --cacert--cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。

--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 都要求服务器别名(Server Alt Name)就是服务器的 URL 或 IP 地址,--san

Step 4. 生成客户端证书

和上面服务器的类似

1
2
3
cd /etc/ipsec.d/
ipsec pki --gen --outform pem > private/client.pem
ipsec pki --pub --in private/client.pem --type rsa | ipsec pki --issue --cacert cacerts/ca.cert.pem --cakey private/ca.pem --dn "C=CH, O=strongSwan, CN=vpnclient" --outform pem > certs/client.cert.pem

导出为 P12 格式,方便使用

1
2
cd /etc/ipsec.d/
openssl pkcs12 -export -inkey private/client.pem -in certs/client.cert.pem -name "VPN Certificate" -certfile cacerts/ca.cert.pem -caname "strongSwan Root CA" -out client.cert.p12

Step 5. 配置 IPSec

修改 IPSec 的配置文件 /etc/ipsec.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# ipsec.conf - strongSwan IPsec configuration file

config setup
uniqueids=no # 允许多用户

conn %default
keyexchange=ikev2
ike=aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024!
esp=aes128gcm16-ecp256,aes256gcm16-ecp384,aes128-sha256-ecp256,aes256-sha384-ecp384,aes128-sha256-modp2048,aes128-sha1-modp2048,aes256-sha384-modp4096,aes256-sha256-modp4096,aes256-sha1-modp4096,aes128-sha256-modp1536,aes128-sha1-modp1536,aes256-sha384-modp2048,aes256-sha256-modp2048,aes256-sha1-modp2048,aes128-sha256-modp1024,aes128-sha1-modp1024,aes256-sha384-modp1536,aes256-sha256-modp1536,aes256-sha1-modp1536,aes256-sha384-modp1024,aes256-sha256-modp1024,aes256-sha1-modp1024,aes128gcm16,aes256gcm16,aes128-sha256,aes128-sha1,aes256-sha384,aes256-sha256,aes256-sha1!
dpdaction=clear
dpddelay=300s
rekey=no
left=%any
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightdns=8.8.8.8,8.8.4.4
rightsourceip=10.11.1.0/24

conn IPSec-IKEv2
keyexchange=ikev2
auto=add

conn IPSec-IKEv2-EAP
also="IPSec-IKEv2"
rightauth=eap-mschapv2
rightsendcert=never
eap_identity=%any

conn CiscoIPSec
keyexchange=ikev1
leftsendcert=never
#do not need server side cert
leftauth=psk
rightauth=psk
#use PSK as client server auth type
rightauth2=xauth
#use xauth as user login auth type
auto=add

接着修改密码文件,替换中间 topsecretpassword1topsecretpassword2evenmoretopsecretpassword 到自己设定的密码就可以了。

每行对应一种鉴别方式,冒号前面是用户名

1
2
3
4
5
6
# /etc/ipsec.secrets

: PSK "topsecretpassword1"
: RSA server.pem
vpnuser : EAP "topsecretpassword2"
vpnuser : XAUTH "evenmoretopsecretpassword"

重新加载 secrets 文件

1
ipsec rereadsecrets

Step 6. 配置转发和防火墙

开启 IPv4 转发

1
2
3
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

这个是临时性的,如果想永久更改,则修改/etc/sysctl.conf

1
2
3
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

允许 IPSec 端口监听

1
2
3
iptables -A INPUT -p udp --dport 500 --j ACCEPT
iptables -A INPUT -p udp --dport 4500 --j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

line 1: for ISAKMP (handling of security associations)

line 2: for NAT-T (handling of IPsec between natted devices)

line 3: for ESP payload (the encrypted data packets)

允许 VPN 到外网的流量

1
iptables -t nat -A POSTROUTING -o eth0 ! -p esp -j SNAT --to-source <Your VPN host IP>

StrongSwan 配置

配置文件在 /etc/strongswan.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# strongswan.conf - strongSwan configuration file

charon {
duplicheck.enable = no

install_virtual_ip = yes

dns1 = 8.8.8.8
dns2 = 8.8.4.4

load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
}

大功告成

1
2
service strongswan restart
ipsec restart

连上去试试吧!

奇奇怪怪的问题

客户端在验证一步卡住,但是服务器上的 Log 显示已经发送了 IKE_AUTH response

这个 response 包发不过来,换个网络环境试试?多半是GFW干的好事。

证书验证失败(Windows)

不能直接导入证书,一定要用 Google 出来的方法,把证书安装为系统全局的证书。

其他问题

多半是 IPSec 的问题,ipsec stop 再用 ipsec start --nofork 启动可以看到 debug 日志。

如果怎么都不 Work……

请试试编译安装 StrongSwan

Ref. 1. strongSwan 5: How to create your own private VPN | Zeitgeist 2. SDB:Setup Ipsec VPN with Strongswan - openSUSE

附两个自动安装脚本(GitHub):