摘 要 OpenVPN利用虚拟网卡,以一种全新的方式实现了SSL VPN的功能,能够适应IP层之上的几乎所有应用。本文分析了OpenVPN的实现原理并且利用OpenVPN在一个安全系统上实现了五种方式的SSL访问。
物理网卡接收数据包,经过核心TCP/IP上传到OpenVPN,OpenVPN通过link_socket_read()接收数据包,使用SSL协议进 行解包处理,经过处理的数据包OpenVPN调用虚拟网卡的字符处理程序tun_write()写入虚拟网卡的字符设备,设备驱动程序完成数据从用户区到 核心区的复制,并将数据写入skb链表,然后调用网卡netif_rx()接收程序,数据包再次进入系统TCP/IP协议栈,传到上层应用程序。如图1所 示。
图2 系统结构
关键词 SSL VPN;虚拟网卡;虚拟地址;Tun;Tap
1 引言
VPN技术通过密钥交换、封装、认证、加密手段在公共网络上建立起私密的隧道,保障传输数据的完整性、私密性和有效性。OpenVPN是近年来新出现的开放源码项目,实现了SSL VPN的一种解决方案。
传
统SSL
VPN通过端口代理的方法实现,代理服务器根据应用协议的类型(如http,telnet等)做相应的端口代理,客户端与代理服务器之间建立SSL安全连
接,客户端与应用服务器之间的所有数据传输通过代理服务器转发。这种实现方式烦琐,应用范围也比较窄:仅适用于用TCP固定端口进行通信的应用系统,且对
每个需要代理的端口进行单独配置;对于每个需要用到动态端口的协议都必须重新开发,且在代理中解析应用协议才能实现代理,如FTP协议;不能对TCP以外
的其它网络通信协议进行代理;代理服务器前端的防火墙也要根据代理端口的配置变化进行相应调整。
OpenVPN以一种全新的方式实现了SSL VPN的功能,克服了传统SSL VPN的一些缺陷,扩展了应用领域,并且防火墙上只需开放TCP或UDP协议的一个端口。
2 OpenVPN的工作原理
2.1 虚拟网卡
在
Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡的驱
动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动
read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接
口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特
点:能够配置IP地址和路由。对虚拟网卡的使用是OpenVPN实现其SSL VPN功能的关键。
2.2 地址池以及路由
OpenVPN
服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动
态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenVPN服务
器成为每个客户端在虚拟网络上的网关。OpenVPN服务器同时提供对客户端虚拟网卡的路由管理。当客户端对OpenVPN服务器后端的应用服务器的任何
访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡
发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络,这个虚拟的局域网对系统的用户来说是透明的。
2.3 客户端与服务端安全连接的建立
OpenVPN的服务器和客户端支持tcp和udp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服
务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟网络上的管理信息,OpenVPN将虚拟网上的网段、地址、路由发送给客户端。
连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去。
2.4 数据包的处理过程
2.4.1 发送数据流程
应用层的外出数据,经过系统调用接口传入核心TCP/IP层做处理,在TCP/IP经过路由到虚拟网卡,虚拟网卡的网卡驱动发送处理程序
hard_start_xmit()将数据包加入skb表并完成数据包从核心区到用户区的复制,OpenVPN调用虚拟网卡的字符处理程序
tun_read(),读取到设备上的数据包,对读取的数据包使用SSL协议做封装处理后,通过socket系统调用发送出去。
2.4.2 接收数据流程
物理网卡接收数据包,经过核心TCP/IP上传到OpenVPN,OpenVPN通过link_socket_read()接收数据包,使用SSL协议进 行解包处理,经过处理的数据包OpenVPN调用虚拟网卡的字符处理程序tun_write()写入虚拟网卡的字符设备,设备驱动程序完成数据从用户区到 核心区的复制,并将数据写入skb链表,然后调用网卡netif_rx()接收程序,数据包再次进入系统TCP/IP协议栈,传到上层应用程序。如图1所 示。
图1 数据在系统中的处理过程
2.5 数据包的封装
OpenVPN提供tun和tap两种工作模式。在tun模式下,从虚拟网卡上收到的是不含物理帧头IP数据包,SSL处理模块对IP包进行SSL封装;
在tap模式下,从虚拟网卡上收到的是包含物理帧头的数据包,SSL处理模块对整个物理帧进行SSL封装。Tap模式称为网桥模式,整个虚拟的网络就像网
桥方式连接的物理网络。这种模式可以传输以太网帧、IPX、NETBIOS等数据包,应用范围更广。
2.6 OpenVPN与Openssl
OpenVPN软件包需要和openssl软件一起安装,因为OpenVPN调用了Openssl函数库,OpenVPN的客户端和服务端建立SSL链接
的过程是通过调用Openssl来实现的。通过bio_write()\函数把数据写入Openssl的状态机通道,bio_read()从
Openssl读取结果。OpenVPN还调用Openssl的加解密函数处理转发的数据包。
3 OpenVPN的应用
3.1 系统结构介绍
在图2所示的应用中,部门一和部门二是两个独立的业务部门,其各自内部局域网络中的服务器经交换机再经SSL
VPN网关连接到公共的网络。用户A和用户B是部门一的远程用户,用户X和用户Y是部门二的远程用户,用户可以访问本部门服务器,但不能直接访问其它部门
的服务器。
3.2 系统中设备的基本配置
服务器SSL VPN1、SSL VPN2上安装OpenVPN以服务器方式启动。
用户A、B和服务器SSL VPN2上启动OpenVPN以客户端方式向服务器SSL VPN1申请建立连接,连接建立成功后分配到的虚拟地址分别为10.8.0.2、10.8.0.3、10.8.0.4。
用户X、Y上启动OpenVPN以客户端方式向服务器SSL VPN2申请建立连接,连接建立成功后分配到的虚拟地址分别为10.8.1.2、10.8.1.3。各设备上的地址如下:
服务器SSL VPN1:eth1(内口)192.168.11.13,eth0(外口)120.4.1.13,tap0:10.8.0.1
用户A:eth0:120.4.1.14,tap0:10.8.0.2,
用户B:eth0:120.4.1.15,tap0:10.8.0.3,
服务器SSL VPN2:eth1(内口)192.168.10.244,eth0(外口)120.4.1.24,tap0:10.8.1.1,
tap1:10.8.0.4
用户C:eth0:120.4.1.19,tap0 :10.8.1.2
3.3 五种访问形式
3.3.1用户访问本部门服务器
SSL VPN1配置文件中添加如下选项:
push “192.168.11.0 255.255.255.0 ”
客户端向SSL VPN1服务器请求建立链接成功后,客户端上产生如下路由
Destination Gateway netmask Iface
192.168.11.0 * 255.255.255.0 tap0
10.8.0.0 * 255.255.255.0 tap0
…
用户A和用户B就安全的能访问SSL VPN1服务器的内网。
3.3.2 同部门远程用户点到点通信
用户A和用户B分别和SSL VPN1服务器建立连接,VPN服务器使用参数client-to-client,用户A和用户B之间就能通过:用户A---SSL VPN1----用户B这样的安全途径互通。
图2 系统结构
3.3.3 部门间服务器数据交换
SSL VPN2做为客户端和SSL VPN1建立连接(或者VPN1做为客户端和VPN2建立连接)。
VPN1上增加路由:
Destination Gateway netmask Iface
192.168.10.0 * 255.255.255.0 tap0
…
VPN2上增加路由:
Destination Gateway netmask Iface
192.168.11.0 * 255.255.255.0 tap0
…
服务器1、2和服务器3和4的数据交换,由SSL VPN1和 SSL VPN2建立起来的安全隧道保障数据交换的安全。
3.3.4 用户跨部门访问服务器
当用户有跨部门访问服务器的需求时,必须经过SSL VPN网关的接力,即先连接到本部门的SSL VPN网关,再转发到其它部门SSL
VPN网关,然后访问到它部门内部的服务器。用户A和SSL VPN1服务器建立连接,SSL VPN2做为客户端和SSL
VPN1建立连接(或者VPN1做为客户端和VPN2建立连接)。
SSL VPN1配置文件中使用参数client-to-client,并添加如下选项:
push “192.168.10.0 255.255.255.0 ”
客户端向SSL VPN1服务器请求建立链接成功后,客户端上产生如下路由:
Destination Gateway netmask Iface
192.168.10.0 * 255.255.255.0 tap0
10.8.0.0 * 255.255.255.0 tap0
…
VPN1上增加路由
Destination Gateway netmask Iface
192.168.10.0 * 255.255.255.0 tap0
用户和服务器间数据安全传输路径是:用户A---SSL VPN1---SSL VPN2。
3.3.5 不同部门间用户通信
用户A和SSL VPN1建立连接,用户X和SSL VPN2建立连接,VPN2做为客户端和VPN1建立连接(或者VPN1做为客户端和VPN2建立连接)。
用户A的系统内产生如下路由:
Destination Gateway netmask Iface
120.4.1.99 * 255.255.255.255 tap0
10.8.0.0 * 255.255.255.0 tap0
…
用户X系统内产生如下路由:
Destination Gateway netmask Iface
120.1.1.99 * 255.255.255.0 tap0
10.8.1.0 * 255.255.255.0 tap0
…
VPN1上添加如下路由:
Destination Gateway netmask Iface
120.4.1.99 10.8.0.4 255.255.255.255 tap0
VPN2上的路由如下:
Destination Gateway netmask Iface …
120.1.1.99 * 255.255.255.255 tap0
10.8.0.0 * 255.255.255.0 tap1
10.8.1.0 * 255.255.255.0 tap0
在VPN2上,流入tap1的数据进入VPN2与VPN1建立的安全隧道,流入tap0的数据进入VPN2和VPN2的客户端建立的安全隧道。用户A与用户X间数据安全传输路径是:用户A---SSL VPN1---SSL VPN2----用户X。
4 结束语
OpenVPN是一款基于SSL的开源VPN软件,它实现了利用SSL来保证网络通讯安全性的目的,同时避免了传统SSL
VPN仅提供简单的Web应用的不足,它具有支持各种应用协议,支持Windows,Linux,BSD,MAC
OS等多平台的特点。在上面的应用系统中,通过对OpenVPN的灵活部署,实现了五种访问形式。其中部门内用户点到点通信、用户跨部门访问应用服务器、
用户跨部门点到点通信、数据包在客户端到SSL VPN服务器以及SSL VPN服务器间接力传送;跨部门的应用服务器数据通信时,SSL
VPN服务器要做内网数据向外网转发的反向代理,而这些应用需求在传统SSL代理服务器中是比较难实现的。
from http://www.zclw.net/article/sort040/sort046/info-7556.html