陈小辉,高 燕,刘汉烨
(榆林学院 信息工程学院,陕西 榆林 719000)
随着经济全球化趋势的不断推进,越来越多的公司和企业的业务需要跨越了不同的地域和国家,他们迫切需要一种廉价安全的技术来保证异地部门之间信息的同步和实时的通信。VPN(Virtual Private Network)就是这样一种实现方案,它是利用现有的网络基础设施为客户创建隧道,在面向公众的开放网络中建立私有数据信道的技术,从而实现不同部门、地域分支之间的数据通信,并提供与私有网络一样的安全和功能保障。在VPN网络中,任意两个连通的分支之间并没有传统专用网所需的端到端的通信线路,而是通过使用现有公共网络资源随机组成的,采用安全隧道、用户认证、访问控制等技术实现与私有网络类似的安全特性,从而实现对企业内部信息的安全保障[1]。使用VPN能够降低网络成本和建设时间,提高安全性和可靠性,增强可管理性和易扩展性,所以它是今后企业网的发展方向。
VPN的实现大都要求采用某种类型的隧道技术。隧道技术采用的是在公共互联网络的基础设施上传递私有数据的方式。使用VPN传递的数据包可以是不同协议的数据帧或包,通过使用隧道协议将这些数据帧重新封装在新的隧道数据包中发送。主要涉及3种协议,即隧道协议、承载协议和乘客协议。承载协议包把隧道协议包作为自己的数据部分来传输,隧道协议包又把乘客协议包作为自己的数据部分来传输。
根据封装的层面不同可分为二层隧道和三层隧道,二层隧道协议主要有PPTP(Point-to-Point tunneling protocol)、L2F(Layer Two Forwarding protocol)、L2TP、MPLS(Multi-protocol Label Switching),三层隧道协议主要是IPSec。L2TP(Layer Two tunneling Protocol)是实现二层隧道VPN的主要技术,有L2TPV2和L2TPV3两个版本[2]。目前广泛使用的是L2TPV2,但是L2TPV2本身存在较多的局限性,由于其协议本身和二层PPP(Point to Point Protocol)协议有较多的关联,导致其不便于对其它二层协议帧进行隧道传输,另外其非对称工作模型也限制了它的应用范围。
L2TP是在构造VPN网络中最常用的一种二层隧道协议,该协议将网络接入服务器NAS(Network Access Server)的功能分为LAC (L2TP Access Concentrator)和LNS(L2TP Network Server)来完成。目前有L2TPV2和L2TPV3两个版本,L2TPV2主要还是针对二层PPP报文提出的隧道技术,它解决了PPP链路捆绑的问题,可以使物理上连接到不同NAS的PPP链路,在逻辑上终结在同一个物理设备上,实际上它是实现了PPP会话的终结点和PPP连接的终结点分离。在L2TPV3版本中把原来与PPP相关的内容分解出来放到专门的协议中描述,使得L2TPV3和封装的二层报文类型无关,这样就可以通过使用L2TP隧道完成所有的二层帧的传输。其次是对原有的旧版本的工作模式进行了扩展,由原来的主从式非对称模式发展为对称模式[3]。L2TPV3与L2TPV2两个不同版本之间存在较大差异,首先,L2TPV2最初是基于PPP会话协议制定的,在L2TPV2报文头中包含过多与PPP报文有关的信息,而在新版本中把所有与特定PPP数据报相关联的分离,使得新版协议与所传输的报文类型没有直接关系,便于传输多种形式的报文[4];其次,对L2TPV2所支持的隧道工作模式进行了扩展,不在是单一的LAC-LNS非对称模式,而隧道两端的设备连接关系可以是:LAC-LAC,LNS-LNS,LAC-LNS三种之一;最后L2TPV3报文中会话ID和控制连接ID增加到了32位,从而使支持的控制连接及会话数量由65000条激增到40亿条以上。
本次开发是在L2TPD 0.69的基础上,对原有的L2TPV2模块代码进行再开发实现的,虽然两个版本之间有相当的差别,但是两个版本的程序主体流程是相似的,在本次开放中将两个版本的状态机部分进行兼容设计,从而减少系统开发成本,提高了代码重用性。考虑把L2TPV2和L2TPV3统一在同一个任务中实现,在细节处理上的不同,可以根据协议版本号来判断分别做不同的处理。图1是对L2TPV3和L2TPV2两个协议的流程对比,图中灰色部分表示处理细节上存在差异,白色背景表示相同。在开发是,需要针对灰色部分根据版本号分别实现,而其他部分则可以共用。
图1 L2TPV2和L2TPV3处理上的异同
Fig.1 The differences between the processing of L2TPV2 and L2TPV3
L2TP模块主要需要处理两类数据,和对端LCCE之间交互的控制消息,来自用户的需要通过隧道转发的二层链路数据以及从隧道中接收到的需要转发给本地用户的隧道数据消息[5]。表1是L2TPV3模块的输入数据列表,表2是L2TPV3模块的输出数据列表。
表1 L2TPV3模块输入数据列表Tab.1 The input data list of L2TPV3 module
表2 L2TPV3模块输出数据列表Tab.2 The output data list of L2TPV3 module
L2TP数据报文中只是实现对用户的二层帧的封装和传输,不包含隧道的控制信息,故隧道数据报文的处理过程相对较为简单。L2TP控制报文需要完成对于隧道和会话的建立、撤销和维护,必须能够携带大量的控制信息,所以控制报文需要完成对AVP属性值对的编码和解码工作,如图2所示。
图2 顶层控制报文处理流程图Fig.2 The flow-process diagram of top-level control message processing
数据结构是路由软件功能实现和信息存储及交互的基础,在L2TPV3模块中主要使用了3类数据。一种是用来存储全局Tunnel信息的L2TPV3对象数据结构,该结构中保存了当前系统中所有的L2TPV3 Tunnel信息;另外一种用来存储每一个Tunnel信息隧道数据结构;最后一种是用来保存Session信息的会话数据结构。3类数据结构之间的关系如图3所示。
图3 L2TPV3模块数据结构图Fig.3 The data struct of L2TPV3 module
根据L2TPV3协议描述,将L2TPV3的功能实现划分为6个主要子模块。报文收发模块:该模块主要接收来自其它模块的的消息,主要包括从隧道中接收来自Peer LCCE的VPN报文通过二层接口转发给本地VPN用户;负责VPN隧道所需socket连接的建立和维护,以及通过socket收发数据;负责控制消息可靠传输机制的实现,包括对收发报文序号维护,收发窗口字节数维护以及控制报文收发队列管理。报文处理模块:处理从隧道中接收的来自对端LCCE的报文,含数据和控制报文;处理其它模块发来的消息和事件;解析和构造需要通过隧道传输的L2TP报文。会话管理模块:完成会话管理基本数据结构的初始化建立和维护;建立和维护每一个会话,SESSION状态机的创建和维护SESSION相关控制消息的解析和构建;SESSION定时器的创建、维护。隧道管理模块:完成控制连接数据结构的初始构建和维护;构建维护和撤销每条隧道;实现和维护控制连接状态机,处理和构造与控制连接相关控制消息;控制连接定时器的创建和维护。AVP处理模块:对各种类别的AVP数据的构造和解析;对AVP值加密。配置管理模块:提供相关命令配置接口,完成命令行输入数据的解析处理。模块间的调用关系如图4所示。
图4 模块间调用关系Fig.4 The call relation of modules
1)L2TP_L2VPN_Output
函数原型:ULONG L2TP_L2VPN_Output(ULONG ulIfIndex,VOID*pData,ULONG ulDataLen)
该接口函数供L2TPV3模块发送数据时调用,用来发送剥离L2TP头的数据包(pData指向待接收数据)到索引为ulIfIndex的出接口。该函数内部调用软转发的发送函数DEV_Output实现。
2)L2TP_L2VPN_Input
函数原型:ULONG L2TP_L2VPN_Input(SKBUF_S*pSkBuf,ULONG ulToken)
在设置L2TPV3标志位的接口上接到报文时如果需要软转发则调用该接口函数转发,当LCCE接到从eth口或VLAN口上来的链路层报文时,根据ulToken查找对应的tunnel和session,加上对应的l2tp头和Ip头,进行转发。
3)L2TP3_SessionEventNotify
函数原型:LONG L2TP3_SessionEventNotify(L2TP3_SESSION_NOTIFY_S*pstSesNotify)
本函数负责下发session创建或撤销通知,由L2TPV3模块调用,需要由接口管理模块实现具体函数功能。
4)IFM_IfChangeToL2TPV3和IFM_IfBackFromL2TPV3
函数原型:LONG IFM_IfChangeToL2TPV3(ULONG ulIfIndex)
LONG IFM_IfBackFromL2TPV3(ULONG ulIfindex)
该接口函数需要由接口管理模块提供,L2TPV3模块配置命令行时调用。用来设置(或清除)某以太网接口或VLAN接口为L2TPV3接口。
5)IFM_SetL2TPV3Enable和IFM_SetL2TPV3Disable
函数原型:LONG IFM_SetL2TPV3Enable (ULONG unIfIndex,ULONG ulSessID)
LONG IFM_SetL2TPV3Disable(ULONG unIfIndex)该接口函数由接口管理模块提供,L2TPV3模块在Session建立成功(或删除)时调用,用来将Session ID与某个接口关联(去关联)起来,关联后该接口可以通过L2TP转发。ulSessID由接口管理保存,在软转发调用l2tpv3_lcce_receive时,传回给L2TPV3模块。
设计实现了一个兼容V2和V3版本的控制连接状态机,两个版本状态机的不同主要是由于Tie breaker的不同处理而引起的,在V2版本中对控制连接Tie breaker的处理很简单,但在V3版本中根据win和lose状态多了不同的处理;在V2中并没有Session Tie breaker,但在V3版本中引入了这个AVP,所以相应多了两个处理。除了Tie breaker外,状态机的其他部分几乎完全相同。控制连接状态机共有4个状态:1)初始状态,2)等待回复状态,3)等待连接状态,4)连接已建立状态。控制连接状态机能够接收并处理16种事件,如表3所示,采用a到p 16个小写字母来表示。控制连接状态机根据事件的不同能够激发八种动作,如表4所示,采用A到H 8个大写字母来表示。而对于会话状态机的设计由于和V2版本的实现变化不大,在此不作说明。
表3 控制连接状态机输入事件表Tab.3 The input event’s table of connection control state machine
表4 控制连接状态机输出动作表Tab.4 The output action’s table of connection control state machine
在L2TPV3模块实现中重点考虑了和V2实现设备的兼容,实现方法是通过向对端发送一个特殊的SCCRQ报文,该报文的version值为2,并且包含一个或者是多个V3特有的AVP,强制位置0。这样根据对端返回的SCCRP的版本判断对端是否支持V3,如果对端支持V3必然会返回一个V3的SCCRP否则为V2。另外实现了在对端不支持L2TPV3,或者收到V2的SCCRQ报文时,本地自动向L2TPV2回退,自动回退工作流程如图6所示。
图5 L2TPV3控制连接状态机Fig.5 The connection control state machine of L2TPV3
图6 L2TPV3向L2TPV2自动回退的工作流程
Fig.6 The automatic rollback work flow of L2TPV3 to the L2TPV2
开发结束以后,在模拟环境下对L2TPV3的工作性能进行了测试,测试结果显示系统的数据延迟、稳定性、丢包率都在合理范围内,系统性能稳定,各项功能正常,基本达到了预定的开发目的。VPN[7-8]是当今社会企业网络的发展趋势,它能够综合开放网络的共享性能和私有保护网络的安全性,提供远程访问公共网络和企业内部网的功能,而且建设和维护成本合理;随着计算机信息技术的不断发展,应用层面的不断扩展,以及VPN实现技术的日益完善,越来越稳定、高速、安全的VPN实现技术会不断出现。
[1]ZHANG Zhen-sheng,ZHANG Ya-qin,CHU Xiao-wen.An overview of virtual private network:IP VPN and Optical VPN[J].Journal Photonic Network Communications,2004,7(3):213-225.
[2]Lau J,Townsley M,Goyret I.Layer Two Tunneling Protocol-Version 3[S].RFC 3931 March,2005.
[3]Issacs R,Lesile I.Support for resource-assured and dynamic virtual private networks[J].IEEE Journal on Selected Areas in Communication,2001,19(3):460-472.
[4]French S,Pendarakis D.Optical Virtual Private Networks:Applications,Functionality and Implementationc[J].Journal Photonic Network Communications,2004,7(3):227-238.
[5]Rosenbaum G,Lau W,Jha S.Recent directions in virtual private network solutions”[C].The 11th IEEE International Conference on Networks,2003:217-223.
[6]黄浩,谢冬青.L2TP下可信的VPN方案设计与实现[J].计算机工程,2006,32(20):157-159.HUANG Hao,XIE Dong-qing.The design and implementation of believable VPN based on L2TP[J].Computer Engineering,2006,32(20):157-159.
[7]杨斌,邵晓,李光.VPN技术在军队网络建设中的应用[J].现代电子技术,2011,34(6):105-107.YANG Bin,SHAO Xiao,LI Guang.Application of VPN technology in network construction of army[J].Modern Electronics Technique,2011,34(6):105-107.
[8]苏雪娟,黄玥,孙宇.MPLS VPN技术在电力企业广域网中的应用[J].电子科技,2013,26(3):137-139.SU Xue-juan,HUANG Yue,SUN Yu.Application of MPLS VPN technique in power enterprise wide area network[J].Electronic Science and Technology,2013,26(3):137-139.