安装strongSwan

安装strongswan,这里安装成功后是使用自签证书,客户端连接前需要导入自签的ca证书到设备中。

1
2
yum -y install epel-release
yum -y install strongswan openssl

生成strongswan自签CA证书

1
2
strongswan pki --gen --type rsa --size 4096 --outform pem > ca.key.pem
strongswan pki --self --in ca.key.pem --dn "C=CN, O=Linux strongSwan, CN=VPN CA" --ca --lifetime 3650 --type rsa --outform pem > ca.cert.pem
  • –self 表示自签证书
  • –in 是输入的私钥
  • –dn 是判别名
  • –ca 表示生成 CA 根证书
  • –lifetime 为有效期, 单位是天
  • C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名
  • O 组织名称
  • CN 友好显示的通用名

生成server端公钥和私钥

1
2
3
4
5
6
strongswan pki --gen --type rsa --size 4096 --outform pem > server.key.pem
strongswan pki --pub --in server.key.pem --outform pem > server.pub.pem
strongswan pki --pub --in server.key.pem | strongswan pki --issue --lifetime 3650 --cacert ca.cert.pem \
--cakey ca.key.pem --dn "C=CN, O=Linux strongSwan, CN=你的公网ip" \
--san="你的公网ip" --san="你的公网ip" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem
  • –issue, –cacert–cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书
  • –dn, –san–flag 是一些客户端方面的特殊要求:

iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;

Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;

非 iOSMac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate;

Android iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址–san

复制生成的server证书到指定目录下

1
2
3
4
5
cp -r ca.key.pem /etc/strongswan/ipsec.d/private/
cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pub.pem /etc/strongswan/ipsec.d/certs/
cp -r server.key.pem /etc/strongswan/ipsec.d/private/

配置VPN,这里只配置了IKEV2-mschapv2认证方式 IpsecConf

leftid的ip换成你的公网ip地址

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
$ vim /etc/strongswan/ipsec.conf
config setup
# strictcrlpolicy=yes # 是否严格执行证书吊销规则
uniqueids = never # 如果同一个用户在不同的设备上重复登录,yes 断开旧连接,创建新连接;no 保持旧连接,并发送通知; never 同 no, 但不发送通知.
conn %default

compress = yes # 是否启用压缩, yes 表示如果支持压缩会启用
dpdaction = clear # 当意外断开后尝试的操作
dpddelay = 30s # dpd时间间隔
inactivity = 300s # 闲置时长,超过后断开连接
left = %any # 服务器端标识,可以是魔术字 %any,表示从本地ip地址表中取
leftid = 你的公网ip地址 # 服务器端ID标识,这里为你的公网ip,或者@你的域名
leftsubnet = 0.0.0.0/0 # 服务器端虚拟IP,0.0.0.0/0表示通配
leftcert = server.cert.pem # 服务器端证书
right=%any # 客户端标识,%any表示任意
rightsourceip=192.168.86.0/24 # 客户端IP地址分配范围

conn IKEv2-EAP
keyexchange = ikev2 # 使用 IKEv2
leftca = "C=CN, O=Linux strongSwan, CN=VPN CA" # 服务器端根证书DN名称
leftsendcert = always # 是否发送服务器证书到客户端
rightsendcert = never # 客户端不发送证书
left=%any # 服务器端标识,%any表示任意
leftauth=pubkey # 服务器校验方式,使用证书
rightauth=eap-mschapv2 #KEv2 EAP(Username/Password)
eap_identity = %any # 指定客户端eap id
rekey = no # 不自动重置密钥
auto = add # 当服务启动时, 应该如何处理这个连接项,add 添加到连接表中
ike = aes256-aes128-3des-sha1-modp1024!
# 密钥交换协议加密算法列表,可以包括多个算法和协议。
# 5.0.2增加了配置与完整性保护定义的PRF算法不同的PRF算法的能力。
esp = aes256-3des-sha256-sha1!
# 数据传输协议加密算法列表,对于IKEv2,可以在包含相同类型的多个算法(由-分隔)。
# IKEv1仅包含协议中的第一个算法。只能使用ah或esp关键字,不支持AH+ESP。

修改strongSwan参数

1
2
3
4
5
6
7
8
9
10
$ vim /etc/strongswan/strongswan.conf
charon {
load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
dns1 = 114.114.114.114 #配置客户端使用的DNS
dns2 = 8.8.4.4
}
include strongswan.d/*.conf

配置VPN账号 IpsecSecrets

1
2
3
4
5
6
$ vim /etc/strongswan/ipsec.secrets
# 使用证书验证时的服务器端私钥
# 格式 : RSA <private key file> [ <passphrase> | %prompt ]
: RSA server.key.pem
#EAP 方式, 格式同 psk 相同,后面登录的账号就是user,密码就是password,可以改成自己的或设置多个
user %any : EAP "password"

开启内核转发

1
2
3
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p

配置firewalld防火墙 端口允许和ip伪装

1
2
3
4
5
6
7
8
9
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --permanent --add-port=500/udp
firewall-cmd --permanent --add-port=4500/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

# 开启iptables的地址伪装,86.0网段为vpnServer分配的网段。
# 可能重启strongswan服务后这条规则就消失了,需要再次添加。
iptables -t nat -A POSTROUTING -s 192.168.86.0/24 -o eth0 -j MASQUERADE

启动strongSwan服务

1
2
systemctl start strongswan
systemctl enable strongswan

免导入CA证书登录

CA证书的主要原理还是基于信任,上面的手动安装CA证书就要设置信任,所以只要我们有一些机构签发的证书,那就可以试用,这里主要使用Let’sencrypt 使用这个需要每三个月需要一次续签,你也可以用阿里云或者其他ssl机构申请一年免费的ssl证书

前置条件:需要你先设置一个域名解析到这台服务器的公网ip地址,比如ikev2.putianhui.cn解析到104.199.132.207后才能自动签发证书。

1
2
3
4
5
yum -y install certbot
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
certbot certonly --rsa-key-size 4096 --standalone --agree-tos --no-eff-email --email admin@putianhui.cn -d 你的域名地址

将生成的证书 /etc/letsencrypt/live/域名,通过链接的方式连接到strongswan使用的证书路径。

1
2
3
4
# 使用链接的好处就是下次更新时不需要复制文件
ln -s /etc/letsencrypt/live/域名/fullchain.pem /etc/strongswan/ipsec.d/certs/
ln -s /etc/letsencrypt/live/域名/privkey.pem /etc/strongswan/ipsec.d/private/
ln -s /etc/letsencrypt/live/域名/chain.pem /etc/strongswan/ipsec.d/cacerts/

修改strongswan配置文件,配置原来的自签证书更换成公网的ssl证书

修改ipsec.conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ vim /etc/strongswan/ipsec.conf
## 修改一
#将原自签证书
leftcert = server.cert.pem
#改成新生成的公网ssl证书
leftcert = fullchain.pem

## 修改二
#将原这里的公网ip
leftid = 104.199.132.207
#改成新ssl证书绑定的域名
leftid = @ikev2.putianhui.cn

## 修改三
#删除leftca = "C=CN, O=Linux strongSwan, CN=VPN CA" 配置字段

修改ipsec.secrets文件,添加公网ssl的key

1
2
3
$ vim /etc/strongswan/ipsec.secrets
# 将 : RSA server.key.pem 修改成以下并保存
: RSA "privkey.pem"

客户端测试

IOS端

  1. 先导入 自签CA 证书 将之前创建的ca.cert.pem文件放在web中,使用iOS自带的浏览器Safari访问ca.cert.pem,然后进行安装(如果配置了免导入ca证书,这步可以省略

  2. 使用 IKEv2 + EAP 认证找到手机上 “设置->VPN->添加配置”, 选IKEv2。

    1
    2
    3
    4
    5
    6
    描 述:随便填
    服 务 器:10.1.1.2 #如果是自签ca这里就填服务器公网ip,免导入ca证书就填绑定的域名地址
    远 程 ID:10.1.1.2 #如果是自签ca这里就填服务器公网ip,免导入ca证书就填绑定的域名地址
    用户鉴定:用户名
    用 户 名:user #EAP 项用户名
    密 码:password #EAP 项密码

​ 使用 IKEv2 + EAP 认证找到手机上 “设置->VPN->添加配置”, 选IKEv2。