一种提高VPN服务端并发处理性能的方法与流程

文档序号:15777923发布日期:2018-10-30 15:47阅读:643来源:国知局
一种提高VPN服务端并发处理性能的方法与流程

本发明涉及网络安全通讯技术领域,尤其涉及一种提高VPN服务端并发处理性能的方法。



背景技术:

在传统的企业网络配置中,要进行异地局域网之间的互连,传统的方法是租用DDN(数字数据网)专线或帧中继,这样的通讯方案必然导致高昂的网络通讯服务费和维护费用。对于移动用户(移动办公人员)与远端个人用户而言,一般通过拨号线路(Internet)进入企业的局域网,而这样必然带来安全上的隐患。

虚拟专用网(Virtual Private Netword,简称:VPN)的提出就是来解决这些问题的,通过公用网在建立VPN,就可以节省大量的通信费用,而不必投入大量的人力物力去安装和维护WAN(广域网)设备和远程访问设备。VPN产品均采用加密及身份验证等安全技术,保证连接用户的可靠性及传输数据的安全性和保密性。

VPN最常见的方式为IPSec VPN和SSL VPN,其中,基于网络层的IPSec VPN多用于“网络与网络”之间的连接,其对于所有IP应用都是透明的,但是其加解密在内核态,因此不适合终端(如:手机)的开发;基于应用层的SSL VPN多用于“终端与网络”之间连接,其加解密在用户态,并且客户端使用标准的浏览器,因此保护基于Web的应用更有优势。若要保护终端基于其它TCP/UDP的应用,则使用TUN虚拟网卡的SSL VPN(简称VPN)解决上述问题,其对于所有IP应用都是透明的,而且其加解密在用户态,因此还很适合基于终端的开发。

随着互联网呈现井喷式发展,使用TUN虚拟网卡的VPN也得到了越来越广泛的应用,除了传统的PC终端外,还出现了越来越多的移动终端(如:手机、平板或其他智能终端),终端种类在多样化的同时终端数量也在不断迅速增长,服务端的性能已面临着严峻的考验。

然而,传统的使用TUN虚拟网卡的VPN采用的是单进程模式(如:openvpn),但是目前的服务器大多都是多核CPU,单进程VPN同一时间内只能在一个CPU核上运行,浪费了多核CPU的性能,而多进程VPN在同一时间内可以分布多个CPU核上运行,有效地利用了多核CPU的性能,在网卡性能未达到瓶颈的情况下大大提高了VPN服务端的性能。因此,使用TUN虚拟网卡的VPN服务端采取多进程模式是大势所趋。

要实现使用TUN虚拟网卡的多进程VPN就必须保证一个连接上所有数据包都只能发往同一进程处理,包括握手数据包和应用数据包。试想一下,如果在A进程完成握手并协商好加密密钥,而基于TCP/UDP的应用数据都到了B进程准备加解密,这时这个连接得加密密钥其实在A进程,而B进程根本无法完成加解密,实际上如果无法保证一个连接上所有数据包都发往同一进程处理,握手都不可能成功完成。

当然,多进程之间可以采取数据共享(如:共享内存),但是要保证数据的同步就必须加锁,通常情况下还必须是互斥锁,VPN服务器的性能又成了最大的问题,违背了本来想使用多进程的初衷。

另外,多进程也可以监听不同的端口来保证一个连接上的所有数据包都发往同一进程处理,但是如果大量连接都在同一进程中处理相当于又回到了单进程模式,因此多进程还需要监听同一UDP端口(VPN连接本身通常会使用UDP套接字),并且此UDP端口需均匀地将不同连接分配到各个VPN服务端进程达到负载均匀的效果,以满足利用多核CPU提高性能的目的。

综上所述,目前主要要解决以下两个问题:

1、当VPN客户端发送任意数据包(包括握手数据包和应用数据包)到VPN服务端时,数据包在到达VPN服务器后如何能找到正确的VPN服务端进程;

2、当应用服务器通过VPN服务端返回数据包(TCP/UDP应用数据包)给VPN客户端时,数据包在达到VPN服务器后如何能找到正确的VPN服务端进程。

为此,本申请人也进行了有益的探索和尝试,找到了解决上述问题的方法,下面将要介绍的技术方案便是在这种背景下产生的。



技术实现要素:

本发明所要解决的技术问题在于:针对现有技术的不足而提供一种提高VPN服务端并发性能的方法,该方法可以使得任意数据包在到达VPN服务后可以迅速地能找到正确的VPN服务端进程,同时也可以使用同一UDP端口均匀的将不同连接分配到各个VPN服务端进程达到负载均衡的效果,以满足利用多核CPU提升性能的目的。

本发明所解决的技术问题可以采用以下技术方案来实现:

一种提高VPN服务端并发性能的方法,包括以下步骤:

步骤S10,当VPN客户端发送任意数据包到达VPN服务器时,VPN客户端先对需要发送的数据包进行加密,并根据数据包的目标IP地址路由选择是否发往本机,确定该数据包为发往本机的数据包后,执行步骤S2;

步骤S20,该数据包由协议栈的网络层进入传输层的UDP处理模块,进入UDP处理模块后根据目标IP地址和目标端口进入到同一进程进行处理,保证一个连接上所有数据包都只能发往同一进程处理的同时均匀地将不同连接分配到各个VPN服务器进程内;

步骤S30,VPN服务器进程接收到数据包后,VPN服务器对数据包进行解密,再直接写入多队列TUN虚拟网卡中并记下队列号,然后将解密后的数据包发送至应用服务器进行处理;

步骤S40,应用服务器接收到解密后的数据包后,对数据包的请求进行处理并返回响应数据包,然后将响应数据包发送至VPN服务器;

步骤S50,响应数据包经过VPN服务器时会被路由至多队列TUN虚拟网卡,多队列TUN虚拟网卡根据之前记下的队列号找到响应数据包相对应的VPN服务器进程,响应数据包被送入与其相对应的VPN服务器进程内;

步骤S60,VPN服务器将响应数据包加密后返回给VPN客户端。

由于采用了如上的技术方案,本发明的有益效果在于:

1)采用高版本Linux内核协议栈的UDP负载均衡算法实现VPN客户端发送任意数据包(握手和应用数据包)到达VPN服务器后都能找到当前的连接所在的那个VPN服务端进程;同时也实现了可以使用同一UDP端口均匀的将不同连接分配到各个VPN服务端进程达到负载均衡的效果已满足利用多核CPU提升性能的目的。

2)采用高版本Linux内核多队列TUN虚拟网卡实现当应用服务器通过VPN服务端返回数据包(TCP/UDP应用数据包)到达VPN服务器后能找到当前的连接所在的那个TUN队列;同时等同于找到了当前的连接所在的那个VPN服务端进程(每个VPN服务端进程都会打开一个属于自己的TUN队列,因此找到TUN队列也就找到了对应的VPN服务端进程),大大提高VPN服务器的性能。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是目前的虚拟专用网的结构示意图。

具体实施方式

为了使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体图示,进一步阐述本发明。

本发明的一种提高VPN服务端并发性能的方法,包括以下步骤:

步骤S10,当VPN客户端10发送任意数据包(包括握手数据包和应用数据包括)到达VPN服务器20时,VPN客户端10先对需要发送的数据包进行加密,并根据数据包的目标IP地址路由选择是否发往本机(VPN客户端10发送给VPN服务端的数据包的目标IP地址应当都是VPN服务器20),确定该数据包为发往本机的数据包后,执行步骤S2;

步骤S20,该数据包由协议栈的网络层进入传输层的UDP处理模块(VPN连接本身通常会使用UDP套接字),进入UDP处理模块后根据目标IP地址(VPN服务器20IP地址)和目标端口(VPN服务端监听端口)最终选择发往哪个SOCKET(一个SOCKET套接字对应一个进程)。此时,由于多进程VPN服务端同时监听了同一个UDP端口,因此找到了多个SOCKET,需要在保证一个连接上所有数据包都只能发往同一进程处理的同时均匀的将不同连接分配到各个VPN服务端进程达到负载均衡的效果:

步骤S21,首先根据数据包的四元组(源IP,源端口,目标IP,目标端口)计算出一个哈希值;

步骤S22,然后根据哈希值乘以匹配次数(第N个SOCKET为N)右移32位是否等于零的结果决定是否匹配当前SOCKET,若匹配先将结果记录到result指针中(只是记录,还没结束);

步骤S23,接着根据原来哈希值计算出新的哈希值(采用Linux随机数生成算法),返回步骤S22;

步骤S24,循环执行步骤S22和步骤S23,直至所有找出的SOCKET(多进程VPN服务端同时监听同一端口的多个SOCKET)都遍历完毕,result指针所指向的结果就是我们要找的SOCKET。

至此,找到SOCKET也就意味着找到了对应的VPN服务端进程。由于同一VPN客户端10同一连接的数据包的四元组不会改变,因此根据四元组变量每次都能计算出相同的哈希值,每次也就能匹配到相同的SOCKET(SOCKET的顺序是不会自动改变的),每次都能保证找到同一个VPN服务端进程;

步骤S30,VPN服务器进程接收到数据包后,VPN服务器20对数据包进行解密,再直接写入多队列TUN虚拟网卡(利用虚拟网卡驱动是网络设备驱动的同时还是个字符设备驱动的特性,VPN服务器进程在初始化时只要先open,此时已经对应了多队列TUN虚拟网卡中的一个tun_file结构数组中的一个tun_file,而每个tun_file都有一个属于自己的队列),并记下队列号,以便数据包返回时能根据队列号找到tun_file结构数组中正确的tun_file,然后将解密后的数据包发送至应用服务器30进行处理;

上述将数据包写入多队列TUN虚拟网卡的具体步骤为:

1)首先将数据包(经过VPN服务端解密后的应用数据包)的四元组排序(比较源IP和目标IP按照大小顺序排序)后计算出一个哈希值;

2)然后将这个哈希值模上哈希表长度定位到哈希表中的一个节点,此节点记录了一个冲突链的头指针;

3)接着将这个哈希值和队列号记录到冲突链的节点中。

至此,多队列TUN虚拟网卡已经记下了数据包应该找几号队列。

步骤S40,应用服务器30接收到解密后的数据包后,对数据包的请求进行处理并返回响应数据包,然后将响应数据包发送至VPN服务器20;

步骤S50,响应数据包经过VPN服务器20时会被路由至多队列TUN虚拟网卡,多队列TUN虚拟网卡根据之前记下的队列号找到响应数据包相对应的VPN服务器进程,响应数据包被送入与其相对应的VPN服务器进程内;

具体步骤为:

1)同样将数据包(需要发往VPN服务端加密的应用数据包)的四元组排序(比较源IP和目标IP按照大小顺序排序)后计算出一个哈希值;

2)然后将这个哈希值模上哈希表长度定位到哈希表中的一个节点,此节点记录了一个冲突链的头指针;

3)接着根据此哈希值匹配冲突链节点中记录的哈希值找到一个节点(记录着队列号);

4)最终,根据队列号作为tun_file结构数组下标定位到一个tun_file也就意味着找到了对应的VPN服务端进程。

至此,已经找到了VPN服务端进程,VPN服务端将数据包加密后返回给VPN客户端10,也就实现了同一VPN连接所有(发送和返回)数据包都被发往同一个VPN服务端进程处理,从而在多核CPU的服务器上采用多进程模式即可大大提高VPN服务端的性能;

步骤S60,VPN服务器20将响应数据包加密后返回给VPN客户端10。

以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1