最新消息:

OpenVPN的简介、原理和安装

Linux ipcpu 627浏览

一、 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软件包兼容。

官方网站https://openvpn.net/(需翻墙)

目前官方的openvpn已经拆分为商业版business和社区版community,本文所有介绍都是社区版。

二、OpenVPN的原理

OpenVPN的技术原理主要包括:虚拟网卡、加密(SSL协议的实现)、身份验证、功能与端口。

2.1 虚拟网卡

虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装此类程序后主机上会增加一个非真实的网卡,它可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件 (如网络浏览器)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。很多系统都可以安装虚拟网卡,所以OpenVPN的跨平台使用变得容易。

在OpenVPN中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配置的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,会通过socket从外网上发送出去。这完成了一个单向传输的过程,反过来也是一样。当远程服务程序通过SOCKET从外网上接收到数据,并进行相应的处理后,又会发送回给虚拟网卡,则相应应用软件就会接收到。

2.2 加密

OpenVPN使用OpenSSL库来加密数据与控制信息,所以它可以使用任何OpenSSL支持的算法,它可以使用HMAC功能来进一步提高连接的安全性,OpenSSL的硬件加速也能提高它的性能。

2.3 身份验证

OpenVPN支持的身份验证方式:

预享私钥(pre-shared key)
最为简单,但它也只能用于创建点对点的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算法压缩。

三、OpenVPN服务器端安装和配置

3.1 安装openvpn和easy-rsa
安装就不多说了,epel库里面带的就是2.4.7的最新版本(2019),喜欢编译安装的可以从官网下载源码安装。

yum install openvpn easy-rsa openssl-devel

3.2 创建PKI密钥体系

#@拷贝相关文件
mkdir -p /etc/openvpn/easy-rsa/
rsync -avzP /usr/share/doc/easy-rsa-3.0.3/vars.example /etc/openvpn/easy-rsa/vars
rsync -avzP /usr/share/easy-rsa/3.0.3/ /etc/openvpn/easy-rsa/
rsync -avzP /usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/server/

#@vim /etc/openvpn/easy-rsa/vars,编辑vars文件
set_var EASYRSA_REQ_COUNTRY "xxx" #国家
set_var EASYRSA_REQ_PROVINCE "xxx" #地区
set_var EASYRSA_REQ_CITY "xxx" #城市
set_var EASYRSA_REQ_ORG "xxx" #组织
set_var EASYRSA_REQ_EMAIL "xxx" #邮箱
set_var EASYRSA_REQ_OU "xxx" 拥有者

#@创建服务器端证书和key
cd /etc/openvpn/easy-rsa/
#@目录初始化,建立一个空的pki结构,生成一系列的文件和目录
./easyrsa init-pki
#@创建根证书,创建ca,commonname单独定义个名字
./easyrsa build-ca nopass
#@创建服务器端证书,输入commonname单独定义不要与ca一样(这里用的server)
./easyrsa build-server-full server nopass
#@创建Diffie-Hellman,确保key安全穿越网络
./easyrsa gen-dh
#@生成crl文件(用于删除用户)
./easyrsa gen-crl
#@生成ta密钥文件(可以不需要创建),需要注释server.conf中tls-auth ta.key 0
openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key

注意事项
easyrsa gen-req server nopass 这里的nopass 表示私有密钥private key不使用密码加密。默认是需要密码的。加上密码后每次拨openvpn都需要输入这个密码。同理easyrsa build-ca nopass会使ca私钥加密,每次签发证书(包括server和client)都要输入密码。
私钥加密是PKI体系私钥本身的一种机制,可以直接在linux下用命令行解开,如下

[root@ipcpu-ccs ipcpu]# ssh-keygen -f ipcpu.key -p
Enter old passphrase: 
Key has comment 'ipcpu.key'
Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

3.3 配置服务器端配置文件server.conf

#端口和协议
port 1194
proto tcp

#网络模式
dev tun

#PKI体系相关内容
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem

#拓扑类型(subnet或者net30)
topology subnet

#客户端网络地址
server 211.81.175.0 255.255.255.0

#客户端IP地址临时存储文件
ifconfig-pool-persist ipp.txt

#向客户端推送路由
push "route 211.168.10.0 255.255.255.0"
push "route 211.168.20.0 255.255.255.0"

#客户端配置存储目录
client-config-dir ccd

#向客户端推送默认路由
;push "redirect-gateway def1 bypass-dhcp"

#向客户端推送DNS服务器
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

#运行客户端互访
client-to-client

#加密算法,需和客户端保持一致
cipher AES-256-CBC
;compress lz4-v2
;push "compress lz4-v2"
comp-lzo

#最大客户端数量
max-clients 1000

#吊销配置
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem

#重新认证时间默认3600秒,一次性口令情况下设置为0
#reneg-sec 0

#其他杂项
;duplicate-cn
keepalive 10 120
;user nobody
;group nobody
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
;mute 20
#explicit-exit-notify 2

注意事项

dev tun

网络模式分为tun路由模式和tap桥接模式,一般都用的tun路由模式

topology subnet

拓扑类型有net30,subnet和p2p三种,net30是默认模式,表示每个客户端使用211.81.175.4/30这样的30位掩码,这样的网络地址只有2个IP地址可用,server端用一个,客户端用一个,实际应用中极度浪费IP地址资源,从openvpn 2.1开始引入了subnet模式,可以让所有客户端公用211.81.175.0/24这样的地址,每个客户端一个,一个地址段可以给253个客户端使用。subnet模式如果存在Windows客户端,需要TAP-Win32 driver驱动在8.2+以上版本(When used on Windows, requires version 8.2 or higher of the TAP-Win32 driver)。

四、客户端配置

4.1 生成客户端key文件

cd /etc/openvpn/easy-rsa
#@生成客户端公钥和私钥(common name用的client01,可以自行修改)
./easyrsa build-client-full client01 nopass

4.2 配置客户端自定义配置ccd

在实际使用中我们希望每个用户的IP地址固定,以便于查找和授权,因此可以将用户地址写入ccd配置

#net30模式这样写
ifconfig-push 211.81.175.9 211.81.175.10
#subnet模式这样写
ifconfig-push 211.81.175.6 255.255.255.0

4.3 编写客户端配置文件

client
dev tun
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
verb 3
comp-lzo
remote-cert-tls server
route-delay 2
cipher AES-256-CBC
remote 223.202.223.202 8888
ca ca.crt
cert client01.crt
key client01.key

需要注意下三个密钥文件需要和配置文件放在同一个目录下。

五、常见问题

5.1、 如何查看TAP-Win32的版本?
可以查找openvpn的日志文件,搜索一下TAP关键字就可以找到。

5.2、 客户端如何进行吊销?
要使用CRL吊销,服务器端需要加入以下配置

crl-verify  crl.pem

可以使用如下命令对客户端进行吊销

./easyrsa revoke client02
./easyrsa gen-crl

重启openvpn-server才能使已经连接的客户端失效。

5.3、服务器端报错”IP packet with unknown IP version=15 seen”
大多数情况是因为服务器端加密策略和客户端加密策略不一致引起的,请检查配置文件。

参考资料

https://www.jianshu.com/p/d7fae1fa847c
https://www.cnblogs.com/gaoyuechen/p/9729239.html

转载请注明:IPCPU-网络之路 » OpenVPN的简介、原理和安装