debian下strongswan配置IPSec

StrongSwan 配置 IKEv2

软件安装:

1
apt-get install strongswan libcharon-extra-plugins strongswan-pki

生成根证书:

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 为通用名。

生成服务器证书:

替换下面的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。

生成客户端证书:

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

配置 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

配置转发和防火墙

开启 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