openvpn搭建
该文档是本人在搭建过程中,多次踩坑,以及阅读无数文章总结出的最完整的openvpn搭建过程,根据该教程可避免搭建过程中各种奇奇怪怪的报错。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
openvpn搭建过程+证书+用户名密码登陆+固定IP
前言
该文档是本人在搭建过程中,多次踩坑,以及阅读无数文章总结出的最完整的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)修改完后重启服务器端进程。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)