一.VPN概述:
VPN(Virtual Private NetWork,虚拟专用网络)架设在公共共享的基础设施互联网上,在非信任的网络上建立私有的安全的连接,把分布在不同地域的办公场所、用户或者商业伙伴互联起来。
在目前的实践中,常见的VPN构建技术:
-
PPTP(Point-to-Point Tunneling Protocol,点到点的隧道协议)VPN
-
IPSec(Internet Protocol Security,互联网协议安全)VPN
-
SSL/TLS(Secure Sockets Layer,安全接口层)VPN
3种常见VPN构建技术对比:
-
PPTP 需要建立2个隧道进行通信,控制和数据传输分离,其中传输数据使用GRE。在同一个局域网里面的多个内网主机需要建立多条GRE通道连接到同一台VPN服务器时,需要在防火墙或者NAT设备上进行特殊设置。
-
IPSec VPN是一个比较成熟的方案,但其配置较复杂,学习成本比较高。IPSec VPN 在商业VPN 硬件设备上实现的比较多。
-
SSL/TLS VPN 工作在用户态,不需要对内核做特殊的修改,可移植性比较高,配置简单,学习成本低(常见:OpenVPN,BadVPN)。
OpenVPN (当前主流)
功能特性:
-
对任何IP子网或者虚拟以太网通一个UDP或者TCP端口来建立隧道。
-
架构一个可扩展的,负载均衡的VPN集群系统,同时支持来自上千用户的连接。
-
使用任意加密算法,可以实现简单的静态密码的传统加密,或者基于证书的公钥私钥加密算法。
-
对数据流进行实时的压缩。
-
支持对端节点通过DHCP动态获取IP
-
NAT 支持,对于面向连接的有状态防火墙,不需要特殊设置。
-
客户端使用,支持Windows,Mac OS ,Linux
3种实现案例:
-
Peer-to-Peer VPN,这种场景,将Internet 两台机器(公网地址)使用VPN连接起来。
-
Remote Access VPN(远程访问),该实现方案,旨在解决,移动办公,经常出差不在办公室的,公司生产环境连接。在这个场景种远程访问者一般没有公网IP,他们使用内网地址通过防火墙设备及逆行NAT转换后连接互联网。
-
SIte-to-Site VPN ,用于连接两个或者多个地域上不同的局域网LAN,每个LAN有一台OpenVPN 服务器作为接入点,组成虚拟专用网络,使得不同LAN里面的主机和服务器都能够相互通讯。
盗图一张:在本文中的IP会有变化
二.安装准备
OpenVPN 服务器:CetnOS7.4 (218.241.106.168)
OpenVPN 客户端:CetnOS7.4 (218.241.106.170)
安装依赖包:
yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
安装EPEL源(这里不再具体给出),从上面找openvpn的rpm包即可,我安装的如下:
在安装openvpn的过程中可能还会依赖一些包,这个需要自己找了,比如:
pkcs11-helper-1.11-3.el7.x86_64.rpm 和 lz4-1.7.3-1.el7.x86_64.rpm
在配置openvpn的过程中还需要安装easy-rsa ,主要用来生成秘钥。(从github上下载即可:https://github.com/OpenVPN/easy-rsa)
easy-rsa的3.0的版本比2.0的版本好用的多,省去了一大堆的瓶瓶罐罐 ^_^
cd /usr/local easy-rsa下载在/usr/local中 unzip easy-rsa-3.0.5 解压 mv /usr/local/easy-rsa-3.0.5 /usr/local/easy-rsa 重命名 cp -rf easy-rsa /etc/openvpn 拷贝到openvpn目录中 cd /etc/openvpn/easy-rsa/easyrsa3 cp vars.example vars #一般情况下,默认的配置可以满足需求,也可以根据需要修改 ./easyrsa init-pki #建立一个空的pki结构,生成一系列的文件和目录 ./easyrsa build-ca #创建ca 密码 和 cn那么需要记住 ./easyrsa gen-req server nopass #创建服务端证书 common name 最好不要跟前面的cn那么一样 ./easyrsa sign server server #签约服务端证书 ./easyrsa gen-dh #创建Diffie-Hellman #下面是客户端的证书 #首先创建一个工作的目录 cd /home/ mkdir client && cd client cp -R ~/easy-rsa/ ./ #这是解压过的easy-rsa 而不是生成了服务端证书的easy-rsa cd easy-rsa/easyrsa3/ cp vars.example vars #开始生成 ./easyrsa init-pki ./easyrsa gen-req orangleliu #用自己的名字,需要创建一个密码 和 cn name,自己用的 需要记住 #现在客户端的证书要跟服务端的交互,也就是签约,这样这个用户才能使用此vpn #切换到server证书目录下 cd /etc/openvpn/easy-rsa/easyrsa3/ ./easyrsa import-req /home/client/easy-rsa/easyrsa3/pki/reqs/orangleliu.req orangleliu #导入req ./easyrsa sign client orangleliu #用户签约,根据提示输入服务端的ca密码
把这些文件放到对应的一些目录下
服务端证书(放到配置文件一个目录,便于配置和查找)
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn/
client证书(只是集中到一个文件夹下,给vpn用户使用)
mkdir /home/myclient cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /home/myclient/ cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/test.crt /home/myclient/ cp /home/client/easy-rsa/easyrsa3/pki/private/test.key /home/myclient/
最难的部分已经过去了,下面就是配置服务,看看效果了
三.配置服务端
vim /etc/openvpn/server.conf 具体每个配置的含义,配置文件中都有详细的解释,我的配置文件如下:
local 218.241.106.168 port 1194 proto tcp dev tap ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt dh /etc/openvpn/dh.pem server 10.10.0.0 255.255.0.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt client-to-client keepalive 10 120 comp-lzo max-clients 100 persist-key persist-tun status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 3 key /etc/openvpn/server.key cipher AES-256-CBC client-config-dir /etc/openvpn/ccd
现在再创建日志的目录:
mkdir -v /var/log/openvpn
在创建固定IP分配的目录:
mkdir /etc/openvpn/ccd
如果要定义分配的IP需要在目录中创建文件,例如:
vim test (创建个文件并添加) ifconfig-push 10.10.10.10 255.255.0.0
使用如下方式来启动服务端:
openvpn --config /etc/openvpn/server.conf &
可以看到新生成了一个虚拟网卡:
查看一下服务端口:
开启路由转发功能:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
现在服务端就算配置完成了
四.配置客户端
在客户端上也是配置一个openvpn , 这里不再赘述
现在就可以把刚才生成的客户端的那几个ca拷贝到客户端的openvpn的配置目录中/etc/openvpn了
现在配置一下客户端/etc/openvpn/client.conf
client dev tap proto tcp remote 218.241.106.168 1194 resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/ca.crt cert /etc/openvpn/test.crt key /etc/openvpn/test.key comp-lzo verb 3 cipher AES-256-CBC
现在就可以使用命令启动了:
openvpn --config /etc/openvpn/client.conf
会让你输入刚才生成客户端秘钥的密码:(之前输入的那几个信息一定要记住哦)
输入正确后,就会连接成功:
路由策略如下:
现在两台服务器就可以使用私网IP通讯了。
五.测试结果
只是相互可以通信不是目的,下面是我对配置文件进行一定的修改并得出的部分结论(我有千兆和万兆的环境):
以下测试均使用 iperf3 工具进行传输测试得出的结果,期间未运行其他程序。
万兆网卡:
开启 TCP,使用TUN , 关闭AES-256-CBC加密算法:70MB/s
开启 TCP,使用TUN , 开启AES-256-CBC加密算法:65MB/s
开启 UDP,使用TUN , 开启AES-256-CBC加密算法:58MB/s
开启 UDP,使用TUN , 关闭AES-256-CBC加密算法:59MB/s
开启 TCP,使用TAP , 关闭AES-256-CBC加密算法:67MB/s
开启 TCP,使用TAP , 开启AES-256-CBC加密算法:69MB/s
开启 UDP,使用TAP , 关闭AES-256-CBC加密算法:56MB/s
开启 UDP,使用TAP , 开启AES-256-CBC加密算法:57MB/s
千兆网卡:
开启 TCP,使用TUN , 关闭AES-256-CBC加密算法:68MB/s
开启 TCP,使用TUN , 开启AES-256-CBC加密算法:68MB/s
开启 UDP,使用TUN , 开启AES-256-CBC加密算法:57MB/s
开启 UDP,使用TUN , 关闭AES-256-CBC加密算法:55MB/s
开启 TCP,使用TAP , 关闭AES-256-CBC加密算法:63MB/s
开启 TCP,使用TAP , 开启AES-256-CBC加密算法:62MB/s
开启 UDP,使用TAP , 关闭AES-256-CBC加密算法:55MB/s
开启 UDP,使用TAP , 开启AES-256-CBC加密算法:53MB/s
综上结果:
openvpn在使用万兆与千兆网卡时,在速率无明显差异;
openvpn是否开启AES-256-CBC加密算法,在速率无明显差异;
openvpn在使用tun与tap时,在速率无明显差异;
openvpn在使用tcp协议与udp协议时,在速率上有一定的差异,TCP协议比UDP协议大约快为10MB/s
现考虑安全方面及上述结果可采用:
开启AES-256-CBC加密算法,使用TCP协议传输,使用TUN与TAP均可。
只是我个人的测试结果及结论,不对任何人构成建议。
参考文章如下:
https://www.cnblogs.com/kl876435928/p/7155354.html
https://www.cnblogs.com/kevingrace/p/6296676.html
https://wenku.baidu.com/view/b3db80e48ad63186bceb19e8b8f67c1cfad6ee11.html
https://blog.csdn.net/orangleliu/article/details/43157955
https://blog.csdn.net/skymanwww/article/details/63707082 配置文件详解参考
http://itindex.net/detail/20698-pptp-l2tp-ipsec PPTP、L2TP/IPSec、OpenVPN比较选择