一 、概念相关
1、vpn 介绍
vpn 虚拟专用网络,是依靠isp和其他的nsp,在公共网络中建立专用的数据通信网络的技术。在vpn中任意两点之间的链接并没有传统的专网所需的端到端的物理链路,而是利用公共网络资源动态组成的,可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有相同功能的点到点的专线技术,所谓虚拟是指不需要去拉实际的长途物理线路,而是借用公共的Internet网络实现。
2、vpn 作用
vpn可以帮助公司用的远程用户(出差,家里)公司的分之机构、商业合作伙伴及供应商等公司和自己的公司内部网络之间建立可信的安全连接或者局域网连接,确保数据的加密安全传输和业务访问,对于运维工程师来说,还可以连接不同的机房为局域网,处理相关的业务流。
3、常见vpn功能的开源产品
pptp vpn
最大优势在于无需在windows客户端单独安装vpn客户端软件,windows默认就支持pptp vpn拨号功能。他是属于点对点的方式应用,比较适合远程企业用户拨号到企业进行办公等应用,缺点很多小区及网络设备不支持pptp导致无法访问。Openvpn和PPTP VPN相比存在诸多的优势,最明显的是Openvpn支持NAT穿越,也就是说在nat环境下使用openvpn只需要一个在路由器上做一个端口映射即可!不需要其他路由的支持,要知道不是所有的路由器都支持配置NAT穿越,只有高级的路由器才提供这种功能!其次openvpn使用证书加密数据传输,安全性方便也优于PPTP VPN,但在配置方面比PPTP VPN要复杂许多!而且openvpn客户端登录只需要双击就可以连接服务器端,从感官上反而觉得安全性低,因而下面介绍下openvpn使用user/pass方式用户验证登录,使用这种方式验证用户登录在注销用户账号的时候只要删除密码文件中的记录即可,非常的方便!
SSL VPN(openvpn)
PPTP主要为常在外面移动或者家庭办公的用户考虑的,而OpenVpn不但可以使用与PPTP的场景,还是和针对企业异地两地总分公司之间的vpn不间断按需链接,例如:ERP,OA及时通讯工具等在总分公司企业中的应用,缺点:需要单独安装客户端软件。
IPSEC VPN
也适合针对企业异地两地中分公司或者多个IDC机房之间的VPN的不间断按需链接,并且在部署使用上更简单方便。IPSEC Vpn的开源产品openswan.
4、openvpn介绍
OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。
OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3/TLSv1 协议函式库。OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是仍有一份服务器证书需要被用作加密。 OpenVPN所有的通信都基于一个单一的IP端口, 默认且推荐使用UDP协议通讯,同时TCP也被支持。OpenVPN连接能通过大多数的代理服务器,并且能够在NAT的环境中很好地工作。服务端具有向客 户端“推送”某些网络配置信息的功能,这些信息包括:IP地址、路由设置等。OpenVPN提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们, 可以建立三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网络数据。传送的数据可通过LZO算法压缩。在选择协议时候,需要注意2个加密隧道之间的网络状况,如有高延迟或者丢包较多的情况下,请选择TCP协议作为底层协议,UDP协议由于存在无连接和重传机制,导致要隧道上层的协议进行重传,效率非常低下。
二、OpenVPN安装
1. 环境说明
2. 准备工作
# 关闭selinux setenforce 0 sed -i ‘/^SELINUX=/c\SELINUX=disabled‘ /etc/selinux/config # 安装openssl和lzo,lzo用于压缩通讯数据加快传输速度 yum -y install openssl openssl-devel yum -y install lzo #开启路由转发 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
3. 源安装
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm rpm -Uvh epel-release-7-10.noarch.rpm yum install openvpn -yyum install easy-rsa #安装easy-rsa生成密钥
4. 生成密钥
首先配置环境变量:
# cp -R /usr/share/easy-rsa/ /etc/openvpn# cat /etc/openvpn/easy-rsa/2.0/vars | grep -v "^#"export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" export KEY_SIZE=2048 export CA_EXPIRE=3650 export KEY_EXPIRE=3650 export KEY_COUNTRY="CN" export KEY_PROVINCE="SH" export KEY_CITY="SH" export KEY_ORG="TY" export KEY_EMAIL="[email protected]" export KEY_OU="shop" export KEY_NAME="EasyRSA" export KEY_CN="server" 生成秘钥:
# 初始化环境变量cd /etc/openvpn/easy-rsa/2.0/ source vars # 清除keys目录下所有与证书相关的文件 # 下面步骤生成的证书和密钥都在/usr/share/easy-rsa/2.0/keys目录里 ./clean-all # 生成根证书ca.crt和根密钥ca.key(一路按回车即可) ./build-ca # 为服务端生成证书和密钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) ./build-key-server server # 每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接,下面建立2份 # 为客户端生成证书和密钥(一路按回车,直到提示需要输入y/n时,输入y再按回车,一共两次) ./build-key client1 ./build-key client2 # 创建迪菲·赫尔曼密钥,会生成dh2048.pem文件(生成过程比较慢,在此期间不要去中断它) ./build-dh # 生成ta.key文件(防DDos攻击、UDP淹没等恶意攻击) openvpn --genkey --secret keys/ta.key # 将证书文件复制到OpenVPN配置目录中cd /etc/openvpn/easy-rsa/2.0/keyscp dh2048.pem ca.crt server.crt server.key ta.key /etc/openvpn/servercp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/server/
5. Server端配置举例,server.conf详解请参考另一半文章:OpenVPN Server端配置详解
# cat /etc/openvpn/server/server.conf local 10.2.2.37 port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" #client连接后使用server的网络环境 push "dhcp-option DNS 223.5.5.5" #经测试,需向client push DNS并且防火墙开启masquerade,client才能通过server访问互联网 client-to-client duplicate-cn keepalive 10 120 cipher AES-256-CBC comp-lzo persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 3 explicit-exit-notify 1 script-security 3 auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #配置使用密码验证 client-cert-not-required username-as-common-name
6. 防火墙配置
首先启动firewalld systemctl status firewalld.service 查看有哪些服务已经在列表中允许通过: # firewall-cmd --list-services dhcpv6-client http https ssh 可以看到已经有了dhcpv6-client, http, https, ssh四项,接下来添加openvpn: # firewall-cmd --add-service openvpn success # firewall-cmd --permanent --add-service openvpn success 最后添加masquerade,测试开启此项,client才能通过server访问互联网: # firewall-cmd --add-masquerade success # firewall-cmd --permanent --add-masquerade success 以下命令用于确认masquerade是否添加成功: # firewall-cmd --query-masquerade yes
7. 启动服务,若实现开机自启动请将以下命令加入/etc/rc.d/rc.local并赋予rc.local可执行权限
openvpn --config /etc/openvpn/server/server.conf >> /dev/null 2>&1 &
三.、设置使用password登录详解
1. 修改服务器端配置:
# vim /etc/openvpn/server/server.conf 在配置文件最后面添加如下几行数据 script-security 3 system #允许通过环境变量将密码传递给脚本 auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #提供一个用户名密码对 client-cert-not-required #不使用客户端证书,使用密码对 username-as-common-name #使用认证用户名,不使用证书的common name
2. 创建checkpsw.sh脚本,放在/etc/openvpn/路径下:
# cat /etc/openvpn/checkpsw.sh
#!/bin/sh ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman <[email protected]> # # This script will authenticate OpenVPN users against # a plain text file. The passfile should simply contain # one row per user with the username first followed by # one or more space(s) or tab(s) and then the password. PASSFILE="/etc/openvpn/psw-file" LOG_FILE="/var/log/openvpn/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. 创建psw-file文件:
# cd /etc/openvpn/server # echo "shenzhen password%1" > psw-file #创建账号密码,可以多行,每行一组 # chmod 400 psw-file #修改文件权限,我是用root权限执行的
4. 重启服务:
# ps -ef | grep openvpn|grep -v grep| awk ‘{print $2}‘ |xargs kill # openvpn --config /etc/openvpn/server/server.conf >> /dev/null 2>&1 &
四、客户端配置
OpenVPN目前是被河蟹状态,需要FQ去官网下载最新版本客户端,下载之后需要从服务器打包生成的证书文件,解压到客户端安装目录下的config目录中,并创建客户端配置文件client.ovpn:
客户端配置详解请参考另一篇文章:OpenVPN Client端配置文件详解说明
client dev tun proto udp remote 139.219.193.3 1194 nobind user nobody group nobody persist-key persist-tun ca ca.crt ;cert client.crt ;key client.key comp-lzo verb 3 auth-user-pass #客户端使用账号密码登录 reneg-sec 360000
打开客户端,输入用户名密码登录。 登录问题可以参考服务端/etc/openvpn/server/openvpn.log
参考:
https://openvpn.net/index.php/open-source/documentation.html
http://qiyishi.blog.51cto.com/5731577/1575758
http://blog.csdn.net/skykingf/article/details/50611061