Centos 部署OpenVP* 证书+密码认证

导读:本篇文章讲解 Centos 部署OpenVP* 证书+密码认证,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、实验环境

主机        内网IP            外网IP              系统            备注
OpenVPN    10.5.10.202      NAT映射外网访问     Centos7        OpenVPN服务端
PC1        10.5.10.122       内网用户           Windows7 x64   客户端
PC2        10.5.10.123       内网用户           Windows10      客户端
PC3                          外网用户           Windows7 x64   客户端 

二、生成证书

1、添加epel yum源

[root@openvpn ~]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo

2、下载证书生成工具easy-rsa

[root@openvpn ~]# yum -y install easy-rsa

3、创建证书环境目录

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

4、修改vars配置文件,取消下面配置的注释

[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"

5、初始化,创建pki目录用于存储证书(以下都在/opt/easy-rsa目录下操作)

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

Centos 部署OpenVP* 证书+密码认证

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

[root@openvpn easy-rsa]# ./easyrsa build-ca

Centos 部署OpenVP* 证书+密码认证

 7、创建server端证书和密钥文件(nopass表示不加密密钥文件,生成过程中直接默认回车)

[root@openvpn easy-rsa]# ./easyrsa gen-req server nopass

Centos 部署OpenVP* 证书+密码认证

8、给server端证书签名

[root@openvpn easy-rsa]# ./easyrsa sign server server

Centos 部署OpenVP* 证书+密码认证

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

[root@openvpn easy-rsa]# ./easyrsa gen-dh

Centos 部署OpenVP* 证书+密码认证

10、创建client端证书和密钥文件(nopass表示不加密密钥文件,生成过程中直接默认回车)

[root@openvpn easy-rsa]# ./easyrsa gen-req client nopass

Centos 部署OpenVP* 证书+密码认证

 11、给client端证书签名

[root@openvpn easy-rsa]# ./easyrsa sign client client

Centos 部署OpenVP* 证书+密码认证

三、OpenVPN服务端部署

1、安装openvpn

[root@openvpn ~]# yum install -y openvpn

2、创建TLS认证密钥

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

3、创建新的配置文件/etc/openvpn/server.conf

[root@openvpn ~]# vi /etc/openvpn/server.conf
#监听本机端口
port 1194
#指定采用的传输协议,可选tcp或udp
proto tcp
#指定创建的通信隧道类型,可选tun或tap
dev tun
#指定CA证书的文件路径
ca ca.crt
#指定服务器端的证书文件路径
cert server.crt
#指定服务器端的私钥文件路径
key server.key
#指定迪菲赫尔曼参数的文件路径,也就是交换证书
dh dh.pem
#给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
server 10.8.0.0 255.255.255.0
#允许客户端访问内网网段
push "route 10.5.10.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

4、拷贝证书到openvpn主配置文件目录下

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

5、设置开机启动,检查服务端口

[root@openvpn ~]# systemctl start openvpn@server
[root@openvpn ~]# systemctl status  openvpn@server

Centos 部署OpenVP* 证书+密码认证四、OpenVPN客户端部署

1、win7客户端安装,默认安装(openvpn客户端需要.net支持,网络正常会自动安装)

Centos 部署OpenVP* 证书+密码认证

Centos 部署OpenVP* 证书+密码认证

2、win10安装,默认安装(openvpn客户端需要.net支持,网络正常会自动安装)

Centos 部署OpenVP* 证书+密码认证

 Centos 部署OpenVP* 证书+密码认证

3、拷贝服务端生成的证书到openvpn客户端安装目录的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

4、在客户端openvpn安装目录的config目录下,新建一个client.ovpn文件,写入配置

#指定当前VPN是客户端
client
#使用tun隧道传输协议
dev tun
#使用udp协议传输数据
proto tcp
#openvpn服务器IP地址端口号
remote 10.5.10.202 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

Centos 部署OpenVP* 证书+密码认证

 5、启动Open VPN客户端软件,连接成功OpenVPN的图标会变成绿色

win7连接成功

Centos 部署OpenVP* 证书+密码认证

 win10连接成功

Centos 部署OpenVP* 证书+密码认证

 OpenVPN会分配一个IP地址给客户端,客户端会使用该虚拟网络IP地址与服务端进行通信。

6、目前客户端只能ping虚拟网络的IP,不能跟内网其他主机互通

Centos 部署OpenVP* 证书+密码认证

五、OpenVPN客户端访问内网

1、客户端要想跟内网通讯还需要openvpn服务端开启内核转发

[root@openvpn ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@openvpn ~]# sysctl -p
net.ipv4.ip_forward = 1

2、方法一:添加路由规则方式访问内部网络

在内网主机上添加一条路由规则,让内网主机有回到OpenVPN客户端的路由。如果不添加,那内网主机只能接受到来自客户端的包,但是没法把响应的包传回去。

弊端:如果有成白上千台主机时,每一台主机都要添加路由规则,这样任务量是比较大的。

3、方法二:添加防火墙方式访问内部网络

在服务端开启防火墙,放行openvpn服务,并且开启masquerade

优点:只需在OpenVPN服务端配置防火墙规则,内部网络主机无需配置

[root@openvpn ~]# systemctl start firewalld
[root@openvpn ~]# firewall-cmd --add-masquerade --permanent
[root@openvpn ~]# firewall-cmd --add-service=openvpn --permanent
[root@openvpn ~]# firewall-cmd --add-port=1194/tcp --permanent
[root@openvpn ~]# firewall-cmd --reload

六、证书+密码认证

1、修改OpenVPN服务端配置文件

#在最后增加以下配置
[root@openvpn ~]# vi /etc/openvpn/server.conf
#允许使用自定义脚本
script-security 3
#脚本路径
auth-user-pass-verify /etc/openvpn/check.sh via-env
#用户密码登陆方式验证
username-as-common-name

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

2、添加脚本

[root@openvpn ~]# vi  /etc/openvpn/check.sh
#!/bin/sh
###########################################################
PASSFILE="/etc/openvpn/openvpnpass"
LOG_FILE="/var/log/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

3、增加执行权限

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

4、增加用户密码文件

[root@openvpn ~]# vi /etc/openvpn/openvpnpass
openvpn openvpn@123

5、重启openvpn服务

[root@openvpn ~]# systemctl restart openvpn@server

6、修改客户端安装路径config目录下的client.opvn配置文件,在最后增加

auth-user-pass

Centos 部署OpenVP* 证书+密码认证

 Centos 部署OpenVP* 证书+密码认证

七、出口防火墙设置

1、在出口设备配置映射,映射openvpn 1194端口到公网,允许用户通过对应的公网地址+端口访问

Centos 部署OpenVP* 证书+密码认证

2、修改客户端的client.ovpn文件,把远程地址改为公网IP+端口

#openvpn服务器IP地址端口号
remote 公网IP 1194

3、客户端退出重新登录即可

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95147.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!