CentOS 7 搭建 IKEv2 VPN 服务

   Linux  CentOS    VPN  Firewall  IKEv2

更新系统安装

1
2
# 更新CentOS系统
yum -y update

安装EPEL

1
2
# 安装EPEL
yum -y install epel-release

安装依赖组件

1
2
# 安装依赖组件
yum -y install gpm-devel pam-devel openssl-devel make gcc

安装Strongswan

1
2
3
4
# 安装Strongswan
yum -y install strongswan
# 为Strongswan添加别名 ipsec
alias ipsec='strongswan'

生成CA私钥,并使用此私钥自签名生成CA证书

1
2
3
cd /etc/strongswan && mkdir ca && cd ca
ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=[国家名], O=[组织名], CN=[通用名]" --ca --lifetime 3652 --outform pem > ca.cert.pem

注:配置中的 C=[国家名], O=[组织名] 值都相同

生成服务器私钥,然后从私钥中导出公钥,用CA证书签发服务器证书

1
2
ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem --cakey ca.pem --dn "C=[国家名], O=[组织名], CN=[IP 或 domain]" --san="[IP 或 domain]" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

生成客户端私钥,然后从私钥中导出公钥,用CA证书签发客户端证书

1
2
ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem --cakey ca.pem --dn "C=[国家名], O=[组织名], CN=[通用名]" --outform pem > client.cert.pem

生成 pkcs12 证书,用来导入手机或电脑。此处需输入密码,此密码用于安装CA证书时使用

1
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "[此处与第7步中CN同值]" -certfile ca.cert.pem -caname "[CA 证书别名]" -out client.cert.p12

strongswam导入证书

1
2
3
4
5
6
7
8
#cacerts  /目录下放置CA证书
#certs /目录下放置服务器和客户端证书
#private /目录下放置服务器和客户端私钥
cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r server.pem /etc/strongswan/ipsec.d/private/
cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
cp -r client.pem /etc/strongswan/ipsec.d/private/

修改strongSwan各组件的通用配置

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
cat >/etc/strongswan/strongswan.conf <<EOF
charon {
load_modular = yes
duplicheck.enable = no #冗余检查关闭,以允许同时连接多个设备
compress = yes #传输启用压缩
plugins {
include strongswan.d/charon/*.conf
}
dns1 = 8.8.8.8 #给远程端指定DNS服务器
dns2 = 8.8.4.4
nbns1 = 8.8.8.8 # 指定Windows的WINS服务器
nbns2 = 8.8.4.4

filelog { #配置strongSwan日志级别和路径
/var/log/strongswan.log {
time_format = %b %e %T
default = 5 # 日志最高等级5
append = no
flush_line = yes
}
}
}

include strongswan.d/*.conf
EOF

修改IPsec相关的配置,定义IKE版本、验证方式、加密方式、连接属性等等

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
cat >/etc/strongswan/ipsec.conf <<EOF
config setup
protostack=netkey
# strictcrlpolicy=yes
listen = [IP 或 domain]
uniqueids = never

# Add connections here.

# Sample VPN connections

#conn sample-self-signed
# leftsubnet=10.1.0.0/16
# leftcert=selfCert.der
# leftsendcert=never
# right=192.168.0.2
# rightsubnet=10.2.0.0/16
# rightcert=peerCert.der
# auto=start

#conn sample-with-ca-cert
# leftsubnet=10.1.0.0/16
# leftcert=myCert.pem
# right=192.168.0.2
# rightsubnet=10.2.0.0/16
# rightid="C=CH, O=Linux strongSwan CN=peer name"
# auto=start

conn %default #默认配置项,其他conn配置项都会调用此默认项
left=%any #left表示local,即本地端(服务器端)IP地址;%any是魔数字,表示任意地址
leftsubnet=0.0.0.0/0 #本地端网络,0.0.0.0/0为通配,表示所有IP网段
right=%any #right表示remote,即远程端(客户端)IP地址可为任意地址
rightsourceip=10.10.10.0/24 #分配给远程端的虚拟IP地址段,尽量避免使用常用私网地址段以免冲突
dpdaction=clear #dpd表示Dead Peer Detection,对端失效检测,clear表示对端失效时关闭连接

conn IKEv1-CERT-XAUTH #供老版本IOS使用。IKEv1,使用证书和XAUTH验证
keyexchange=ikev1 #密钥交换使用IKEv1
fragmentation=yes #允许分片
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
rightauth=pubkey #远程端使用公钥验证
rightauth2=xauth #远程端使用用户账号验证
rightcert=client.cert.pem #指定远程端证书
auto=add #auto定义strongSwan服务启动时该连接的行为,add是添加连接类型但不启动

conn IKEv1-PSK-XAUTH #供IOS, Android使用。IKEv1,使用预共享密钥和XAUTH验证
keyexchange=ikev1 #密钥交换使用IKEv1
leftauth=psk #本地端使用预共享密钥验证
rightauth=psk #远程端使用预共享密钥验证
rightauth2=xauth #远程端使用用户账号验证
auto=add #strongSwan启动时添加连接类型但不启动
aggressive=yes

conn IKEv2-CERT #供Windows 7+, Linux使用。IKEv2,使用证书验证
keyexchange=ikev2 #密钥交换使用IKEv2
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
rightauth=pubkey #远程端使用公钥验证
rightcert=client.cert.pem #指定远程端证书
auto=add #strongSwan启动时添加连接类型但不启动

conn IKEv2-EAP #供Windows 7+, IOS9+使用。IKEv2,EAP验证
keyexchange=ikev2 #密钥交换使用IKEv2
ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! #第一阶段加密方式
esp=aes256-sha256,aes256-sha1,3des-sha1! #ESP的顺序与IKE一致
rekey=no #本地端对Windows远程端发出rekey请求会断开连接,所以需配置为no
leftauth=pubkey #本地端使用公钥验证
leftcert=server.cert.pem #指定本地端证书
leftsendcert=always #本地端总是发送证书
leftid=[IP 或 domain] #本地端标识,使用本地端公网IP地址作为标识,和生成服务器证书时的--san参数对应
rightauth=eap-mschapv2 #远程端使用eap-mschapv2验证
rightsendcert=never #不要求远程端发送证书
eap_identity=%any #指定EAP验证身份,任意账户
fragmentation=yes #允许分片
auto=add #strongSwan启动时添加连接类型但不启动
EOF

定义各类密钥,例如:私钥、预共享密钥、用户账户和密码

1
2
3
4
5
6
cat >/etc/strongswan/ipsec.secrets <<EOF
: RSA server.pem #指定服务器的RSA私钥文件
: PSK "[xxxxxxx]" #配置预共享密钥
[username] : XAUTH "[password]" #配置XAUTH验证的用户名和密码,可配置多个用户账户
[username] : EAP "[password]" #配置EAP验证的用户名s和密码,可配置多个用户账户
EOF

设置ipsec.secrets文件权限

1
chmod 600 ipsec.secrets

设置网卡转发

1
2
3
4
cat >/etc/sysctl.conf <<EOF 
net.ipv4.ip_forward = 1
EOF
sysctl -p

配置防火墙,本处使用的firewalld

1
2
3
4
5
yum install firewall firewall-config
firewall-cmd --permanent --add-service=ipsec
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.8.0.0/24 masquerade'
firewall-cmd --reload

配置服务启动

1
2
3
chkconfig strongswan on 
chkconfig firewalld on
systemctl start strongswan

strongswan 查看日志状态

1
2
# 查看当前链接数
ipsec status

链接VPN的方式

  1. Windows
    • 10 以上的使用IKEv2的方式连接
    • 10 以下推荐安装官方的strongswan APP链接
  2. IOS
    IKEv2 链接
  3. Android
    推荐安装官方的strongswan APP链接

注:推荐使用IKEv2 不推荐使用 IPSEC、IKE 等等

  1. 更新系统安装
  2. 安装EPEL
  3. 安装依赖组件
  4. 安装Strongswan
  5. 生成CA私钥,并使用此私钥自签名生成CA证书
  6. 生成服务器私钥,然后从私钥中导出公钥,用CA证书签发服务器证书
  7. 生成客户端私钥,然后从私钥中导出公钥,用CA证书签发客户端证书
  8. 生成 pkcs12 证书,用来导入手机或电脑。此处需输入密码,此密码用于安装CA证书时使用
  9. strongswam导入证书
  10. 修改strongSwan各组件的通用配置
  11. 修改IPsec相关的配置,定义IKE版本、验证方式、加密方式、连接属性等等
  12. 定义各类密钥,例如:私钥、预共享密钥、用户账户和密码
  13. 设置ipsec.secrets文件权限
  14. 设置网卡转发
  15. 配置防火墙,本处使用的firewalld
  16. 配置服务启动
  17. strongswan 查看日志状态
  18. 链接VPN的方式
.Net Core 简介
CentOS 7 搭建 PPTP 协议 VPN