CentOS7 部署 OpenVPN

0x01. 环境安装

1
2
3
4
5
6
7
8
# 更新 CentOS 软件包
yum -y update

# 安装 OpenVPN 和 EasyRSA
yum -y install openvpn easy-rsa firewalld

# 如果未能成功安装 OpenVPN,则可能需要先安装一下 Epel 库
yum install epel-release -y

0x02. 证书生成

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
# 首先需要初始化 PKI ,会在当前目录生成 pki 目录
/usr/share/easy-rsa/3/easyrsa init-pki

# 接下来是生成 CA 证书,其中 nopass 表示不加密私钥,主要是方便后面导出公钥与颁发服务器证书
/usr/share/easy-rsa/3/easyrsa build-ca nopass

# 再来是生成交互密钥
/usr/share/easy-rsa/3/easyrsa gen-dh

# 开始生成服务端密钥
/usr/share/easy-rsa/3/easyrsa build-server-full server nopass

# 接下来生成客户端密钥,如果未开启同证书允许多人登陆,则需要多次执行生成对应的客户端密钥
/usr/share/easy-rsa/3/easyrsa build-client-full client nopass

# 最后是生成证书交互列表,如果不需要 crl-verify 则可以跳过
/usr/share/easy-rsa/3/easyrsa gen-crl

# 其实到这一步需要的证书都以及生成好了,如果你开启了 tls-auth 则还需要生成共享密钥
openvpn --genkey --secret pki/ta.key

# 在上面所有证书都生成完毕之后
# 创建目录存放所有相关证书文件,方便后期管理(备份与恢复)
#
# 服务端配置所需证书文件
mkdir -p openvpn/server
cp pki/ca.crt openvpn/server/ca.crt
cp pki/dh.pem openvpn/server/dh.pem
cp pki/issued/server.crt openvpn/server/server.crt
cp pki/private/server.key openvpn/server/server.key
cp pki/ta.key openvpn/server/ta.key
cp pki/crl.pem openvpn/server/crl.pem
#
# 客户端配置所需证书文件
mkdir -p openvpn/client
cp pki/ca.crt openvpn/client/ca.crt
cp pki/issued/client.crt openvpn/client/client.crt
cp pki/private/client.key openvpn/client/client.key
cp pki/ta.key openvpn/client/ta.key

0x03. 服务端配置

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
# 复制官方服务端配置样例
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf openvpn/server/server.conf

#############################################################
# 以下为修改配置文件内容
#############################################################
#
# SSL/TLS root certificate (ca), certificate
# (cert), and private key (key). Each client
# and the server must have their own cert and
# key file. The server and all clients will
# use the same ca file.
#
# See the "easy-rsa" directory for a series
# of scripts for generating RSA certificates
# and private keys. Remember to use
# a unique Common Name for the server
# and each of the client certificates.
#
# Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca ca.crt
cert server.crt
key server.key # This file should be kept secret

# Diffie hellman parameters.
# Generate your own with:
# openssl dhparam -out dh2048.pem 2048
dh dh.pem
# 以上配置内容修改为证书生成所对应的文件名及路径,服务端识别的相对路径为 `/etc/openvpn`

# Push routes to the client to allow it
# to reach other private subnets behind
# the server. Remember that these
# private subnets will also need
# to know to route the OpenVPN client
# address pool (10.8.0.0/255.255.255.0)
# back to the OpenVPN server.
push "route 172.16.1.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0"
# 推送路由信息给客户端以找到 VPN 背后的子网

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-GCM # 原:AES-256-CBC
# 修改为安全性更高的加密方式


# 最后追加(可选)
crl-verify crl.pem


0x04. 客户端配置

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
# 复杂官方客户端配置样例
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf openvpn/client/client.conf

#############################################################
# 以下为修改配置文件内容
#############################################################
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote my-server-1 1194
;remote my-server-2 1194
# 修改服务器监听地址

#
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
ca ca.crt
cert client.crt
key client.key

# If a tls-auth key is used on the server
# then every client must also have the key.
tls-auth ta.key 1
# 以上配置内容修改为文件所对应路径,证书文件与配置文件在同一目录下即可

# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-GCM
# 修改加密方式

0x05. 启动服务端并让其开机自动启动

1
2
systemctl start openvpn@server
systemctl enable openvpn@server

0x06. 配置防火墙与流量转发

1
2
3
4
5
6
7
8
9
10
11
# 配置防火墙与流量转发
firewall-cmd --permanent --add-service openvpn
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

# 检查是否开启流量转发
sysctl -a | grep net.ipv4.ip_forward

# 确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

0x07. 合并证书到配置文件中

编辑client.ovpn客户端配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# vim client.ovpn

# 删除或者注释以下几行内容:
ca ca.crt   改为:#ca ca.crt
cert client.crt   改为:#cert client.crt
key client.key   改为:#key client.key
tls-auth ta.key 1   改为:#tls-auth ta.key 1

# 在最后面添加以下内容:
<ca>
# ca.crt 文件内容
</ca>
<cert>
# client.crt 文件内容
</cert>
<key>
# client.key 文件内容
</key>
key-direction 1
<tls-auth>
# ta.key 文件内容
</tls-auth>

# 复制各文件里的内容到相应的位置即可!保存退出!!

0x08. 故障修复

TLS密钥协商在60秒内失败

TLS错误:TLS密钥协商在60秒内失败(检查您的网络连接)

设置OpenVPN时最常见的问题之一是,连接两端的两个OpenVPN守护程序都无法彼此建立TCP或UDP连接。

这几乎是由于以下原因造成的:

  • 服务器网络上的外围防火墙正在过滤传入的OpenVPN数据包(默认情况下,OpenVPN使用UDP或TCP端口号1194)。

  • 在OpenVPN服务器计算机上运行的软件防火墙本身正在过滤端口1194上的传入连接。请注意,除非另有配置,否则许多操作系统默认情况下会阻止传入连接。

  • 服务器网络上的NAT网关没有TCP / UDP 1194到OpenVPN服务器计算机内部地址的端口转发规则。
    OpenVPN客户端配置在其配置文件中没有正确的服务器地址。客户端配置文件中的remote指令必须指向服务器本身或服务器网络网关的公共IP地址。

  • 另一个可能的原因是Windows防火墙阻止了对openvpn.exe二进制文件的访问。您可能需要将其列入白名单(添加到“例外”列表中),OpenVPN才能正常工作。

在您的情况下,任何这些也很可能导致相同的问题。因此,只需逐一浏览。

Failed to start OpenVPN Robust

Failed to start OpenVPN Robust And Highly Flexible Tunneling Application

1
# 这次出现这个故障的原因是SELinux,因为从Windows系统上传配置文件到Linux系统,造成selinux的权限设置有问题

0x09. 参考文章