前言

OpenVPN是啥?

看名字想必大家也就猜个差不多了,open嘛就是开放、开源的意思,OpenVPN是一个开源的SSL VPN软件,主要是建立点对点的的连接,说白一点就是在做远程接入的时候建立VPN通道,这样可以对传输中的数据进行加密提高安全性。

为啥要部署OpenVPN

1. 提高互联网链接的安全性;
2. 解决在某些限制较多的网络环境下访问服务器;
3. 减少在互联网暴露的端口;
4. 提高运维效率;
5. ......

我这里部署OpenVPN主要是为了解决我公司内部限制访问互联网的某些非常规端口的问题,我有几台服务器都是通过互联网通过不同的远程端口进行运维管理的,公司近期上了一台上网行为管理,直接导致我无法远程上我的服务器了,端口直接被限制掉,部署一台OpenVPN服务器正好完美解决了这个问题。

环境介绍

我这里环境比较简单,所有的主机都在一个网段里面,网段是192.168.0.0/24段的,都在同一个网段下面,我这里拿出2台服务器来做介绍,一台服务器做OpenVPN服务器,一台服务器用于测试使用,一台电脑用于安装客户端测试,具体信息如下:

主机名称操作系统内网IP地址备注
ecs-df93Rocky Linux 9.5192.168.0.140安装openvpn服务端
DESKTOP-6OLGDG7windows server 2022192.168.0.187作为被访问的服务器
YOLOwin11192.168.218.242作为客户端使用

注意!!!:这里需要注意下,客户端内网网段不能和服务器在同一个网段,而且客户端的网络这种也有和服务器是相同网段的也是不可以的,这样会造成网段冲突,会造成网络不可用的问题。

部署OpenVPN

服务器初始化

加载epel、elrepo库

1
dnf -y install epel-release epel-next-release elrepo-release

输出结果如下:

重新建立缓存

1
2
dnf clean all	## 删除缓存
dnf makecache ## 建立缓存

输出结果如下:

安装更新

1
dnf update -y

输出结果如下:

关闭防火墙

1
2
systemctl stop firewalld	## 关闭防火墙
systemctl disable firewalld ## 关闭防火墙开机自启动

关闭selinux

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
  setenforce 0	## 临时关闭selinux,重启后会自动开启

## 修改配置文件永久关闭
# 配置文件:/etc/selinux/config
# 修改参数:SELINUX=disabled
# 修改后配置内容如下:

cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
# See also:
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/changing-selinux-states-and-modes_using-selinux#changing-selinux-modes-at-boot-time_changing-selinux-states-and-modes
#
# NOTE: Up to RHEL 8 release included, SELINUX=disabled would also
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line. You can use grubby
# to persistently set the bootloader to boot with selinux=0:
#
# grubby --update-kernel ALL --args selinux=0
#
# To revert back to SELinux enabled:
#
# grubby --update-kernel ALL --remove-args selinux
#
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

安装OpenVPN

安装有很多中方法安装比如编译安装、rpm安装、docker安装等等,我这里就用个最简单的安装方式rpm安装

1
dnf install -y openvpn easy-rsa

输出内容如下:

签发证书

创建easy-rsa工作目录

1
2
3
4
mkdir -p /etc/openvpn/easy-rsa	## 创建工作目录
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa/ ## 将所需文件复制到工作目录
mkdir -p /etc/openvpn/easy-rsa/keys ## 创建存放证书的目录
cp -r /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars ## 复制vars模板文件到工作目录
>

编辑修改easy-rsa(vars)配置文件,配置文件路径:/etc/openvpn/easy-rsa/vars

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
 1. 修改第50行,取消前面注释并修改
#set_var EASYRSA "${0%/*}"
修改为:
set_var EASYRSA "$PWD" ## 设置当前目录为工作目录
2. 取消第60行注释
set_var EASYRSA_OPENSSL "openssl" ## 设置使用openssl
3. 在第61行增加内容
增加内容:
set_var EASYRSA_PKCS11_TOOL "pkcs11-tool" ## 指定pkcs11-tool命令
set_var EASYRSA_GREP "grep" ## 指定grep命令
4. 修改第74行,取消前面注释并修改
#set_var EASYRSA_PKI "$PWD/pki"
修改为:
set_var EASYRSA_PKI "$PWD/keys" ## 设置存放密钥的文件
5. 取消第129行注释
set_var EASYRSA_KEY_SIZE 2048 ## RSA密钥长度
6. 修改第146行,取消前面注释并修改
#set_var EASYRSA_CA_EXPIRE 3650
修改为:
set_var EASYRSA_CA_EXPIRE 36500 ## CA证书有效期
7. 修改第150行,取消前面注释并修改
#set_var EASYRSA_CERT_EXPIRE 825
修改为:
set_var EASYRSA_CERT_EXPIRE 36500 ## 普通证书有效期
8. 修改第103-108行,取消前面注释并修改
此部分内容可以自行填写,为一些前方证书的基本信息
#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "me@example.net"
#set_var EASYRSA_REQ_OU "My Organizational Unit"
修改为:
set_var EASYRSA_REQ_COUNTRY "CN" ## 国家
set_var EASYRSA_REQ_PROVINCE "HeBei" ## 省份
set_var EASYRSA_REQ_CITY "Shi JiaZhuang" ## 城市
set_var EASYRSA_REQ_ORG "blxt" ## 公司名称
set_var EASYRSA_REQ_EMAIL "blxt@163.com" ##邮箱
set_var EASYRSA_REQ_OU "blxt" ## 维护单位
9. 在末尾增加行
set_var EASYRSA_REQ_CN "EasyRSA" ## 设置通用名称
### easy-rsa初始化
cd /etc/openvpn/easy-rsa
./easyrsa init-kpi

输出内容如下:

注意!!!:提示以下内容时需要输入“yes”

  1. Type the word ‘yes’ to continue, or any other input to abort.
    Confirm removal:
  2. Type the word ‘yes’ to continue, or any other input to abort.
    Remove current ‘vars’ file?

生成CA证书

1
./easyrsa build-ca nopass

输出内如如下:

注意!!!:注意查看是敲回车还是输入yes
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

生成server端私钥和证书

1
./easyrsa gen-req server nopass

输出内容如下:

>

注意!!!:注意查看是敲回车还是输入yes
Common Name (eg: your user, host, or server name) [server]:

给server证书进行签名

1
./easyrsa sign-req server server

输出内容如下:

生成客户端证书和私钥并进行签名

1
2
./easyrsa gen-req client nopass	## 签发证书和私钥
./easyrsa sign-req client client ## 对证书进行签名

生成Diffie-Hellman参数

1
./easyrsa gen-dh

输出结果如下:

配置OpenVPN

复制配置文件模板

1
cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/

创建ta.key文件

1
2
openvpn --genkey tls-auth ta.key
cp ta.key /etc/openvpn/server/

修改配置文件

配置文件目录:/etc/openvpn/server/server.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
40
41
42
1. 修改第25行,取消前面分号并修改
;local a.b.c.d
修改为:
local 0.0.0.0 ## 设置服务器监听地址
2.修改第32行,端口号
port 1194
修改为:
port 11211 ## 这个可以修改也可以不修改,我这里冲突所以说就修改一下
3. 修改第36行,协议类型
proto udp
修改为:
proto tcp ## 这个也是可选修改,建议udp
4. 修改78-80行,指定证书位置
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
修改为:
ca /etc/openvpn/easy-rsa/keys/ca.crt ## 指定CA证书位置
cert /etc/openvpn/easy-rsa/keys/issued/server.crt ## 指定server证书位置
key /etc/openvpn/easy-rsa/keys/private/server.key ## 指定server私钥位置
5. 修改85行,指定pem文件位置
dh dh2048.pem
修改为:
dh /etc/openvpn/easy-rsa/keys/dh.pem
6. 修改101行,指定分配的地址段
server 10.8.0.0 255.255.255.0
修改为:
server 10.200.200.0 255.255.255.0 ## 这里网段可以自定义,只要不冲突就可以,给客户端分配的地址
7. 修改114行,指定路由
;push "route 192.168.10.0 255.255.255.0"
修改为:
push "route 192.168.0.0 255.255.255.0" ## 这里修改为你要访问服务器的网段
8. 取消209行注释
client-to-client ## 允许客户端访问客户端
9. 取消263行注释
comp-lzo ## 开启压缩功能,提高传输效率
10. 取消267行注释
max-clients 100 ## 设置最大连接数
11. 修改最后一行
explicit-exit-notify 1
修改为
explicit-exit-notify 0 ## 如果第36行协议设置的udp则可以不用修改,tcp需要修改为0

启动客户端并设置开机自启

1
2
systemctl start openvpn-server@server	## 启动
systemctl enable openvpn-server@server ## 设置开机自启

查看端口是否已启动:

1
netstat -anpl | grep openvpn

输出结果如下:

查看生成的网卡文件

>

其他配置

开启路由转发

1
2
3
4
[root@ecs-df93 ~]# echo 'net.ipv4.ip_forward=1' > /etc/sysctl.conf 
[root@ecs-df93 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@ecs-df93 ~]#

设置iptables防火墙转发规则和NAT规则

1
2
3
4
5
iptables -t nat -I POSTROUTING 1 -s 10.200.200.0/24 -o ens3 -j MASQUERADE
iptables -I INPUT 1 -i tun0 -j ACCEPT
iptables -I FORWARD 1 -i ens3 -o tun0 -j ACCEPT
iptables -I FORWARD 1 -i tun0 -o ens3 -j ACCEPT
iptables -I INPUT 1 -i ens3 -p tcp --dport 11211 -j ACCEPT

客户端配置

生成配置文件

客户端默认配置文件模板位置在以下目录

/usr/share/doc/openvpn/sample/

sample-config-filessample-windows两个目录里面都有,针对不同的终端提供的,配置内容基本都差不多

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
client		## 启用客户端模式
dev tun ## 设置虚拟网络接口类型为tun
proto tcp ## 设置协议类型,和服务端需要保持一致
remote XXX.XXX.XXX.XXX 11211 ## 设置服务器外网地址和端口
resolv-retry infinite ## 开启无限重试机制
nobind ## 不绑定本地网络端口
persist-key ## 设置持久化密钥
persist-tun ## 持久化虚拟端口
<ca>
--此处填写CA证书内容
</ca>

<cert>
--此处填写客户端证书内容
</cert>

<key>
--此处填写客户端私钥内容
</key>

comp-lzo ## 开启压缩传输
verb 3 ##设置日志等级

下载安装客户端

官网下载地址:https://openvpn.net/client/ ## 需要魔法哦
CSDN下载地址:https://download.csdn.net/download/KH_FC/90109869 ## 被检测到翻墙,无法下载了哦
gitee下载地址:https://gitee.com/blxtst/openvpn/raw/master/openvpn-connect-3.5.1.3946_signed.msi

其他下载方法:百度上也有很多可以下载的地方,我这里就不整理了 .

安装就下一步下一步安装即可,不需要额外的操作,安装完成后如下截图

>

导入配置文件

客户端选择upload file

点击底部BROWSE

选择你修改好的客户端配置文件

点击connect即可进行连接

连接成功截图

验证是否成功

ping openvpn服务器地址

1
ping 192.168.0.140

ping 服务器网关或服务器地址

1
ping 192.168.0.187

查看客户端获取到的地址和路由