基于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

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

相关推荐
平凡シンプル1 分钟前
TCP UDP 网络通信插件 SL-Uniplugin-Tcp-Udp
网络·学习·uniapp·记录
小程序设计3 分钟前
Easy-Shop商城小程序漏洞挖掘与防护研究
网络·安全
万联WANFLOW22 分钟前
TikTok Shop上线“Sell Across EU”,欧洲社交电商迎来生态重构
网络·业界资讯
liulilittle1 小时前
为什么采用全局管理缓存及状态:麻将客户端状态管理
服务器·网络·游戏·客户端·异步·mahjong·麻将
三8441 小时前
云安全· 01 · 云计算与云安全基础
网络安全·云计算·云安全
酣大智2 小时前
OSPF引入的直连路由在 ospf 路由表中看不到
网络·ospf
2601_966377132 小时前
等保2.0最新标准新增安全数据处理要求后怎么办?等保一体机数据安全模块来助力
运维·网络·安全·等保一体机
BullSmall2 小时前
window系统上报Cannot assign requested address
网络·功能测试
杨云龙UP2 小时前
MySQL Host is blocked because of many connection errors 导致 JDBC 连接失败排查与解决
linux·运维·网络·数据库·sql·mysql·登录失败
执念WRD2 小时前
Fastjson 1.2.83 RCE 漏洞利用
网络·安全·网络安全