一、openVPN简介
VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。
OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。
二、openVPN服务端部署
1.环境准备
openvpn服务端: 10.0.0.61 内网: 172.16.1.61
后端内网资源: 172.16.1.0/网段
2.生成证书
#下载安装生成证书工具 [root@openvpn ~]# yum install -y easy-rsa #准备证书 [root@openvpn ~]# mkdir /opt/easy-rsa [root@openvpn ~]# cd /opt/easy-rsa [root@openvpn /opt/easy-rsa]# cp -a /usr/share/easy-rsa/3.0.7/* ./ [root@openvpn /opt/easy-rsa]# cp -a /usr/share/doc/easy-rsa-3.0.7/vars.example ./vars #编辑模板文件 [root@openvpn /opt/easy-rsa]# vim vars set_var EASYRSA_DN "cn_only" set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Shanghai" set_var EASYRSA_REQ_CITY "Shanghai" set_var EASYRSA_REQ_ORG "lx" set_var EASYRSA_REQ_EMAIL "lixian656@qq.com" set_var EASYRSA_NS_SUPPORT "yes" #初始化证书 [root@openvpn /opt/easy-rsa]# ./easyrsa init-pki #生成根证书 [root@openvpn /opt/easy-rsa]# ./easyrsa build-ca Enter New CA Key Passphrase: #设置密码, 最多四位数 Re-Enter New CA Key Passphrase: #确认密码 下一步回车即可 #生成服务端证书 [root@openvpn /opt/easy-rsa]# ./easyrsa gen-req server nopass 回车即可 #给服务端证书签名 [root@openvpn /opt/easy-rsa]# ./easyrsa sign server server 根据提示输入 yes 输入跟证书密码 #生成一个算法 [root@openvpn /opt/easy-rsa]# ./easyrsa gen-dh #创建客户端证书 [root@openvpn /opt/easy-rsa]# ./easyrsa gen-req client nopass #给客户端证书签名 [root@openvpn /opt/easy-rsa]# ./easyrsa sign client client #安装OpenVPN [root@openvpn /opt/easy-rsa]# yum install -y openvpn #配置OpenVPN(把以下内容写入进去) [root@openvpn /opt/easy-rsa]# vim /etc/openvpn/server.conf port 1194 #端口 proto udp #协议 dev tun #采用路由隧道模式tun ca ca.crt #ca证书文件位置 cert server.crt #服务端公钥名称 key server.key #服务端私钥名称 dh dh.pem #交换证书 server 10.8.0.0 255.255.255.0 #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同 push "route 172.16.1.0 255.255.255.0" #允许客户端访问内网172.16.1.0网段 ifconfig-pool-persist ipp.txt #地址池记录文件位置 keepalive 10 120 #存活时间,10秒ping一次,120 如未收到响应则视为断线 max-clients 100 #最多允许100个客户端连接 status openvpn-status.log #日志记录位置 verb 3 #openvpn版本 client-to-client #客户端与客户端之间支持通信 log /var/log/openvpn.log #openvpn日志记录位置 persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。 persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup duplicate-cn #拷贝证书 [root@openvpn /opt/easy-rsa]# cd /etc/openvpn/ [root@openvpn /etc/openvpn]# ll total 4 drwxr-x--- 2 root openvpn 6 2020-04-25 05:23 client drwxr-x--- 2 root openvpn 6 2020-04-25 05:23 server -rw-r--r-- 1 root root 1029 2020-05-27 10:38 server.conf [root@openvpn /etc/openvpn]# cp -a /opt/easy-rsa/pki/ca.crt ./ [root@openvpn /etc/openvpn]# cp -a /opt/easy-rsa/pki/issued/server.crt ./ [root@openvpn /etc/openvpn]# cp -a /opt/easy-rsa/pki/private/server.key ./ [root@openvpn /etc/openvpn]# cp -a /opt/easy-rsa/pki/dh.pem ./ [root@openvpn /etc/openvpn]# ll total 24 -rw------- 1 root root 1172 2020-05-27 10:20 ca.crt drwxr-x--- 2 root openvpn 6 2020-04-25 05:23 client -rw------- 1 root root 424 2020-05-27 10:26 dh.pem drwxr-x--- 2 root openvpn 6 2020-04-25 05:23 server -rw-r--r-- 1 root root 1029 2020-05-27 10:38 server.conf -rw------- 1 root root 4795 2020-05-27 10:23 server.crt -rw------- 1 root root 1708 2020-05-27 10:22 server.key #启动openvpn [root@openvpn /etc/openvpn]# systemctl -f enable openvpn@server.service [root@openvpn /etc/openvpn]# systemctl start openvpn@server.service
三、Windows客户端部署
1.安装openvpn客户端
2.导出证书
直接导出证书到openvpn目录会报错,可以先导出到桌面,然后拉到openvpn目录
openvpn目录在C:\Program Files\OpenVPN\config
openvpn目录在C:\Program Files\OpenVPN\config
[root@openvpn /etc/openvpn]# sz /opt/easy-rsa/pki/ca.crt [root@openvpn /etc/openvpn]# sz /opt/easy-rsa/pki/issued/client.crt [root@openvpn /etc/openvpn]# sz /opt/easy-rsa/pki/private/client.key
3.编写client.ovpn文件
直接在config不能创建文件,可以在桌面创建文件编写完成之后,移动到config目录中
注意:remote 10.0.0.61 1194 这个61ip地址是openvpn的地址
注意:remote 10.0.0.61 1194 这个61ip地址是openvpn的地址
client #指定当前VPN是客户端 dev tun #使用tun隧道传输协议 proto udp #使用udp协议传输数据 remote 10.0.0.61 1194 #openvpn服务器IP地址端口号 resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用 nobind #不绑定本地特定的端口号 ca ca.crt #指定CA证书的文件路径 cert client.crt #指定当前客户端的证书文件路径 key client.key #指定当前客户端的私钥文件路径 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
4.客户端启动openvpn
等待一段时间,这个小图标会变绿即启动openvpn成功
本地即可ping通openvpn服务端主机
本地即可ping通openvpn服务端主机
四、客户端OpenVPN访问内网网段
抓包分析数据包能抵达openVPN的内网地址,但无法与openVPN服务同内网网段主机进行通信,因为后端主机没有回10.8.0.0的路由,所以导致无法ping通,可以在后端主机增加一条抵达10.8.0.0的路由
服务端开启内核转发
[root@openvpn /etc/openvpn]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
方式一:添加一条路由规则
但如果主机过多,太麻烦,可以用第二种方法
[root@web01 ~]# route add -net 10.8.0.0/24 gw 172.16.1.61
方式二:添加防火墙规则
[root@openvpn /etc/openvpn]# systemctl start firewalld.service [root@openvpn /etc/openvpn]# firewall-cmd --add-masquerade --permanent success [root@openvpn /etc/openvpn]# firewall-cmd --add-service=openvpn --permanent success [root@openvpn /etc/openvpn]# firewall-cmd --reload success [root@openvpn /etc/openvpn]# firewall-cmd --list-all public target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client openvpn ports: protocols: masquerade: yes forward-ports: source-ports: icmp-blocks: rich rules:
测试可以ping通网段内的IP
五、双重身份验证登录openvpn客户端
Openvpn秘钥+用户名密码双重身份验证登录
为什么需要用户名密码验证登录,我们已经使用了CA证书、交换秘钥这几种方式进行加密了,可以说已经很安全了,为什么还要需要用户名密码呢。
首先安全还是很重要的,其次就是管理这些秘钥和证书还是比较麻烦的,如果用户量比较多,我们不可能为每个用户都创建一套加密,每个用户创建一个秘钥比较麻烦,但多人使用一个秘钥又不具有唯一性,比如说有用户不在需要VPN的时候,我们就只能吊销证书。但是如果多人使用一个秘钥的情况下,吊销证书了,其他的用户也登录不了。所以我们就需要秘钥加用户名和密码,这样就可以多个用户使用同一个证书,使用不同的用户名和密码。
新用户加入的时候,只需要添加一个用户名和密码,如果有人不需要VPN时,直接删除用户名和密码就可以了。
为什么需要用户名密码验证登录,我们已经使用了CA证书、交换秘钥这几种方式进行加密了,可以说已经很安全了,为什么还要需要用户名密码呢。
首先安全还是很重要的,其次就是管理这些秘钥和证书还是比较麻烦的,如果用户量比较多,我们不可能为每个用户都创建一套加密,每个用户创建一个秘钥比较麻烦,但多人使用一个秘钥又不具有唯一性,比如说有用户不在需要VPN的时候,我们就只能吊销证书。但是如果多人使用一个秘钥的情况下,吊销证书了,其他的用户也登录不了。所以我们就需要秘钥加用户名和密码,这样就可以多个用户使用同一个证书,使用不同的用户名和密码。
新用户加入的时候,只需要添加一个用户名和密码,如果有人不需要VPN时,直接删除用户名和密码就可以了。
首先需要确保能使用秘钥成功连接openVPN服务,然后再配置秘钥+用户名密码验证登录方式。
1.修改配置文件(在文件最下方插入三条命令)
[root@openvpn /etc/openvpn]# vim /etc/openvpn/server.conf script-security 3 #允许使用自定义脚本 auth-user-pass-verify /etc/openvpn/check.sh via-env username-as-common-name #用户密码登陆方式验证
2.编写脚本
[root@openvpn /etc/openvpn]# vim /etc/openvpn/check.sh #!/bin/sh PASSFILE="/etc/openvpn/openvpnfile" 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 /etc/openvpn]# chmod +x check.sh
4.添加客户端openvpn用户和密码
[root@openvpn /etc/openvpn]# vim /etc/openvpn/openvpnfile lx 123456
5.重启服务
[root@openvpn /etc/openvpn]# systemctl restart openvpn@server.service
6.客户端配置文件加入一行内容
auth-user-pass