APP下载

Linux下L2TP网络服务器设计

2011-05-08伸桂林张新有

铁路计算机应用 2011年3期
关键词:配置文件报文数据包

伸桂林,张新有,李 波

(西南交通大学 信息科学与技术学院,成都 6 10031)

虚拟专用网(VPN)是在公用网络上建立专用网络的技术。它通过依靠ISP和NSP,在公用网络中建立专用的隧道,隧道将原有的数据包封装到新的数据包内部进行传输[1]。VPN的隧道主要可为第2层和第3层隧道,第2层隧道建立在数据链路层上,第3层隧道建立在网络层上。L2TP协议[2]是建立在数据链路层的第2层隧道协议。

1 L2TP隧道协议

L2TP是由点到点隧道协议(PPTP)和第2层转发协议(L2F)综合发展而来,具有二者的优点。即把传统的远程拨号网络结构中的第二层连接的端点和PPP会话端点分开,分别驻留在不同的设备上,通过包交换进行分组网络连接。这种分离使得第2层连接可以在一个电路集中器上终止,通过共享网络扩展逻辑PPP会话,不用在网络访问服务器(NAS)上终止,从而节省昂贵的长途话费。

L2TP能支持IP、IPX、AppleTalk等多种网络层协议,并提供流量控制机制,能够完成输入、输出呼叫功能,提供MD5的加密算法和CHAP[3]竞争握手验证机制来保证关键数据的安全性。

1.1 L2TP原理

L2TP一般采用客户/服务器体系结构,由2个基本构件组成:(1)L2TP访问集中器LAC,用于发起呼叫和建立隧道,将拨号用户的PPP帧封装以后传送到LNS当中;(2)服务器端的L2TP网络服务器LNS,是PPP端系统上用于处理L2TP协议服务器端部分的软件,同时也是所有隧道的终点。LAC将拨号用户的PPP帧封装后,传送到LNS,后者去掉封装包头,取出PPP帧,再去掉PPP帧头,最后获得网络层数据包。

LNS和LAC之间存在着2种类型的连接:(1)隧道(tunnel)连接,在同一对LAC和LNS之间可以建立多个L2TP隧道,隧道由一个控制连接和一个或多个会话连接组成;(2)会话(Session)连接,它必须在隧道建立成功之后进行,每个它对应于LAC和LNS之间的一个PPP数据流。L2TP连接的维护以及PPP数据的传送都是通过L2TP消息的交换来完成。

远端计算机用户通过LAC建立L2TP连接到LNS的整个运作过程如下[4]:

(1)远端计算机用户通过公用电话网或ISDN拨号呼叫,启动PPP连接,连接到LAC,LAC收到呼入信号,应答请求建立一个PPP链路的连接。

(2)LAC判断用户类型,若是去LNS的第2层隧道,则向LNS发送建立隧道连接请求。

(3)LNS收到LAC请求后,建立一条控制连接隧道。根据配置文件来决定隧道建立过程中是否需要对LAC进行认证。隧道建立成功之后随机分配一个隧道号Tunnel ID。

(4)控制连接隧道建立以后,LAC和LNS开始协商建立PPP会话连接。PPP会话连接建立成功之后同样随机分配一个会话号Session ID。

(5)来自远端计算机的PPP包将由LAC通过L2TP封装,以UDP包格式发送给LNS服务器,LNS用相反的进程拆解封装后的PPP包转发给本地的PPP服务器,再和内部网络产生通讯。

1.2 L2TP的协议报文

L2TP的协议结构如图1。L2TP消息分为2种类型:控制消息和数据消息。控制消息用于隧道和会话连接的建立、维护以及传输控制[5]。它的传输是可靠传输,并且支持对控制消息的流量控制和拥塞控制。数据消息用于封装PPP帧,并在隧道上传输。它的传输是不可靠传输,若数据报文丢失,不予重传,不支持对数据消息的流量控制和拥塞控制。数据消息用于承载用户的PPP会话数据包。

图1 L2TP协议结构

由L2TP协议的结构可知,PPP数据的L2TP封装格式如图2。

图2 L2TP封装格式

L2TP对控制消息的可靠传输是由控制消息头中的收发序列号来实现的,在可靠的控制消息传输机制中提供了控制消息重传和拥塞控制的滑动窗口机制,可完成报文重传和重组等功能[6]。L2TP的控制消息和数据消息的头格式相同,如图3。在某个域可选的情况下,如果该域被标记为不存在,则在消息中不存在它的空间。但Length、Ns、Nr域在数据消息中可选,而在控制消息中则必须存在。2层隧道VPN中传输L2TP报文通过UDP的1701端口承载于TCP/IP之上来实现。

图3 L2TP报文头格式

2 L2TP服务器程序设计

2.1 LNS程序流程

L2TP服务器整个程序流程如图4。

图4 LNS程序流程图

2.2 L2TP服务器功能模块的架构

根据LNS的程序流程,本文把LNS服务器分为以下6个模块。

(1) 管理配置模块

管理配置文件包含L2TP基本参数和PPP的设定,如服务器的地址、用户所得的IP范围、用户认证方式等。同时也定义一些基本的功能函数。本系统中用int init_config ()函数来初始化端口和监听地址等;int set_rtimeout (char *word, char*value, int context, void *item)检测报文超时;init_addr ()初始化本地IP。LNS启动后会首先调用管理配置文件模块,读取配置文件中的相应参数进行初始化,然后处于监听状态。

(2) 网络处理模块

L2TP的数据交换通过UDP来传输,本模块主要用于接收来自LAC的UDP包,处理完UDP头部后转交给协议处理模块,以及将来自协议处理模块的数据封装成UDP包,发送到指定的LAC。通过在Linux中建立套接字server_socket = socket(PF_INET, SOCK_DGRAM,0) 和绑定地址bind(server_socket, (struct sockaddr *) &server, sizeof(server))等函数可以实现UDP的接收和发送。UDP的报头总共有8个字节,通过read_packet(struct buffer *buf, int fd, int convert)读取数据时可以去除UDP头。

(3) 协议处理模块

本模块接收L2TP包,检查L2TP协议的有效性,同时检查L2TP数据包的序列号。收到的控制消息(图3中T位为1)转发给控制会话管理模块处理;收到的数据消息(图3中T位为0)则去掉L2TP头转发给PPP模块处理。同时来自PPP模块转发过来需要发出的PPP数据消息则添加L2TP头,转发给LAC。

(4) 控制会话管理模块

本模块主要实现对隧道和会话的建立、维护、中止,决定是否建立隧道或会话,并且分配相应的隧道和会话ID,以及相关AVP属性值的封装。处理来自LAC发送过来的控制消息,需要对用户加入挑战认证时,调用L2TP认证模块。接收到控制消息后,调用do_control( )函数来处理,通过调用l2tp_call( )函数建立服务器和客户端之间隧道,判断消息的类型,然后转入相应的处理;以及判断是否已经存在隧道。最后产生随机的隧道ID。

(5) L2TP认证模块

本模块用来对远端用户合法性进行pap或chap挑战认证,判断其合法性。采用MD5加密机制。LNS中先预配置了用户名和密码,当收到来自于LAC发送的包含用户名的SCCRQ(Startcontrol-connection-Request)包时,LNS 生成一个挑战值附加在回应包SCCRP(Start-controlconnection-reply)中。LAC和LNS分别将产生的挑战值、用户名和密码进行MD5加密转换生成MD5摘要值,当LNS收到LAC发送回来的包含了MD5摘要值SCCCN(Start-control- connectionconnected)包时,将数据包中的MD5摘要值和LNS计算所得的摘要值进行比较,如果相同则通过认证。

(6) PPP模块

PPP模块主要用于和PPP服务器建立连接,负责转发来自于LNS和PPP服务器之间的PPP数据帧。目前Linux已经有比较成熟的PPPD服务器。PPPD服务器的通信是通过设备和MODOM间的通信,实现和PPPD间通讯的方法是修改PPPD程序内核,将通信设备的数据流从核心层转到用户层上来,这种方法比较困难。本文采用字符伪终端设备/dev/ptyxy将终端的输出定向到应用程序中进行处理来实现PPPD与PPP模块的通信[7]。

具体实现中用start_pppd (struct session *c,struct ppp_opts *opts)函数来处理PPP连接,判断是否打开伪终端设备;用execv (PPPD, stropt)函数来启动PPPD用户建立PPP链路;用read_packet (struct buffer *buf, int fd, int convert)函数负责从伪终端主设备读取来自伪终端从设备的数据;用inline int write_packet(structbuffer*buf,struct tunnel *t,struct session *c,int convert)函数负责向伪终端主设备写入数据。

2.3 主要数据结构

L2TP服务器的主要由隧道和会话组成,其中会话的建立又包括2个方面:呼入呼叫会话连接和呼出呼叫会话连接。因此为LNS服务器主要定义了3个数据结构:LNS、Tunnel和Session。其中一个LNS中可以存在多个Tunnel,而一个Tunnel中又同时可存在多个Session。Tunnel和Session为一个链表,数据结构中分别定义了一个*next指针指向下一个隧道和会话。具体关系如图5。

图5 L2TP主要数据结构

LNS保存服务器自身的相关信息,包括一些基本配置数据:如本地IP、是否需要认证、允许连接的LAC ip地址、服务器所提供的IP范围等。LNS数据结构中有一个指向Tunnel数据链的指针*t,用来维护服务器的增加和减少隧道。

Tunnel是一个链表,而会话又是包含在隧道一个结点的链表中,Tunnel结构保存隧道的相关信息,为控制隧道提供状态存储参数。Tunnel中主要定义了:隧道状态、隧道ID、会话总数、消息序列号、期望的消息序列号、接收窗口大小、对端窗口大小等等。同时Tunnel还定义了一个指向LNS的反向指针*lns,用于指示隧道属于哪个LNS。

Session保存会话的信息,为控制会话的数据通信提供参数保存位置。主要定义了:会话ID、会话状态、会话超时时间、pppd的进程、本地呼叫号码、对端呼叫号码等。用struct timeval lastsent来记录最后发送包的时间从而检测会话是否超时。Session中定义了一个指向Tunnel的反向指针*tun,用于表明该会话所属的隧道,为结束会话后隧道、会话的拆除提供方便。

3 L2TP服务器的配置

L2TP主要包含2个配置的文件:(1)配置LNS所用的配置文件,位于/etc/l2tp/l2tp.conf;(2)配置PPPD服务器所用的配置文件,位于/etc/l2tp/ppp-options.l2tp。

LNS配置文件包括一个全局配置和参数配置,全局配置内容放在[global]之后,主要设定监听的IP地址。参数配置内容放在[lns default]之后,主要设定本地的IP地址,用户可获得的IP地址范围,是否需要对客户端进行pap、chap认证等。

本文进行模拟测试时具体配置如下:

[global]

port = 1701;设置L2TP服务器端口号

[lns default]

allocate ip range = 192.168.1.100-192.168.1.110;给客户端分配的ip地址范围connect ip range = 192.168.1.40-192.168.1.90;允许连接LNS服务器的ip地址范围

local ip = 192.168.1.17 ;本地ip地址

require chap = yes ;要求chap认证

require authentication = yes

pppoptfile = /etc/ppp/options.l2tp

PPPD服务器配置文件主要设定给客户端分配的主DNS服务器和第二DNS服务器地址,以及连接延时时长等。

4 测试实例

本文对L2TP服务器进行了简单的模拟测试,测试环境是用一台电脑作为LAC,采用的是Windows XP环境下配置的L2TP虚拟拨号。另外一台电脑作为LNS,运行在red hat enterprise linux 5--kernel 2.6.18的环境当中。

程序测试结果显示LAC的IP地址为192.168.1.45,LNS的IP地址为192.168.1.17。初始状态下LAC的隧道ID和会话ID都为0。会话号和隧道号为0是特殊的值,它不能作为随机值被分配为隧道ID和会话ID。在建立新的会话阶段,对端的会话ID还没有分配,此时对方会话ID为0。当LNS验证LAC发送SCCCN报文后随机分配隧道ID58809。会话连接还没有建立,会话ID仍为0。LNS回应LAC建立会话连接的请求,发送ICCN后随机分配了会话ID42319。

5 结束语

分析L2TP工作原理以及协议报文的结构,设计并实现基于2层隧道协议的L2TP服务器模块,详细描述了设计方法、步骤以及相关数据结构。并用Windows下的LAC与所设计的服务器进行了连接测试,抓包分析了LNS与LAC之间控制连接和会话连接的建立。本文在实现过程中没有加入IPsec的安全保护,因此不能有效地保护控制连接和数据隧道中的报文,有待进一步探讨IPsec并加入到L2TP的实现中。

[2]PPP Challenge Handshake Authentication Protocol (CHAP)[S]. RFC 1994 August1996.

[3] 王延年. 隧道及其应用技术的研究[J]. 郑州大学学报(自然科学版),2001(3).

[4] 罗 婷,张颖江,陈 雯. 虚拟专用网的二层隧道协议研究及实现[J].湖北工学院学报,2001.

[5]周 殊,潘 炜. 基于二层隧道协议的虚拟专用网研究[J].计算机应用,2007(6).

[6]Yan Niu,Jun Li,Dong Li. The Application of Linux Pseudoterminal Device in the L2TP[J]. Third International Symposium on Intelligent Information Technology Application, 2009.

猜你喜欢

配置文件报文数据包
基于J1939 协议多包报文的时序研究及应用
二维隐蔽时间信道构建的研究*
民用飞机飞行模拟机数据包试飞任务优化结合方法研究
CTCS-2级报文数据管理需求分析和实现
互不干涉混用Chromium Edge
浅析反驳类报文要点
SmartSniff
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
为View桌面准备父虚拟机