目录
简介
在开发L2tpv2协议的过程中,隧道认证这部分无论是RFC标准还是网上的资料都讲得很模糊,本人经过研究协议报文,理解了这个过程,现在分享给大家。
先来简单介绍一下隧道认证的理论部分(专业术语见文末附录)。
一、理论部分
L2TP在建立控制连接时,采用了一个简单的、可选的、类似于chap[RFC1994]的隧道认证机制。如果LAC或LNS希望验证正在连接或正在被连接的对等体的身份,则在SCCRQ或SCCRP消息中包含一个Challenge AVP。如果在SCCRQ或SCCRP中收到Challenge AVP,则必须分别在下一个SCCRP或SCCCN中发送Challenge Response AVP。如果期望的响应和从对等体接收到的响应不匹配,则不允许建立隧道。参与隧道验证时,LAC和LNS之间必须存在一个共享密钥。这与AVP加密使用的共享密钥相同。
1.1 Challenge AVP
Challenge AVP(适用于SCCRP, SCCRQ)[RFC2661],属性类型为11,表示发出请求的对等体希望使用CHAP认证机制对隧道端点进行身份验证。
该AVP的属性值字段格式如下:
Challenge 是一个或多个8字节的随机数据。这个AVP可以被隐藏(h位可以是0或1),m位必须被设置为1,AVP的长度(隐藏前)是6加上Challenge 的长度。
1.2 Challenge Response AVP
Challenge Response (适用于SCCCN, SCCRP) ,属性类型13,提供对接收到的challenge 的响应[RFC2661]。
该AVP的属性值字段格式如下:
Response 是一个16字节的值,以类似于CHAP[RFC1994]的形式作为对端Challenge的响应。
如果在之前的SCCRQ或SCCRP中收到Challenge,则该AVP必须存在于响应SCCRP或SCCCN中。为了计算CHAP响应中的ID值,使用该消息的消息类型AVP的值(例如,SCCRP为2,SCCCN为3)。
这个AVP可以被隐藏(h位可以是0或1),m位必须被设置为1,长度(隐藏前)是22。
1.3 认证具体流程
具体认证的过程如下,挑战方表示发出Challenge的一端。
(1)确认输入参数
包括消息类型ID(被挑战方发送response avp报文的message type值如SCCRQ-SCCRP环节值为2即SCCRP,SCCRP-SCCCN环节值为3即SCCCN)、共享密钥(即隧道认证密码)、challenge值。
(2)输入参数转化为16进制字符串
其中消息类型ID转化为为2字节hex字符串,共享密钥和challenge值根据实际长度转化为hex字符串。
(16进制转化的目的是统一格式为16进制作为MD5算法输入,同理也可以都转化为文本形式)
(3)拼接字符串
按照“消息类型ID+共享密钥+challenge”格式拼接成一个字符串s。
(4)MD5加密
将s以16进制输入的形式进行MD5加密,即可得到challenge response的正确值。
(5)最终认证
挑战方的理论值与对端提供的challenge response值进行比对,如果不同,则认证失败,本地发送STOPCCN断开连接并清理隧道。
下面给合具体案例帮助大家理解。
二、案例实践
下面的报文是隧道建立过程中的前两个报文SCCRQ&SCCRP,以此作为案例讲解。
(1).确定输入参数
Challenge value(hex string):d62c0000ae72000052690000905f0000
消息类型ID:2
Password:nihao(华为路由器通过tunnel password cipher nihao配置)
(2).输入参数转化为16进制字符串
消息类型ID:02
Password:6e6968616f(字符串转16进制)
Challenge value:d62c0000ae72000052690000905f0000
(3).拼接字符串
02+6e6968616f+d62c0000ae72000052690000905f0000
(4).MD5加密
MD5(026e6968616fd62c0000ae72000052690000905f0000)=87adefb0c20690433760222d8a99fcc6
MD5加密可在网上找一个在线工具实验,推荐这个工具:在线MD5工具(记得将工具里的输入类型配置为16进制)
(5).最终认证
本地经过MD5加密计算的response理论值和实际值相同则通过,回复SCCCN继续建立隧道。
不同则发出STOPCCN给出错误提示并清理隧道。
总结
总体而言,认证的关键在于共享密钥。认证的三个参数中,除了密钥之外都是公开在报文中的,只有隧道两端设备配置的密钥相同,才能建立隧道成功。
最后,欢迎大家讨论交流,创作不易,喜欢的话记得点赞收藏,您的支持是我学习和分享的动力。
乘风起-xwm
附录 (专业术语)
术语 | 术语全名 | 说明 |
---|---|---|
L2TP | Layer 2 Tunneling Protocol | 第二层隧道协议 |
LAC | Link Aggregation Concentrator | L2TP访问集中器(LAC)。一个L2TP隧道终端的节点,是L2TP网络服务器(LNS)的对端。LAC位于LNS和一个远端系统,并在之间转发报文。从LAC发向LNS的报文需要使用L2TP协议封装。LAC提供对L2TP网络服务器(LNS)的访问。从LAC到远端系统的连接,也可以是本地(LAC客户端)或者一个PPP连接。 |
LNS | L2TP Network Server | L2TP网络服务器(LNS)。一个L2TP隧道终端的节点,是L2TP访问集中器(LAC)的对端。LNS是由LAC在远端系统封装的PPP会话的逻辑终止点。 |
NAS | Network Access Server | 一种通过远程接入网络(如PSTN)向用户提供本地网络接入的设备。NAS可以同时作为LAC和LNS,也可以同时作为LAC和LNS。 |
AVP | Attribute Value Pair | 属性值对(AVP):唯一属性(整数类型)可变长度的连接,包含由属性标识的实际的值。多个AVP组成用于建立,维持,拆除隧道连接的控制消息。 |
Analog Channel | - | 在每个方向传输3.1kHz的音频的交换线路。 |
Call | - | 在一个远端系统和一个LAC之间的一个连接(或者尝试连接),例如,一个通过PSTN的电话呼叫。相关联的L2TP会话在LAC和LNS建立好的隧道之上成功连接,一个Call(Incoming或者Outgoing)在一个远端系统和LAC的成功建立。 |
被叫号码 | - | 被叫号码: 一个Call中的接收者的ID,呼叫者用来联系接收者的电话号码。 |
呼叫号码 | - | 用于接收者标识呼叫者的电话号码。 |
Incoming Call | - | 一个由LAC发起,发现LNS的Call。 |
Outgoing Call | - | 一个由LNS发起的Call。 |
隧道 | - | 一个隧道存在于成对的LAC和LNS之间。隧道是由控制连接和0个以及以上的L2TP会话组成,隧道在LAC和LNS之间发送PPP封装和控制消息。 |
会话 | - | 一个被封装的PPP会话,也被称作一个Call。L2TP是面向连接的协议,LNS和LAC维持每个Call的状态,包括LAC发起或者应答的Call。当端到端的PPP连接在一个远端系统和LNS建立时,一个L2TP会话在LAC和LNS之间建立。PPP连接相关的报文在LAC和LNS之间发送。L2TP会话和Call之间是一对一的对应关系。 |
LCCE | L2TP Control Connection Endpoint | 控制连接终点LCCE(L2TP Control Connection Endpoint):L2TP控制连接隧道任意一端的L2TP节点。它既可以是LAC,也可以是LNS。取决于在数据链路层还是在网络层处理隧道帧。若在数据链路层处理隧道帧,则LCCE是LAC;若在网络层处理隧道帧,则LCCE是LNS。 |
PW | Pseudowire | 伪线PW(Pseudowire):一条从本地AC接口到对端AC接口之间的虚拟的、直接相连的数据通道,能够完成用户的二层数据透明传输。每个L2TPv3会话对应一条PW。 |
AC接口 | - | 连接用户侧设备的接口,用于接收和发送用户侧流量。 |
PW接口 | - | 连接对端LCCE的接口,用于LCCE接收和发送L2TPv3协议报文和网络侧数据报文。 |
静态隧道 | - | 静态隧道是指直接通过命令行配置指定本端和对端的参数,不需要经过报文协商过程就直接进行数据转发。一个接口下只有一个隧道,一个隧道只支持一个会话。不同的接口下可以配置多个隧道。 |