观看前提:具有PPP,PPPoe基础

L2TP概述

我们都知道PPP协议,它具有的独特的验证功能是以太网没有但是却一直想拥有的内容,因为以太网多个优点和高速率,由此产生出了PPPoe协议,将PPP报文承载在以太网结构上,于是PPP报文也可以在以太网上传输了。PPP协议大家都很喜欢的功能就是它的验证功能,虽然PPPoe实现了PPP报文在以太网链路的传输,但是因为它的发现报文的目的地址是广播包,所以这就导致PPPoe的作用范围仅仅局限在一段广播链路当中,虽然在最后一公里这并不是什么十分大的问题,但是如果假如我们想要使用PPP的功能用作其他的验证的场景的时候,就因为它的作用范围而受限,于是就出现了L2TP,我们可以理解为它是PPPoe的改版,同样是PPP报文承载其中,并利用它的验证功能。虽然可以实现跨网段的连接验证,但是L2TP是没有安全保护的,同GRE一样,它同样是通过在PPP报文的前面添加公网地址的三层头部,由此来实现跨网段的链路验证。如果要将L2TP和GRE做比较的话,GRE就是用公网三层头部运输EthernetVII的报文,而L2TP是使用公网三层头部运输PPP报文,并使用了PPP的验证功能。

L2TP中出现的角色

LAC:这个就相当于企业支部中出口设备,它用于和其他L2TP设备协商隧道

NAS:这个和LAC差不多,但是它主要指的是提供PPPoe服务的接入设备

LNS:这个就是被动和别的设备建立隧道的设备

讲解拓扑

 拓扑如上图所示,下面讲解隧道连接和会话协商的流程:

简要说明

在这种由客户机去主动协商的场景下,一般是使用软件,去发起VPN的连接,整个发包流程如下图所示:

 客户端使用软件将自己的协商报文通过层层的封装,最后发送到对端,对端再进行接收和处理。在L2TP的隧道中数据的传输无论是协商报文还是后面的数据报文都是以单播的形式进行传送的,L2TP是一种基于UDP的应用层的功能模块监听的端口是 1701,当客户端将被封装多层的数据报文发送到接收端后,接收端的上层L2TP模块就会进行处理,因为这个数据报文的目的地址是公网接口,而且经过层层的解封后会发现它要发送给上层监听1701的进程,那么该数据报文毫无疑问就是发送给L2TP功能模块。

隧道的协商过程

SCCRQ:start control connection request 开始控制连接请求报文

SCCRP:start control connection response开始控制请求响应报文

SCCCN:start control connection connected开始控制请求连接已连接报文

 1、首先客户端会发送SCCRQ报文,该报文的中文意思是开始控制连接请求,也就是申请进行隧道的协商,在SCCRQ报文中客户端会携带着自己希望的隧道ID给接收端,但是在此时双方是没有隧道ID和会话ID的,如下图所示:

2、此时接收端通过SCCRP将自己希望的隧道ID发送给客户端,其实主要还是看接收端,最后的取决者主要是看接收端。如下图所示,接收端此时希望的隧道ID是1,那么后续双方建立的隧道的ID就是1了 

 3、客户端发送确认报文SCCCN报文确认接收接收端的隧道ID,如下图所示:

可以看见,此时原本为0的位置,此时的值变为了1,表示后续双方的隧道ID为1.

 会话协商过程

ICRQ:incoming  request :呼入请求

ICRP:incoming  response :呼入响应

ICCN:incoming connection:呼入连接

 会话协商的主要目的和隧道协商差不多,也是协商ID,那么问题来了为什么要协商隧道ID和会话ID?因为在一台设备上可能存在多个L2TP的隧道,而且在一条隧道上可能存在多个会话。所以会协商隧道ID和会话ID。

1、客户端发送ICRQ报文,并携带自己希望的会话ID,如下图所示,一开始是没有会话ID的。 

2、接收端发送ICRP报文,同样也携带者自己希望的会话ID

 如图所示,接收端希望的会话ID是3。 

3、客户端发送ICCN报文表示确认

可以发现此时会话ID已经变成3了。 

PPP协商

当隧道和会话协商完成后,后面就是PPP的协商了,在这里我使用的是PAP认证,其实整个协商过程和普通的PPP协商没有什么不同,主要就是协商物理链路的参数,网络层的参数,在这里我们使用的是自动给请求方进行地址分配的方式 。详细的PPP协商看我的其他博客

接收端的变化

接收端在隧道和会话都协商完成后,会在自身产生一条unr的主机路由:

目的地址:客户端分配到的IP 子网掩码:32  下一跳:L2TP相关的VT接口

这么做有什么用?这样做主要是为了回包,一般我们给客户端分配的地址是不会与私网地址同网段的,所以私网的主机肯定会将该报文发送给网关,于是发送给网关后,网关就会将该报文转送给L2TP的模块进行处理。

客户端的上网方式

当PPP协商完成后,客户端会得到一个接收端分配给它的地址,客户端此时上网的方式有两种,一种就是所有的流量都通过L2TP的隧道进行封装,第二种就是部分流量使用隧道封装。什么意思?第一种很好理解,只要有流量产生,那么L2TP模块就会生效将该流量进行L2TP的封装,然后将其以单播的形式发送到L2TP的对端。对端在接收后将L2TP的相关封装解封,然后得到源IP接收端分配给客户端的地址。对于第二种方式,在客户端软件上会设置只有主机访问目的地址为xxx的主机后,我们才进行L2TP的封装,并进行隧道的转发,非该选中地址的流量都将其发送给网关。

参考文档

HUAWEI USG6000E 产品文档

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐