一、L2TP简介


  L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议的一种。


1、保护PPP报文。

2、数据没有加密机制,可通过IPSEC保证数据安全。

3、同3层VPN(IPSec\GRE)有所区别的是,L2TP是将来自用户网络的私有数据从二层PPP头部开始进行封装,而三层VPN是将来自用户网络的私有数据从三

层IP报头开始进行封装

4、主要用途:企业驻外机构和出差人员可从远程经由公共网络,通过虚拟隧道实现和企业总部之间的网络连接

L2TP报文封装层次结构


IP报文头

(公网地址)

UDP

报文头

L2TP

报文头

PPP

报文头

IP报文头

(私网地址)

Data

此报文格式是LAC与LNS之间的数据报文。




L2TP报文头是VPN协议报文头,其内封装的是PPP报文,因此L2TP是二层VPN协议。




协议结构:




描述了控制通道以及PPP帧和数据通道之间的关系。PPP帧在不可靠的L2TP数据通道上进行传输,控制消息在可靠的L2TP控制通道内传输。




L2TP报文头格式


L2TP报文头字段说明:

T:消息类型标志位,0为数据报文,1为控制报文。



x:保留位。



S:Ns和Nr标志位,控制报文中此位必须是1。



O:Offset标志位,为1说明Offset有效,控制报文此位必须为0。



P:优先级标志位,数据报文此位为1,表示优先处理;控制报文此位为0。



Ver:必须为2。



Length:消息总长度,单位为字节。



Tunnel ID:控制连接标志符,本端有效。



Session ID:控制连接内的会话标志符,本端有效。



Ns:本消息的序列号。



Nr:在控制消息中,表示预期收到的下一个控制消息的序号;数据消息中无效。



Offset:偏移,如果有效,则数据从偏移后的字节开始。






二、L2TP的关键组件(它们之间通过协商建立隧道)

1、LAC(L2TP Access Concentrator,L2TP 访问集中器)

  

问服务器),主要用于为PPP 类型的用户提供接入服务。LAC 位于LNS 和远端系统之间,用于在LNS和远端系统之间传递信息包。它把从远

端系统收到的信息包按照L2TP 协议进行封装并送往LNS,同时也将从LNS收到的信息包进行解封装并送往远端系统。LAC 与远端系统之间采

用本地连接或PPP 链路,VPDN 应用中通常为PPP链路。


2、LNS(L2TP Network Server,L2TP 网络服务器)
   

的对端设备,是LAC 进行隧道传输的PPP 会话的逻辑终止端点。通过在公网中建立L2TP隧道,将远端系统的PPP 连接的另一端由原来

在逻辑上延伸到了企业网内部的LNS。

3、VPN用户:



指通过L2TP协议连入VPN的用户,通常是外地出差员工或办事机构。



三、会话和隧道这两个概念

   在一个LNS和LAC对之间存在着两种类型的连接,一种是隧道(Tunnel)连接,一对LAC和LNS中可以有多个L2TP隧道;另一种是会话

(Session)连接,它复用在隧道连接之上,用于表示承载在隧道连接中的每个PPP会话过程。

   隧道由一个控制连接和一个或多个会话(Session)组成。会话连接必须在隧道建立(包括身份保护、L2TP版本、帧类型、硬件传输类

等信息的交换)成功之后进行,每个会话连接对应于LAC和LNS之间的一个PPP数据流。控制消息和PPP数据报文都在隧道上传输。

  L2TP使用Hello报文来检测隧道的连通性。LAC和LNS定时向对端发送Hello报文,若在一段时间内未收到Hello报文的应答,该隧道连

被断开。 

 L2TP报文头中包含隧道标识符(Tunnel ID)和会话标识符(SessionID)信息,用来标识不同的隧道和会话。隧道标识相同、会话标

同的报文将被复用在一个隧道上,报文头中的隧道标识符与会话标识符由对端分配。  

   隧道(tunnel)和会话(session)的关系,如下图所示;可以形象的理解为会话是建立在隧道之中的,隧道想成一个有10个车道的高

路,一台拨号PC的数据流为一个会话,相当于占用了一个车道(告诉公路有多少车道是设备规定好的),这个车道只能跑这个运载这个

PC的报文的卡车。(比如某型号设备每条隧道最多支持1000个会话)。



   




•session是由LAC发起的,事实上由LNS发起也是合法的,但消息类型有所不同,分别是:


 

                       




•在一对LAC和LNS中可以存在多条隧道,每条隧道可以包含多个Session,但只有一个控制连接



•Session建立前,必须首先保证控制连接存在,如没有,首先建立控制连接,然后再建立session;如已存在控制连接,直接建立session



•在拆除Session时,如果还有其他Session存在,则控制连接不拆除;如果没有其他Session存在,控制连接随之拆除


                           

L2TP协议

L2TP协议在TCP/IP协议栈中的位置


Python解析lldp协议报文构建拓扑图_VPN


我们以一个用户侧的IP报文的传递过程来描述VPN工作原理,黄色标示的IP为需要传递的用户数据!

在LAC侧的链路层将用户数据报文作为加上ppp封装,然后传递给L2TP协议,L2TP再封装成UDP报文,UDP再次封装成可以在

Internet上传输的IP报文,此时的结果就是IP报文中又有IP报文,但两个IP地址不同,一般用户报文的IP地址是私有地址,而LAC上的IP地址

为公有地址,至此完成了VPN的私有数据的封装;

在LNS侧,收到L2TP/VPN的IP报文后将IP、UDP、L2TP报文头去掉后就恢复了用户的PPP报文,将PPP报文头去掉就可以得到IP报

文,至此用户IP数据报文得到,从而实现用户ip数据的透明隧道传输,而且整个PPP报头/报文在传递的过程中也保持未变,这也验证了L2TP

是一个二层VPN隧道协议!

L2TP协商交互过程

为了在VPN用户和服务器之间传递数据报文,必须在LAC和LNS之间建立传递数据报文的隧道和会话连接,隧道是保证具有相同会

话连接特性的一组用户可以共享的连接属性所定义的通道,而会话是针对每个用户与企业VPN服务器建立连接的PPP数据通道,多个会话复

用在一个隧道连接上隧道和会话是动态建立与删除的。

会话的建立是由PPP模块触发,如果该会话在建立时没有可用的隧道结构,那么先建立隧道连接,会话建立完毕后开始进行数据传输!

1)L2TP建立流程

Python解析lldp协议报文构建拓扑图_IP_02


L2TP隧道的建立是一个三次握手的过程,首先由LAC发起隧道建立请求SCCRQ,LNS收到请求后进行应答SCCRP,最后LAC在收到应

答后再给LNS返回确认SCCCN;隧道建立。

会话建立的过程与隧道类似,首先由LAC发起会话建立请求ICRQ,LNS收到请求后返回应答ICRP,LAC收到应答后返回确认ICCN,会

话建立!

L2TP的会话建立由PPP触发,隧道建立由会话触发。由于多个会话可以复用在一条隧道上,如果会话建立前隧道已经建立,则隧道不用

重新建立。

2)L2TP隧道的维护

Python解析lldp协议报文构建拓扑图_网络安全协议_03

隧道建立后,一直要等到该隧道所属会话全部下线后,再进行拆除,为了确认对端的隧道结构依然存在,需要定时发送与对端的维护报

文,其流程为:LAC或LNS发出Hello报文,对应的LNS或LAC发出确认信息!

3)L2TP隧道拆除

Python解析lldp协议报文构建拓扑图_封装_04


    隧道拆除流程比其建立过程要简单,隧道的任何一端发出拆链通知StopCCN,对端返回确认;会话的拆除流程为:会话一端发出拆链通知CDN,对端返回确认即可!




四、AVP简介


一种对属性类型和属性值统一编码的方法;L2TP控制消息通过AVP携带各种参数;首先说明属性类型,然后说明属性值。


格式:


Python解析lldp协议报文构建拓扑图_VPN_05


M:强制位,该位置1时,不识别的AVP将导致相应的session或tunnel终止。



H:隐藏标志位,该位置1,表示AVP值被隐藏显示。



rsvd:保留位。



Length:AVP报文长度。



AttributeType:属性类型定义。



AttributeValue:属性值。



属性类型和属性值共同决定了AVP的含义和内容。






AVP的一种加密解密算法:



加密过程:

c1= p1⊕ MD5(AV|S|RV)
c2= p2⊕ MD5(S|c1)
…
ci = pi⊕ MD5(S|ci-1)
其中AV是2字节的属性类型,S是通信双方的共享秘密,RV为随机向量
对应解密过程是:
p1=c1⊕ MD5(AV|S|RV)
p2=c2 ⊕ MD5(S|c1)
…
pi=ci ⊕ MD5(S|ci-1)

其中AV是2字节的属性类型,S是通信双方的共享秘密,RV为随机向量