提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

该文档是本人在搭建过程中,多次踩坑,以及阅读无数文章总结出的最完整的openvpn搭建过程,根据该教程可避免搭建过程中各种奇奇怪怪的报错

一、在linux上面搭建openvpn

1.准备工作

#临时关闭selinux
[root@yq-server ~]# setenforce 0
#配置文件永久关闭,修改 /etc/selinux/config文件
[root@yq-server ~]# vi /etc/selinux/config
SELINUX=disabled
[root@yq-server ~]# getenforce
Permissive

2.安装openvpn和easy-rsa

(1)安装epel仓库源
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
在这里插入图片描述
(2)安装openvpn
在这里插入图片描述
(3)安装easy-rsa在这里插入图片描述
(4)查看easy-rsa所在路径
在这里插入图片描述

3.虚拟专用证书制作

(1)准备工作
#切换路径
[root@yq-server ~]# cd /usr/share/easy-rsa/3
#初始化pki文件,在下图中可以看到pki文件,用来存放证书
[root@yq-server 3]# ./easyrsa init-pki在这里插入图片描述
(2)生成ca.crt根证书文件
在生成过程中需要输入两次根证书密码(后续会用到密码,请记忆),和common name通用名,设置合理即可,如果直接点击回车选默认通用名,后期可能会出现报错,建议在符合通用名规则的情况下进行命名。
[root@yq-server 3]# ./easyrsa build-ca
在这里插入图片描述生成文件路径:
/usr/share/easy-rsa/3/pki/ca.crt
(3)创建服务器端证书
在生成过程中需要输入两次根证书密码,和common name通用名,通用名设置区别于根证书通用名,生成server.req和server.key。nopass参数,表明服务端不需要进入密码。如果不加nopass参数,则每次重启openvpn服务端都要输入密码,建议添加,方便操作。本次openvpn搭建在加了nopass的基础上进行。
[root@yq-server 3]# ./easyrsa gen-req server nopass
在这里插入图片描述
生成文件路径:
/usr/share/easy-rsa/3/pki/reqs/server.req
/usr/share/easy-rsa/3/pki/private/server.key
(4)签约服务端证书
这里我们要根据提示输入yes和ca根证书密码,生成server.crt
[root@yq-server 3]# ./easyrsa sign server server
在这里插入图片描述
生成文件路径:
/usr/share/easy-rsa/3/pki/issued/server.crt
(5)创建客户端证书
根据提示输入两次密码,同时设置通用名,生成文件client.req和client.key
[root@yq-server 3]# ./easyrsa gen-req client在这里插入图片描述
生成文件路径:
/usr/share/easy-rsa/3/pki/reqs/client.req
/usr/share/easy-rsa/3/pki/private/client.key
(6)签约客户端证书
这里需要根据提示输入yes和ca根证书密码,生成证书client.crt在这里插入图片描述
生成文件路径:
/usr/share/easy-rsa/3/pki/issued/client.crt
(7)创建Diffie-Hellman文件
密钥交换时的Diffie-Hellman算法,确保key穿越不安全网络的命令,这里可能需要点时间才能执行完,最后生成dh.pem
在这里插入图片描述
生成文件路径:
/usr/share/easy-rsa/3/pki/dh.pem
(8)创建TLS认证密钥
#切换至/etc/openvpn/,
[root@yq-server openvpn]#openvpn --genkey --secret /etc/openvpn/ta.key
生成文件路径:
/etc/openvpn/ta.key
以上就是所需证书的全部制作过程。

4.证书配置及拷贝

(1)服务端配置
将服务所需端证书拷贝到/etc/openvn/
cp -r /usr/share/easy-rsa/3/pki/ca.crt /etc/openvpn/
cp -r /usr/share/easy-rsa/3/pki/issued/server.crt /etc/openvpn/
cp -r /usr/share/easy-rsa/3/pki/private/server.key /etc/openvpn/
cp -r /usr/share/easy-rsa/3/pki/dh.pem /etc/openvpn/
cp -r /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
#最后一条为服务端的配置文件
#编辑配置文件,下图为本次openvpn搭建的配置
[root@yq-server openvpn]# vi /etc/openvpn/server.conf
在这里插入图片描述
(2)客户端配置
将客户端所需端证书拷贝到/etc/openvn/
cp -r /usr/share/easy-rsa/3/pki/private/client.key /etc/openvpn/client/
cp -r /usr/share/easy-rsa/3/pki/issued/client.crt /etc/openvpn/client/
cp -r /usr/share/easy-rsa/3/pki/ca.crt /etc/openvpn/client/
cp -r /etc/openvpn/ta.key /etc/openvpn/client/
#客户端的配置文件,将其拷贝至/etc/openvpn/client,如果没有client文件,先在/etc/openvpn/
#下面创建
cp -r /usr/share/doc/openvpn/sample/sample-config-files/client.conf /etc/openvpn/client
#切换路径到/etc/openvpn/client
#修改文件后缀,客户端配置文件为.ovpn结尾
[root@yq-server client]# mv client.conf client.ovpn
#本次客户端配置文件在这里插入图片描述
#下面为客户端配置文件的基本信息
client #指定当前VPN是客户端
dev tun #使用tun隧道传输协议
proto tcp #使用tcp协议传输数据,与服务器端保持一致
remote 192.168.2.6 1194 #openvpn服务器IP地址端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
nobind #不绑定本地特定的端口号
ca ca.cr t#指定CA证书的文件路径
cert client.crt #指定当前客户端的证书文件路径
key client.key #指定当前客户端的私钥文件路径
verb 3 #指定日志文件的记录详细级别,0-9,等级越高日志内容越详细
persist-key
#通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun
#检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
remote-cert-tls server
tls-auth ta.key 1 #使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1
comp-lzo #使用lzo压缩的通讯,服务端和客户端都必须配置
auth-nocache #必须要添加auth-nocache,否则客户端会报错
Auth-user-pass #用户名密码方式登录时,添加该参数
(3)客户端文件打包
#切换路径到 /etc/openvpn/
#将客户端所需的密钥文件压缩
[root@yq-server openvpn]# zip client.zip ./client/*

在这里插入图片描述
#将其下载到windows系统里
[root@yq-server openvpn]# sz -y client.zip
#下载路径自己提前设置好
在这里插入图片描述

5.开机启动配置

#切换路径 /etc/openvpn
#新建文件夹名为server ,将服务器所需的配置文件全部拷贝到server里面
cp -r /etc/openvpn/ca.crt /etc/openvpn/server
cp -r /etc/openvpn/ta.key /etc/openvpn/server
cp -r /etc/openvpn/server.crt /etc/openvpn/server
cp -r /etc/openvpn/server.key /etc/openvpn/server
cp -r /etc/openvpn/server.conf /etc/openvpn/server
#修改配置文件如下图
[root@yq-server ~]# vim /usr/lib/systemd/system/openvpn-server@.service
在这里插入图片描述
[root@yq-server ~]# systemctl daemon-reload
[root@yq-server ~]# systemctl start openvpn-server@server.service
[root@yq-server ~]# systemctl enable openvpn-server@server.service
[root@yq-server ~]# systemctl status openvpn-server@server.service
#若没有报错,且显示"Initialization Sequence Completed",表明服务器启动成功
在这里插入图片描述

6.配置系统转发和开放端口

(1)云服务器开放端口
在云服务器中开放端口和协议
在这里插入图片描述
(2)开启内核转发
客户端要想跟内网通讯还需要openvpn服务端
[root@yq-server ~]# ]# echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
[root@yq-server ~]# sysctl -p
net.ipv4.ip_forward = 1
(3)修改iptables规则
设置nat转发,注:保证VPN地址池可路由出外网
#清空iptables规则(如果机器第一次安装iptables-services,没有增删过规则,可以不用执行此步骤)
[root@yq-server ~]#iptables -F
[root@yq-server ~]#iptables -F -t nat
[root@yq-server ~]#iptables -X
[root@yq-server ~]#service iptables save
[root@yq-server ~]#systemctl restart iptables
(4)转发请求上网
[root@yq-server ~]#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
#默认iptables是允许所有访问进入的,所以这条可以不用加(除非设置了INPUT默认是拒绝的规则)
[root@yq-server ~]#iptables -I INPUT -p tcp --dport 1194 -j ACCEPT
(5)保存规则并重启
[root@yq-server ~]#service iptables save
[root@yq-server ~]#systemctl restart iptables
(6)查看iptables转发规则
在这里插入图片描述

二、windows安装客户端软件

1、安装openvpn客户端
(1)双击软件包进行安装,点击I Agree进入下一步安装。
在这里插入图片描述
(2)点击Next继续下一步。
在这里插入图片描述
(3)选择文件安装路径,该路径后续会用到,为方便使用一般选默认,点击Install进行安装。
在这里插入图片描述
(4)openvpn客户端安装成功
在这里插入图片描述
在这里插入图片描述
2、放置client文件
(1)将client文件放入openvpn安装路径下的config文件夹在这里插入图片描述
在这里插入图片描述
3、连接openvpn
(1)右击桌面生成的openvpn软件,点击以管理员身份运行
在这里插入图片描述
(2)在桌面右下角找到openvpn图标,下图红色标出
在这里插入图片描述
(3)右击图标,选择连接
在这里插入图片描述
(4)输入私钥密码,点击确定进行连接
在这里插入图片描述
(5)连接成功后,openvpn图标显示绿色
在这里插入图片描述
4.连通性测试
(1)客户端ping服务器端网关,说明客户端到服务器之间可以通讯。
在这里插入图片描述
(3)若采用客户端之间可以相互访问模式,在/etc/openvpn/server.conf中将配置项client-to-client的注释去掉,使其生效。另外要关闭客户端的防火墙,否则客户端之间无法相互访问。
在这里插入图片描述
在这里插入图片描述

三、用户名密码方式登录

1.修改openvpn服务端配置文件
[root@yq-server ~]# 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.添加脚本
#切换路径 /etc/openvpn/
[root@yq-server openvpn]# touch check.sh
#新建脚本文件check.sh用来验证输入密码是否合法,编辑该脚本文件,将下面代码粘贴到check.sh文件里
[root@openvpn ~]# vi /etc/openvpn/check.sh

#!/bin/sh
###########################################################
PASSFILE="/etc/openvpn/psw-file"
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@yq-server openvpn]# chmod +x /etc/openvpn/check.sh
4.增加用户密码文件
在这里插入图片描述

#前面一项为用户名,后一项为密码,中间用空格隔开。
5.重启openvpn服务
[root@yq-server openvpn]#systemctl daemon-reload
[root@yq-server openvpn]#systemctl restart openvpn-server@server.service
6.修改客户端配置文件
修改客户端安装路径下的client.ovpn配置文件,在最后添加auth-user-pass
7.连接
在弹出的界面里输入用户名密码进行连接
在这里插入图片描述

四、固定IP

由于openvpn客户端拿到的IP地址是服务端随机分配的,因此需要远程ssh到终端时,它的ip地址会发生变化,因此需要给它固定IP。该方法基于用户名密码的登录方式。
方法如下:
(1)在服务端的配置文件server.conf中添加如下:
client-config-dir ccd;
#该项在配置文件内有,去掉注释使其生效,注意如果ccd与配置文件不在同一个文件夹下,请写清楚ccd的路径。
(2)在ccd目录下创建文件夹
#ccd文件夹实际不存在需要自行创建,另外还需在ccd文件夹下创建以客户端用户名为文件#名的文件,(比如你的登录用户名为:user,密码为:123456789,那么该文件名就为user)然后在文件中添加内容如下:
ifconfig-push 10.8.0.5 10.8.0.6
#前面为vpn本地IP地址,后面一个为vpn远程网关地址,可任意分配,
(3)修改完后重启服务器端进程。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐