系统环境
| 操作系统 | ip地址1 | ip地址2 |
|---|---|---|
| Centos9 | 192.168.6.10/24 | NAT网卡自动获取 |
PS:IP地址2用作VP*对外地址,用于下载镜像包与测试。
配置证书
修改主机名为OpenVP*:
bash
[root@localhost ~]# hostnamectl hostname openvpn
[root@localhost ~]# bash
[root@openvpn ~]#
VP*对外网卡配置IP地址:
bash
[root@openvpn ~]# nmcli connection modify ens160 ipv4.address 192.168.6.10/24 ipv4.method manual ipv4.gateway 192.168.6.1 ipv4.dns 192.168.6.1
[root@openvpn ~]# nmcli con up ens160
NAT网卡自动获取IP地址配置:
bash
[root@openvpn ~]# nmcli connection add type ethernet con-name ens224 ifname ens224 autoconnect yes
下载OpenVP*相关软件仓库源
bash
[root@openvpn ~]# yum -y install epel-release
下载证书生成工具:
bash
[root@openvpn ~]# yum -y install easy-rsa
创建存放证书目录:
bash
[root@openvpn ~]# mkdir -p /opt/easy-rsa
[root@openvpn ~]# cp -a /usr/share/easy-rsa/3.2.1/* /opt/easy-rsa/
[root@openvpn ~]# cp -a /usr/share/doc/easy-rsa/vars.example /opt/easy-rsa/vars
PS:
/usr/share/easy-rsa 目录通常包含 Easy-RSA 软件的配置模板、脚本和示例文件。
/usr/share/doc/easy-rsa-3.0.8/vars.example 是 Easy-RSA 3.x 版本中主配置文件 vars 的示例文件 ,其作用是让你快速创建并自定义自己的 vars 配置文件,从而控制证书生成的各项参数
修改vars配置文件,取消下列内容的配置:
bash
[root@openvpn ~]# vi /opt/easy-rsa/vars
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "GuangDong"
set_var EASYRSA_REQ_CITY "GuangZhou"
set_var EASYRSA_REQ_ORG "IT"
set_var EASYRSA_REQ_EMAIL "IT@qq.com"
set_var EASYRSA_NS_SUPPORT "yes"
初始化证书,创建pki目录用户存储证书:
bash
[root@openvpn ~]# cd /opt/easy-rsa/
[root@openvpn easy-rsa]# ./easyrsa init-pki

创建根证书:
bash
[root@openvpn easy-rsa]# ./easyrsa build-ca

创建server端证书和密钥文件
bash
[root@openvpn easy-rsa]# ./easyrsa gen-req server nopass
PS:
nopass:表示不加密密钥文件。
gen-req:generate request 的缩写,意为生成证书请求。
server:这为你即将生成的证书请求和密钥文件命名(例如生成 server.key, server.req)。这个名称通常用来标识其用途,例如 openvpn-server、web-server等。
nopass:生成无密码保护的私钥。这对于需要自动启动的服务(如OpenVP*、Nginx)至关重要,否则每次服务重启都需手动输入私钥密码。
生成两个文件:①pki/private/server.key;②pki/reqs/server.req

对server端的证书进行签名:
bash
[root@openvpn easy-rsa]# ./easyrsa sign server server
sign:用 CA 的私钥对请求文件进行数字签名。
第一个server:指定要签发的证书类型为 server。这会自动为证书附加服务器用途所需的扩展属性(如 serverAuth)。
第二个server:指定要签发的证书请求文件名称。它对应您之前执行 ./easyrsa gen-req server nopass 时生成的 pki/reqs/server.req 文件。

创建Diffe-Hellmen文件,密钥交换时的Diffe-Hellman算法。
bash
[root@openvpn easy-rsa]# ./easyrsa gen-dh
PS:需要等几十分钟

创建client端证书和密钥文件:
bash
[root@openvpn easy-rsa]# ./easyrsa gen-req client nopass
gen-req:generate request 的缩写,意为生成证书请求。

为client端证书签名:
bash
[root@openvpn easy-rsa]# ./easyrsa sign client client

配置OpenVP*服务端
安装OpenVP*:
bash
[root@openvpn easy-rsa]# yum -y install openvpn
创建TLS认证密钥:
bash
[root@openvpn easy-rsa]# openvpn --genkey --secret /etc/openvpn/ta.key
--genkey --secret :生成一个密钥,并指定它为"静态密钥"(即预共享密钥)。
/etc/openvpn/ta.key:将生成的密钥文件保存到系统的 OpenVP* 配置目录下,并命名为 ta.key。
作为: VP* 服务的 "第二道门禁" 。客户端和服务器都必须持有完全相同的 ta.key 文件才能建立连接。

配置openvp*文件:
bash
[root@openvpn easy-rsa]# cd
[root@openvpn ~]# vi /etc/openvpn/server/server.conf
EOF
#监听本机端口
port 1194
#指定采用的传输协议,可选tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca ca.crt
#指定服务器端的证书文件路径
cert server.crt
#指定服务器端的私钥文件路径
key server.key
#指定DH参数的文件路径,也就是交换证书
dh dh.pem
#给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
server 172.16.1.0 255.255.255.0
#允许客户端访问内网网段
push "route 192.168.6.0 255.255.255.0"
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址"第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP"
ifconfig-pool-persist ipp.txt
#存活时间,10秒ping一次,120如未收到响应则视为断线
keepalive 10 120
#最多允许100个客户端连接
max-clients 100
#日志记录位置
status openvpn-status.log
#openvpn版本
verb 3
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
#openvpn日志记录位置
log /var/log/openvpn.log
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的.否则网络会先linkdown然后再linkup
persist-tun
#开启TLS-auth,使用ta.key防御攻击.服务器端的第二个参数值为0,客户端的为1
tls-auth /etc/openvpn/ta.key 0
#开启多人同时登录
duplicate-cn
#允许使用自定义脚本
script-security 3
#脚本路径
auth-user-pass-verify /etc/openvpn/check.sh via-env
#用户密码登陆方式验证:加上client-cert-not-required则代表只使用用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录
username-as-common-name
#绑定客户端IP
client-config-dir /etc/openvpn/ccd
EOF
拷贝证书到OpenVP*主配置目录下:
bash
[root@openvpn ~]# cp -a /opt/easy-rsa/pki/ca.crt /etc/openvpn/server/
[root@openvpn ~]# cp -a /opt/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
[root@openvpn ~]# cp -a /opt/easy-rsa/pki/private/server.key /etc/openvpn/server/
[root@openvpn ~]# cp -a /opt/easy-rsa/pki/dh.pem /etc/openvpn/server/
创建并配置客户端配置目录:
bash
[root@openvpn ~]# mkdir /etc/openvpn/ccd
[root@openvpn ~]# vi /etc/openvpn/ccd/client
EOF
ifconfig-push 172.16.1.10 255.255.255.0
EOF
创建认证脚本:
bash
[root@openvpn ~]# vi /etc/openvpn/check.sh
EOF
#!/bin/bash
# /etc/openvpn/check.sh
# 从环境变量获取用户名和密码
USERNAME="$username"
PASSWORD="$password"
# 检查凭据文件(示例使用/etc/openvpn/credentials文件)
# 文件格式:username:password(每行一个用户)
CREDENTIALS_FILE="/etc/openvpn/credentials"
# 验证逻辑
if [ -f "$CREDENTIALS_FILE" ]; then
if grep -q "^$USERNAME:$PASSWORD$" "$CREDENTIALS_FILE"; then
exit 0 # 认证成功
fi
fi
exit 1 # 认证失败
EOF
[root@openvpn ~]# chmod 755 /etc/openvpn/check.sh
#设置脚本权限
创建凭据文件:
bash
[root@openvpn ~]# vi /etc/openvpn/credentials
EOF
user1:password1
user2:password2
EOF
启动OpenVP*服务:
bash
[root@openvpn ~]# systemctl start openvpn-server@server.service
[root@openvpn ~]# systemctl enable openvpn-server@server.service
配置OpenVP*客户端
客户端:
| 操作系统 | ip地址 |
|---|---|
| Windows server 2022 | 192.168.6.100/24 |
在Windows主机上安装OpenVP*客户端:

安装完毕:

拷贝下述文件到客户端上OpenVP*安装目录的config目录下:
/opt/easy-rsa/pki/ca.crt
/opt/easy-rsa/pki/issued/client.crt
/opt/easy-rsa/pki/private/client.key
/etc/openvpn/ta.key
在客户端新建一个client.ovp*文件,写入下述配置:
#指定当前VPN是客户端
client
#使用tun隧道传输协议
dev tun
#使用udp协议传输数据
proto tcp
#openvpn服务器IP地址端口号
remote 192.168.6.10 1194
#断线自动重新连接,在网络不稳定的情况下非常有用
resolv-retry infinite
#不绑定本地特定的端口号
nobind
#指定CA证书的文件路径
ca ca.crt
#指定当前客户端的证书文件路径
cert client.crt
#指定当前客户端的私钥文件路径
key client.key
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
persist-tun
#使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1
tls-auth ta.key 1
#账号密码认证
auth-user-pass
文件内容如下:

右下角点击连接:

输入用户名和密码进行连接:

弹窗显示连接成功:

查看IP地址,已经分配了一个新的IP:

开启内网访问
通过NAT的方式使得内网之间能够进行互访:
[root@openvpn ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@openvpn ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@openvpn ~]# systemctl start firewalld.service
[root@openvpn ~]#
[root@openvpn ~]# firewall-cmd --permanent --add-masquerade
success
[root@openvpn ~]# firewall-cmd --permanent --add-service=openvpn
success
[root@openvpn ~]# firewall-cmd --permanent --add-port=1194/tcp
success
[root@openvpn ~]# firewall-cmd --reload
success
在客户端上进行访问外网:
