Centos 搭建OpenVP* 证书+多客户端+密码认证(0-1超详细版)

太白
2023-05-11 / 0 评论 / 0 点赞 / 2,077 阅读 / 10,080 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-05-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

需求:公司异地员工需要访问内部办公网服务器,所以需要搭建一个vpn提供异地员工使用,且每个员工可配置单独的账号。

一、环境


服务器系统:CentOS Linux release 7.9.2009 (Core)

安装操作基于root用户
防火墙禁用firewalld,采用iptables

OpenVpn版本:2.4.12

安装目录(默认):/etc/openvpn

Easy-rsa版本:3.0.8

安装目录(默认):/usr/share/easy-rsa

网络信息:

  • 办公网络公网IP:115.192.22.166
  • 路由器端口映射:允许公网1194端口 → 192.168.10.230的1194端口
  • OpenVPN服务器IP:192.168.10.230(内网)
  • 测试服务器IP:192.168.10.240(内网)
  • OpenVPN客户端虚拟网段:172.16.16.0/24

二、准备工作


对服务器的一些必要设置以及依赖安装,都需要在root账户下进行操作

1、关闭selinux

[root@openvpn ~]# sed -i '/^SELINUX/s/enforcing/disabled/g' /etc/selinux/config
[root@openvpn ~]# setenforce 0

2、防火墙更换成iptables(如果已经使用iptables,可忽略)

[root@openvpn ~]# systemctl stop firewalld.service 
[root@openvpn ~]# systemctl disable firewalld.service
[root@openvpn ~]# yum install iptables-services -y
[root@openvpn ~]# depmod -a
[root@openvpn ~]# modprobe ip_tables
[root@openvpn ~]# modprobe iptable_filter
[root@openvpn ~]# systemctl enable iptables
[root@openvpn ~]# systemctl start iptables

3、安装相关依赖、安装netstat(方便查看端口运行状态)

[root@openvpn ~]# yum -y install vim wget lrzsz gcc-c++ openssl openssl-devel net-tools lzo lzo-devel pam pam-devel
[root@openvpn ~]# yum -y install net-tools netstat

4、内核转发规则(也可手动编辑/etc/sysctl.conf文件)

[root@openvpn ~]# vim /etc/sysctl.conf
# 
# 如果有net.ipv4.ip_forward=0,则改成net.ipv4.ip_forward=1;如果没有,则直接添加
net.ipv4.ip_forward=1

5、使之生效

[root@openvpn ~]# sysctl -p

三、安装OpenVPN和EasyRSA


本教程采用yum安装

安装openvpn、easy-rsa

# 安装目录:/etc/openvpn
[root@openvpn ~]# yum -y install openvpn
# 安装目录:/usr/share/easy-rsa
[root@openvpn ~]# yum -y install easy-rsa

四、创建CA机构与服务器证书


当前的EsayRSA版本是3.0.8,所以如果你安装器是其他版本,注意版本替换

1、创建证书环境目录

[root@openvpn ~]# mkdir -p /etc/openvpn/easy-rsa
[root@openvpn ~]# cp -a /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa
[root@openvpn ~]# cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

2、修改vars配置文件

[root@openvpn ~]# vim /etc/openvpn/easy-rsa/vars
# 取消vars下面配置的注释,并按照自己填写
set_var EASYRSA_DN      "cn_only"
set_var EASYRSA_REQ_COUNTRY     "CN"
set_var EASYRSA_REQ_PROVINCE    "Zhejiang"
set_var EASYRSA_REQ_CITY        "Hangzhou"
set_var EASYRSA_REQ_ORG         "IT"
set_var EASYRSA_REQ_EMAIL       "IT@qq.com"
set_var EASYRSA_NS_SUPPORT      "yes"

3、初始化,创建pki目录用于存储证书

[root@openvpn ~]# cd /etc/openvpn/easy-rsa
[root@openvpn easy-rsa]# ./easyrsa init-pki

4、创建根证书,根证书用于ca对之后生成的server和client证书签名时使用

[root@openvpn easy-rsa]# ./easyrsa build-ca
# 第一步:提示设置密码(可选);
# 第二步:提示输入公司(直接回车);

5、创建server端证书和密钥文件(nopass表示不加密密钥文件)

[root@openvpn easy-rsa]# ./easyrsa gen-req openvpnserver nopass
# 仅一步:会提示输入公司(直接回车)

6、给server端证书签名

[root@openvpn easy-rsa]# ./easyrsa sign server openvpnserver
# 第一步:提示确认(输入 yes)
# 第二步:提示输入密码(如果在创建证书时设置了密码,则输入对应密码)

7、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法

[root@openvpn easy-rsa]# ./easyrsa gen-dh
# 等待完成即可

8、启用安全增强配置,创建TLS认证密钥

[root@openvpn ~]# openvpn --genkey --secret /etc/openvpn/server/ta.key

五、OpenVPN服务端配置


OpenVPN配置,我这边采用了1194端口

1、把前面创建的ca、证书都复制到server文件夹(非必需,为了归总才放到一起)

[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/issued/openvpnserver.crt /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/private/openvpnserver.key /etc/openvpn/server/
[root@openvpn ~]# cp /etc/openvpn/easy-rsa/pki/private/ca.key /etc/openvpn/server/

2、创建ipp.txt文件

[root@openvpn ~]# touch /etc/openvpn/server/ipp.txt
[root@openvpn ~]# chown openvpn:openvpn /etc/openvpn/server/ipp.txt

3、创建ccd文件目录(本教程不讲如何使用ccd,单纯创建)

[root@openvpn ~]# mkdir /etc/openvpn/server/ccd
[root@openvpn ~]# chown openvpn:openvpn /etc/openvpn/server/ccd

4、创建日志文件夹

[root@openvpn ~]# mkdir /etc/openvpn/logs/

5、添加密码认证脚本

[root@openvpn ~]# vi  /etc/openvpn/server/check.sh
##### ----------check.sh内容start----------(这一行不用复制)
#!/bin/sh
PASSFILE="/etc/openvpn/server/openvpnpass"
LOG_FILE="/etc/openvpn/logs/openvpn-password.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
##### ----------check.sh内容end----------(这一行不用复制)

6、增加执行权限

[root@openvpn ~]# chmod +x /etc/openvpn/server/check.sh 

7、增加用户密码文件

[root@openvpn ~]# vi /etc/openvpn/server/openvpnpass
##### ----------openvpnpass内容start-----------(这一行不用复制)
openvpn01	112233
openvpn02	223344
##### ----------openvpnpass内容end-----------(这一行不用复制)

8、创建openvpn配置文件

[root@openvpn ~]# vi /etc/openvpn/server.conf
##### ----------server.conf内容start----------(这一行不用复制)
#监听本机端口
port 1194
#指定采用的传输协议,可选tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca /etc/openvpn/server/ca.crt
#指定服务器端的证书文件路径
cert /etc/openvpn/server/openvpnserver.crt
#指定服务器端的私钥文件路径
key /etc/openvpn/server/openvpnserver.key
#指定迪菲赫尔曼参数的文件路径,也就是交换证书
dh /etc/openvpn/server/dh.pem
#给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
server 10.8.0.0 255.255.255.0
#允许客户端访问内网网段,后面加上vpn_gateway说明仅仅只能访问内网段流量
push "route 192.168.10.0 255.255.255.0 vpn_gateway"
# 设置客户端所有流量都通过openvpn(这里注释了)
push "redirect-gateway def1 bypass-dhcp"
# DNS 服务器配置,可以根据需要指定其他 dns(这里注释了)
push "dhcp-option DNS 192.168.10.1"
#服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址"第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP"
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
#存活时间,10秒ping一次,120如未收到响应则视为断线
keepalive 10 120
#最多允许30个客户端连接
max-clients 30
#openvpn版本
verb 3
#允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
client-to-client
#openvpn日志记录位置
log-append /etc/openvpn/logs/openvpn.log
status /etc/openvpn/logs/status.log
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的.否则网络会先linkdown然后再linkup
persist-tun
#开启TLS-auth,使用ta.key防御攻击.服务器端的第二个参数值为0,客户端的为1
tls-auth /etc/openvpn/server/ta.key 0
#开启多人同时登录
duplicate-cn
#允许使用自定义脚本
script-security 3
#脚本路径
auth-user-pass-verify /etc/openvpn/server/check.sh via-env
#用户密码登陆方式验证:加上client-cert-not-required则代表只使用用户名密码方式验证登录,如果不加,则代表需要证书和用户名密码双重验证登录
username-as-common-name
#绑定客户端IP
client-config-dir /etc/openvpn/server/ccd
##### ----------server.conf内容end----------(这一行不用复制)

六、启动OpenVPN


允许1194端口

1、允许tcp/udp 1194通过防火墙

[root@openvpn ~]# iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
[root@openvpn ~]# iptables -I INPUT -p udp --dport 1194 -j ACCEPT

2、配置iptables转发流量:修改iptables方式

# 第一条:从 NAT 表的开头插入一条规则,允许从 10.8.0.0/24 网段的源 IP 地址发送到 eth0 接口的所有流量,使用 MASQUERADE (伪装)技术,将源 IP 地址替换为公网 IP,以实现局域网主机通过 VPN 访问公网的功能。
# 参数说明:10.8.0.0 是虚拟网段
# 参数说明:eth0中 是服务器网卡名称
[root@openvpn ~]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

# 第二条:从 FORWARD 表的开头插入一条规则,允许经过 tun0 接口,从 10.8.0.0/24 网段的源 IP 地址发送到 eth0 接口的所有新连接通过(-m conntrack --ctstate NEW -j ACCEPT)。
# 参数说明:10.8.0.0 是虚拟网段
# 参数说明:eth0中 是服务器网卡名称
[root@openvpn ~]# iptables -I FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -m conntrack --ctstate NEW -j ACCEPT

# 第三条:从 FORWARD 表的开头插入一条规则,允许所有与已建立连接或 RELATED(相关连接) 的流量通过(-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT)。
[root@openvpn ~]# iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 其他说明:
# 如果你只需要让openvpn客户端访问openvpn服务端这台服务器,那么注释掉 第二条和第三条即可。

3、保存规则并重启防火墙

[root@openvpn ~]# service iptables save
[root@openvpn ~]# service iptables restart

4、服务启动【方式一】:直接启动服务(如使用此方式,则已完成,无需后续操作)

# 直接启动服务方式
[root@openvpn ~]# systemctl start openvpn@server
[root@openvpn ~]# systemctl enable openvpn@server

4、服务启动【方式二】:把OpenVPN配置系统服务,并设置开机启动(这里采用此方式)

4.1、创建系统服务的方式

[root@openvpn ~]# vim /etc/systemd/system/openvpn.service
##### ------------ openvpn.service内容start-------------(这一行不用复制)
[Unit]
Description=OpenVPN Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server.conf 
##### ------------ openvpn.service内容end-------------(这一行不用复制)

4.2、加载系统服务

[root@openvpn ~]# systemctl daemon-reload

4.3、启动服务、查看服务状态、查看端口情况

[root@openvpn ~]# systemctl start openvpn.service
[root@openvpn ~]# systemctl status openvpn.service
[root@openvpn ~]# netstat -tanulp | grep 3194

4.4、设置服务开机启动(如果启动服务没问题,则可设置成开机启动项)

[root@openvpn ~]# systemctl enable openvpn.service

七、客户端证书制作


用EsayRSA制作名为client01的客户端证书

1、进入esay-rsa目录

[root@openvpn ~]# cd /etc/openvpn/easy-rsa/

2、创建client端证书和密钥文件(nopass表示不加密密钥文件)

[root@openvpn easy-rsa]# ./easyrsa gen-req client01 nopass
# 仅一步:提示输入公司明(直接回车)

3、给client端证书签名

[root@openvpn easy-rsa]# ./easyrsa sign client client01
# 第一步:提示确认(输入 yes)
# 第二步:提示输入密码(如果在创建证书时设置了密码,则输入对应密码)

4、为了方便以后归总,复制client证书到client文件夹(非必要)

[root@openvpn easy-rsa]# cp /etc/openvpn/easy-rsa/pki/issued/client01.crt /etc/openvpn/client/
[root@openvpn easy-rsa]# cp /etc/openvpn/easy-rsa/pki/private/client01.key /etc/openvpn/client/

八、客户端配置测试


在需要使用的客户机上编写配置文件(这里在macos环境)

其中客户端实际需要使用的证书有四个:ca.crt、ta.key、client01.crt、client01.key

1、把这些文件复制到客户机上 “/Users/apple/openvpn_conf/opendev/” 目录下(目录可自定义)

2、创建一个配置文件名为 client.ovpn,并用文本形式进行编辑添加内容

# 指定当前VPN是客户端
client
# 使用tun隧道传输协议
dev tun
# 使用udp协议传输数据
proto tcp
# OpenVPN服务器IP地址端口号
remote 115.192.22.166 1194
# 断线自动重新连接,在网络不稳定的情况下非常有用
resolv-retry infinite
# 不绑定本地特定的端口号
nobind
# 指定CA证书的文件路径(也可采用<ca></ca>标签内复制证书内容方式到配置文件)
ca  /Users/apple/openvpn_conf/opendev/ca.crt
# 指定当前客户端的证书文件路径(也可采用<cert></cert>标签内复制证书内容方式到配置文件)
cert  /Users/apple/openvpn_conf/opendev/client01.crt
# 指定当前客户端的私钥文件路径(也可采用<key></key>标签内复制证书内容方式到配置文件)
key  /Users/apple/openvpn_conf/opendev/client01.key
#指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
verb 3
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-key
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
persist-tun
#使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1(也可采用<tls-auth></tls-auth>内包含证书内容到配置文件方式,需额外增加一行 key-direction 1)
tls-auth  /Users/apple/openvpn_conf/opendev/ta.key 1
#账号密码认证
auth-user-pass

3、下载并安装OpenVPN官方工具

macos:<https://openvpn.net/client-connect-vpn-for-mac-os/>
windows:<https://openvpn.net/client-connect-vpn-for-windows/>
linux:<https://openvpn.net/openvpn-client-for-linux/>

4、使用工具

4.1、把制作好的client.ovpn配置文件拖进工具
4.2、输入用户名和密码(密码是配置在服务器上/etc/openvpn/server/openvpnpass文件内)
4.3、All Finish

参考文章:
https://blog.csdn.net/qq_35222232/article/details/123680618
https://blog.csdn.net/m0_69013817/article/details/124589686

0

评论区