前言:
文档介绍的openvpn模式是针对端(终端PC)到点(企业网络)的搭建指南,搭建完成后的效果是,满足移动办公用户连接到企业内网,访问内网资源。

一、安装前材料准备

1、VMware vSphere ESXi 6.5版本至8.0版本(安装在物理服务器内);或者VMware Workstation 14至17等版本都是可以的。(软件形式安装在Windows 7 10 11系统内);如果是个人搭这玩用VMware Workstation即可;VMware vSphere ESXi和VMware Workstation安装自行百度一大堆的。

下站镜像地址可使用如下链接,小编搭建测试的环境是企业版VMware vSphere
ESXi 6.5版:ESXi-6.5.0-20170702001-Standard
https://customerconnect.vmware.com/cn/downloads/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/6_5
1
1、 VMware所有产品下载主页
https://customerconnect.vmware.com/cn/downloads/#all_products
2
2、 VMware Workstation Pro下载主页(密钥自己去百度一下多的是):
https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/17_0
3
3、 VMware vSphere 下载主页(密钥自己去百度一下多的是):https://customerconnect.vmware.com/cn/downloads/info/slug/datacenter_cloud_infrastructure/vmware_vsphere/8_0
4

2、OpenVPN客户端:下载主页:

https://openvpn.net/client-connect-vpn-for-windows,小编使用的是openvpn-connect2.7.1版本

1、openvpn-connent3.3.6版本(适用于 Windows 7、8、10 和 11):https://swupdate.openvpn.net/downloads/connect/openvpn-connect-3.3.6.2752_signed.msi

2、openvpn-connect2.7.1版本(适用于 Windows 7、8、10):https://swupdate.openvpn.net/as/clients/openvpn-connect-2.7.1.111_signed.msi

3、CentOS 7.0~7.9系列版本的镜像,作为服务端;

下载镜像地址可使用如下镜像源,小编提供五个链接都可以下载,我用的镜像是:CentOS-7-x86_64-DVD-2207-02.iso。

1、 NAS(小编的群辉):https://ypcloud.space:5001/sharing/PdlHDze6S ; 密码:pingpassed
2、 阿里云镜像站:https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso
3、 清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso
4、 中科大镜像站:http://iso.mirrors.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso
5、 腾讯云镜像站:https://mirrors.cloud.tencent.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2207-02.iso
④、Windows 10 PC作为客户端
⑤、MobaXterm(配置openvpn时需要使用)
官网下载地址:https://download.mobatek.net/2232022120824733/MobaXterm_Portable_v22.3.zip(免安装)

二、在VMware vSphere ESXi 6.5系统内安装Centos 7.0系统

1、上传Centos 7.0镜像到VMware vSphere ESXi 6.5存储内;

5

2、新建虚拟机

6
7
8

3、虚拟硬件配置根据自己硬件配置给:建议CPU2核;内存2G(2048MB);硬盘66GB,CD/DVD驱动器1选择:数据存储ISO文件,选择刚刚上传的Centos 7.0镜像;

9
10

4、选择刚刚新加的OpenVPN服务端设备,打开电源

11

5、选择第一个Install CentOS 7(白色是选中的颜色)

12

6、敲完回车后不要动键盘,等他跑码跑完;

13

7、语言选择:中文-简体中文(中国)

14

8、根据黄色提示先选择安装位置

15

9、选择66GiB磁盘点击完成

16

10、设置网络和主机名

17

11、修改主机名:openvpn;开启以太网(ens160),如果内网是DHCP的,开启后回拿到IP,不是DHCP,需要点击配置手动固定IP。

18
19

12、配置保存后开启以太网,内网找台电脑开长ping,通了在进行点击:完成

20

13、然后点击:开始安装

21

14、用户设置:设置root密码

22

15、等待安装完成服务端就部署好了

23

16、系统安装完成后点击:重启

24

17、重启完成后输入账户:root;刚刚设置的root密码,进入系统

25

18、测试能否上网,发现不能上网,ip addr 看不到IP应该是ONBOOT关闭了,我们进去网卡配置开启。

vi /etc/sysconfig/network-scripts/ifcfg-ens160

26

19、鼠标选择窗口,按键盘i键,进去输入模式,把BOOTROTO改成=static,ONBOOT改成=yes,新加俩个DNS,配置完按ESC,在按Shift+:,输入wq回车保存。

27

20、然后重启网络服务即可

service network restart

28

21、然后ping百度域名测试上网,网路正常后,我们进行openvpn配置。

ping www.baidu.com

29

三、开始配置OpenVPN相关步骤

1、打开MobaXterm

30
31
32

2、关闭selinux

sed -i '/^SELINUX/s/enforcing/disabled/g' /etc/selinux/config
setenforce 0  

33

3、安装epel仓库,openvpn, Easy-RSA

yum -y install epel-release && yum -y install openvpn easy-rsa    

34
35

4、 在/etc/openvpn文件夹下创建easy-rsa文件夹。

cd /etc/openvpn/
ll

36

mkdir easy-rsa
ll

37

5、 将第3步的Rasy-RSA文件复制进这个文件夹

cd /    #退回根目录
cd /usr/share/easy-rsa/   #进去文件夹
ll     #查看该文件夹下有哪些文件(看这里是为了确认自己的easy-rsa是多少版本的,需要看一下,比如我的是3,0,8版本,在复制代码时,改成自己的版本,不然会报错,找不到该文件或者目录)
cp -r /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
cp -p /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

38

6、 创建openvpn的CA密钥;server端密钥;client端密钥;DH和CRL PEM;TLS认证要是ta.key

6.1、 先进入/etc/openvpn/easy-rsa/这个目录
cd /etc/openvpn/easy-rsa/

39

6.2、 创建并初始化CA证书(创建服务端和客户端密钥之前,需要初始化pki目录)
./easyrsa init-pki

40

./easyrsa build-ca nopass

41

6.3、创建服务器密钥,创建服务器密钥名称为:pingpassed.key定义,nopass:不需要给密钥添加密码)
./easyrsa gen-req pingpassed nopass

42

6.4、用CA证书签署pingpassed.key密钥
./easyrsa sign-req server pingpassed

44

6.5、创建客户端密钥,名称为:pingpassedclient.key(名称自己定义)
./easyrsa gen-req pingpassedclient nopass

45

6.6、用CA证书签署pingpassedclient.key密钥
./easyrsa sign-req client pingpassedclient

46

6.7、创建DH密钥(2048位密钥)
./easyrsa gen-dh

47

6.8、创建openvpn的TLS认证密钥
openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key

48

7、 生成crl密钥(如果这是旧服务器,设备内已经有客户端证书,想删掉某个密钥,只需要使用这条命令:./easyrsa revoke NAME)

./easyrsa  gen-crl

49

8、 复制证书ca.crt;服务端证书pingpassed.crt;服务端密钥pingpassed.key;ta.key文件到/etc/openvpn/server文件夹中

cp -p pki/ca.crt /etc/openvpn/server/
cp -p pki/issued/pingpassed.crt /etc/openvpn/server/
cp -p pki/private/pingpassed.key /etc/openvpn/server/
cp -p ta.key /etc/openvpn/server/

49

9、 复制CA证书;ta.key;客户端证书pingpassedclient.crt;客户端密钥pingpassedclient.key文件到/etc/openvpn/client文件夹中

cp -p pki/ca.crt /etc/openvpn/client/
cp -p pki/issued/pingpassedclient.crt /etc/openvpn/client/
cp -p pki/private/pingpassedclient.key /etc/openvpn/client/
cp -p ta.key /etc/openvpn/client/

50

10、 复制dh.pem;crl.pem文件到/etc/openvpn/client文件夹中

cp pki/dh.pem /etc/openvpn/server/
cp pki/crl.pem /etc/openvpn/server/

51

11、 修改openvpn服务端配置文件

11.1、进去/usr/share/doc查看系统安装的openvpn版本,后面贴代码需要用,需要使用自己的版本,不然会提示,找不到该文件或者目录
cd /usr/share/doc/
ls

52

11.2、复制服务端配置模板server.conf文件到/etc/openvpn/server文件夹中
cp -p /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/server/

53

11.3、查看当前服务端生效的默认配置信息
cd /etc/openvpn/server/
cat server.conf |grep '^[^#|^;]'   

54

11.4、使用vi编辑server.conf文件,修改配置:
vi server.conf

55

11.5、用vi server.conf命令进入文件后,(不要按 i 键)直接输入dG,清空配置,然后再按 i 键,复制下面的配置粘贴进去,然后按ESC,再按Shfit+:,输入wq即可。

56

port 1194
proto udp
dev tun
ca ca.crt
cert pingpassed.crt  #你的服务端证书名称
key pingpassed.key  # 你的服务端密钥名称
dh dh.pem
crl-verify crl.pem
server 10.8.0.0 255.255.255.0  #PC端虚拟网卡获取的IP,跟内网不能冲突
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp" #客户端全流量给vpn的虚拟网关
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 210.22.70.3"  # DNS写你服务器本地运营商的DNS
push "dhcp-option DNS 210.22.84.3"
push "dhcp-option DNS 114.114.114.114"
duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 100
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
log-append  openvpn.log
verb 3
explicit-exit-notify 1

12、修改内核模块,开启转发

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

57

13、修改防火墙策略,查看端口命令如下:

ip addr

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --add-interface=tun0
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s  10.8.0.0/24 -o ens192 -j MASQUERADE  
#网段是你电脑虚拟网卡获取的网段;端口:ens192是你对外发布业务的网口名称
firewall-cmd --reload

58

14、启动服务并设置开机自启

systemctl enable openvpn-server@server
systemctl start openvpn-server@server

59

15、因为CentOS 7系统默认未安装netstat,无法查看openvpn端口是否正常开启,我们使用下面这条命令安装一下

yum install net-tools

60

16、在使用netstat命令查看服务是否正常

netstat -tlunp

61

systemctl status openvpn-server@server

62

17、修改openvpn客户端配置文件

cd /etc/openvpn/client/
cp -p /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf /etc/openvpn/client/

63

18、查看当前客户端生效的默认配置信息

cat client.conf |grep '^[^#|^;]'

64

19、使用vi编辑client.conf文件

vi client.conf

65

20、用vi client.conf命令进入文件后,(不要按 i 键)直接输入dG,清空配置,然后再按 i 键,复制下面的配置粘贴进去,然后按ESC,再按Shfit+:,输入wq即可。

client
dev tun
proto udp
remote my-server 21194  #my-server是你公网映射后的公网地址,21194是外网端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert pingpassedclient.crt  #你的客户端证书名称
key pingpassedclient.key   #你的客户端密钥名称
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

21、因为Centos 7.0系统初始没有安装压缩工具,我们使用下面这条命令安装压缩工具。

yum -y install lrzsz

66

22、然后再更改客户端client.conf配置文件名称为client.ovpn

cd /etc/openvpn/
mv client/client.conf client/client.ovpn

67

23、使用上面安装好的lrzsz工具打包client文件夹

cd client/  
ll

68

cd ..  #返回到/etc/openvpn目录
tar -zcvf client.tar.gz client

69

24、利用MobaXterm侧边栏功能把打包好的client.tar.gz文件下载下来

70

25、使用Windows 10 PC测试连接Open VPN

安装好打开的软件,点击右下角添加按钮 71 ,选择FILE导如.OVPN文件的方式。
72
73
74
75
76
77

26、至此关于OpenVPN的搭建和功能验证就完成了。

四、进阶版:账户密码认证+CA证书认证

配置步骤:https://cloud.tencent.com/developer/article/1871073
系统镜像:CentOS-7-x86_64-DVD-2009.iso
账户密码认证配置:https://eddieeo.github.io/2017/05/30/f6c8d148.html

1、修改OpenVPN服务端配置文件server.conf,执行以下命令:

vim /etc/openvpn/server.conf  # 打开server.conf配置文件编辑

2、在配置文件server.conf的末尾追加下面的配置信息。

# use username and password login
# 新加此行,开启密码验证脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env

# 加上client-cert-not-required代表只使用用户密码方式验证登录,不加则代表需要证书和用户名密码双重验证登录
client-cert-not-required

# 新加此行,使用客户提供的UserName作为Common Name
username-as-common-name

# 该指令提供对OpenVPN使用外部程序和脚本的策略级别的控制。较低的 水平 值更具限制性,较高的值更宽松。级别设置 
# 0- 完全不调用外部程序。
# 1- (默认)仅调用内置可执行文件,例如ifconfig,ip,route或netsh。
# 2- 允许调用内置的可执行文件和用户定义的脚本。
# 3- 允许通过环境变量将密码传递给脚本(可能不安全)。
# 特别注意如果没有这个配置项会导致服务端校验密码时无法获取到密码,导致校验失败
script-security 3

3、增加密码验证脚本

vim /etc/openvpn/checkpsw.sh

编写OpenVPN服务端验证密码的脚本(checkpsw.sh),执行以下命令:

#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
###########################################################

PASSFILE="/etc/openvpn/user_passwd.txt"     #账号密码配置文件路径
LOG_FILE="/var/log/openvpn.log"     #账户登录日志路径
TIME_STAMP=`date "+%Y-%m-%d %T"`

if [ ! -r "${PASSFILE}" ]; then
  echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  exit 1
fi

CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

if [ "${CORRECT_PASSWORD}" = "" ]; then 
  echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  exit 1
fi

if [ "${password}" = "${CORRECT_PASSWORD}" ]; then 
  echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  exit 0
fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1

为密码验证脚本checkpsw.sh添加可执行性权限,执行以下命令:

chmod +x /etc/openvpn/checkpsw.sh

配置账号/密码文件user_passwd.txt的内容,新增账号/密码到这个文件,一行一个账号,账号密码用空格隔开:注:密码需要使用字母加数字,特殊字符等,且不能以数字开头

vim /etc/openvpn/user_passwd.txt           # 编辑账号密码文件,添加以下内容
openvpnuser1   openvpnpwd1
openvpnuser2   openvpnpwd2

# 修改账号密码文件的访问权限,第一是为了安全起见,第二是启动OpenVPN服务端的用户(默认是openvpn用户)必须对账号密码文件具有可读权限
cd /etc/openvpn/
chmod +x user_passwd.txt
chown openvpn.openvpn user_passwd.txt

重启openvpn服务

systemctl restart openvpn@server

只需要密码认证配置如下:

修改客户端配置,打开client.ovpn,注释掉客户端密钥认证方式,最后一行新增账号/密码验证方式

#cert laptop.crt
#key laptop.key
auth-user-pass

服务器(server.conf)对应配置:

auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
client-cert-not-required
username-as-common-name
script-security 3

即需要密码认证也需要证书双重认证配置如下:

修改客户端配置,打开client.ovpn,最后一行新增账号/密码验证方式

auth-user-pass

服务器(server.conf)对应配置:

auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
username-as-common-name
script-security 3

五、进阶版:将crt;key合并到ovpn客户端配置文件中:

1、编辑client.ovpn客户端配置文件(不需要修改服务器client文件夹下的.conf文件也能生效:如果是初次部署,可以修改好下载下来使用,下列步骤针对于修改本地已经下载好的文件)

2、打开.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
并在(#tls-auth ta.key 1)下方一行加上:key-direction 1
#一定得加上这一行代码,否则连不上服务器,PS:key-direction 1:表示密钥交换方向为从本地到远程主机)

3、在最后面添加以下内容:

<ca>

将ca.crt文件内所有内容复制到<ca> </ca>中间

</ca>
<cert>

将client.crt文件内所有内容复制到<cert> </cert>中间

</cert>
<key>

将client.key文件内所有内容复制到<key> </key>中间

</key>
<tls-auth>

将ta.key文件内所有内容复制到<tls-auth> </tls-auth>中间

</tls-auth>