OpenVPN原理及其搭建
1. OpenVPN的概念
OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN可以使用公开密钥、电子证书、或者用户名/密码来进行身份验证。它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。
OpenVPN可以在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X以及Windows、Android和ios上运行。
OpenVPN不是一个基于Web的VPN软件,也不与IPsec及其它VPN软件包兼容。
2. OpenVPN的原理
OpenVPN的技术原理主要包括:虚拟网卡、加密(SSL协议的实现)、身份验证、功能与端口。
2.1 虚拟网卡
虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装此类程序后主机上会增加一个非真实的网卡,它可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件 (如网络浏览器)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收 得到。很多系统都可以安装虚拟网卡,所以OpenVPN的跨平台使用变得容易。
在OpenVPN中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配置的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,会通过socket从外网上发送出去。这完成了一个单向传输的过程,反过来也是一样。当远程服务程序通过SOCKET从外网上接收到数据,并进行相应的处理后,又会发送回给虚拟网卡,则相应应用软件就会接收到。
2.2 加密
OpenVPN使用OpenSSL库来加密数据与控制信息,所以它可以使用任何OpenSSL支持的算法,它可以使用HMAC功能来进一步提高连接的安全性,OpenSSL的硬件加速也能提高它的性能。
2.3 身份验证
OpenVPN支持的身份验证方式:
-
预享私钥
最为简单,但它也只能用于创建点对点的VPN。 -
第三方证书(PKI)
提供最完善的功能,但需要额外维护一个PKI证书系统。 -
用户名和密码组合
可以省略掉客户端证书但同样需要服务端证书用作加密。(OpenVPN 2.0+)
2.4 功能与端口
-
OpenVPN所有的通信都基于一个单一的IP端口,使用通用的网络协议,默认且推荐使用UDP协议,它也支持TCP。IANA指定给OpenVPN的官方端口为1194。
-
OpenVPN 2.0以后的版本每个进程可以同时管理数个并发的隧道。
-
OpenVPN可以通过大多数的代理服务器,并且能够在NAT环境中很好地工作。
-
服务端具有向客户端推送某些网络配置信息的功能,这些信息包括:IP地址、路由设置。
-
OpenVPN提供了两种虚拟网络接口:通用Tun/Tap驱动,通过它们,可以创建三层IP隧道,或者虚拟二层以太网,后者可以传送任何类型的二层以太网数据。
-
传送的数据可以通过LZO算法压缩。
3. OpenVPN的实现
OpenVPN的实现分为服务端和客户端。
搭建过程中注意软件版本,特别是Windows客户端这里使用的是最新的OpenVPN版本2.4.3,老的版本的客户端可能出现无法连接OpenVPN服务端的情况。
3.1 OpenVPN服务端
系统环境:CentOS7 内核:4.9.15-x86_64
OpenVPN:2.4.3
OpenVPN软件包在EPEL源中,需要确认系统可以获取相应的软件包。以下是具体的OpenVPN服务器搭建过程。
-
安装OpenVPN软件包
yum install -y openvpn -
编辑服务器配置文件
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
#将安装包中自带的配置文件示例文件copy到/etc/openvpn路径下
vim /etc/openvpn/server.conf
将server.conf中如下内容的注释去掉:
push "redirect-gateway def1 bypass-dhcp" #启用这一项会让客户端重定向它们的默认网关为
#VPN的DHCP server地址,这样客户端才能将所有流量发往VPN服务器尽而访问特定网站
push "dhcp-option DNS 8.8.8.8" #给客户端推送DNS地址
push "dhcp-option DNS 8.8.4.4" #给客户端推送DNS地址
user nobody #指定openvpn以nobody用户身份运行
group nobody
其它配置使用默认值即可。 -
修改证书模板的默认值
此步不做也可以,做此步的目的是为了后续生成证书时不需要一项项去输入相应信息,而是直接使用我们事先定义好的模板的内容。
yum install easy-rsa -y #安装easy-rsa用于生成所需的密钥
cp -R /usr/share/easy-rsa/ /etc/openvpn
#将easy-rsa这一目录复制到/etc/openvpn路径下
vim /etc/openvpn/easy-rsa/2.0/vars #修改证书生成时的模板
export KEY_COUNTRY="US"
export KEY_PROVINCE="NY"
export KEY_CITY="New York"
export KEY_ORG="Organization Name"
export KEY_EMAIL="administrator@example.com"
export KEY_CN=droplet.example.com
export KEY_NAME=server
export KEY_OU=server
修改完成以后在/etc/openvpn/easy-rsa/2.0目录中执行source ./vars
,然后清空目录./clean-all
。 -
生成CA证书、服务器证书及密钥
在/etc/openvpn/easy-rsa/2.0目录中执行:
./build-ca
执行完以后会在/etc/openvpn/easy-rsa/2.0/keys目录中产生ca.crt文件。接着为服务器生成密钥:
./build-key-server server
这一指令会生成server.crt和server.key两个文件。
再接着生成Diffie Hellman key exchange文件,它的长度由配置文件中的KEY_SIZE决定,执行指令./build-dh
,它会生成dh2048.pem文件。
最后生成一个ta.key,用于tls-auth(以启用HMAC进一步加强OpenVPN的安全性,使用指令:openvpn --genkey --secret ta.key
这一指令在哪执行生成的文件就放在哪。
记录前面生成的5个文件(dh2048.pem、ca.crt、server.crt、server.key、ta.key)的存放位置,然后在openvpn的server配置文件文件中需要指定它们的位置。为了配置方便可以将这些文件mv到和server.conf在同一目录中,这样配置文件中只需要启用相关的配置项即可,否则需要在配置文件中指定文件的绝对路径。server.conf默认即启用了这5项配置。
-
生成客户端证书和密钥
在/etc/openvpn/easy-rsa/2.0中执行:
./build-key client
执行完以后会在keys目录中生成client.crt、client.key文件。 -
配置防火墙
要使用OpenVPN Server访问同网段的其它服务器,在tun模式下需要用到nat功能,所以必须启用防火墙服务。具体配置过程如下:
systemctl status firewalld.service
systemctl start firewalld.service
firewall-cmd --list-services #查看防火墙已经允许哪些服务通过
firewall-cmd --add-service openvpn #添加openvpn服务且立即生效
firewall-cmd --permanent --add-service openvpn #添加openvpn服务只有重启后生效且是永久的
firewall-cmd --add-masquerade #添加地址伪装服务且立即生效
firewall-cmd --permanent --add-masquerade #添加地址伪装服务只有重启后生效且是永久的
firewall-cmd --query-masquerade #查询是否添加成功
-
开启IP转发功能
因为OpenVPN会在系统中添加一块虚拟网卡,这块网卡需要与服务器其它真实网卡间通信(以访问其它同网段服务器或者代理访问其它特定网站),完成数据包转发工作,因此需要开启内核的IP转发功能。方法如下:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #将默认的0改成1
sysctl -p #使修改的参数生效
- 启动OpenVPN服务端
systemctl enable openvpn@.service #设置服务开机自启,这里的@是默认就有的
systemctl start openvpn@.service #启用openvpn服务
3.2 安装OpenVPN客户端
系统环境:win10
OpenVPN客户端:2.4.3
安装好客户端以后,打开其安装目录,找到config文件夹,建立文本文件client.ovpn,内容如下:
client
dev tun
proto udp
tun-mtu 1500
cipher AES-256-CBC
keysize 256
remote x.x.x.x 1194
resolv-retry infinite
nobind
auth-nocache
verb 3
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
3.3 下载客户端需要使用的认证文件
从OpenVPN服务端将前面创建的如下四个文件下载至客户端安装路径config文件夹中。 ca.crt、client.crt、client.key、ta.key
。
3.4 连接OpenVPN服务端
在客户端上启动OpenVPN GUI程序,然后在任务栏找到OpenVPN GUI程序的图标后右键选择"connect",然后会自动弹出系统日志,当显示“MANAGEMENT: >STATE:xxxxxx,CONNECTED,SUCCESS`时,即表示已经连接成功。如果出现WARNING或者eror信息及时根据日志进行故障排除。
3.5 验证OpenVPN服务可用性
-
查看本机与OpenVPN的网络连通性
ping服务端tun0接口的ip地址。 -
连接OpenVPN server tun0 ip或者访问目标网站
如果以上都没有问题,则证明此OpenVPN服务搭建成功。
附件OpenVPN Mac OS X、Windows、Android客户端:链接:
百度盘 密码:3efy