基于Centos9部署OpenVP*

系统环境

操作系统 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.exampleEasy-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-serverweb-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

​ 在客户端上进行访问外网:

相关推荐
智链RFID2 小时前
RFID技术:企业效率革命新引擎
大数据·网络·人工智能·rfid
佩奇的技术笔记2 小时前
TCP Keep-Alive 和 HTTP Keep-Alive区别
网络协议·tcp/ip·http
Wcowin2 小时前
非对称密码
网络·密码学
航Hang*2 小时前
第六章:综合布线技术 —— 干线子系统的设计与施工
网络·笔记·学习·期末·复习
航Hang*2 小时前
第二章:综合布线技术 —— 综合布线常用器材和工具
网络·期末·复习
Exclusive_Cat2 小时前
先声医疗面经
网络
2503_946971863 小时前
【FullStack/ZeroDay】2026年度全栈魔法架构与分布式恶意节点清除基准索引 (Benchmark Index)
分布式·网络安全·架构·系统架构·区块链·数据集·全栈开发
llilian_163 小时前
时间同步校时服务器配件清单及挑选攻略 校时时间服务器 网络时间同步装置
运维·服务器·网络
DeepVis Research3 小时前
【BCI/Consensus】2026年度脑机接口协同与分布式共识机制基准索引 (Benchmark Index)
人工智能·网络安全·数据集·脑机接口·分布式系统
nvd113 小时前
通过 Gmail API 发送邮件的完整指南
服务器·网络