一、应用背景
该协议主要用于设备和VPN发送认证信息后并获取服务器分配的IP,后续使用这个IP进行内网资源的访问。
二、L2TP协议位于网络模型中的位置
一般设备会通过网络进行拨VPN,我们只需要使用tcpdump进行抓包即可:
随便点开一个数据包,就可以知道他是基于UDP协议的,换句话说,UDP协议就是负责承载它的
后续通过连接上 VPN服务器的设备也是可以看到的
其次报文封装格式:
注意:L2TP这里分为控制协议和数据协议,通过相应的报文格式可以知道,他是在上层进行承载PPP数据帧,在PPP数据帧中可以继续封装UDP、TCP等协议,详情请看下面的报文分析
三、想要建立联系
为什么能够向服务器发送消息?因为你的设备必须是接入公网的,或者你的设备和服务器在同一个内网里面并通过路由器能够实现信息传递。
因为L2tp中需要建立隧道和会话,通过上看到设备和VPN服务器之间建立的UDP端口都是1701,所以猜测这个会话和隧道是在端口之上建立的逻辑,据网上说能实现网络安全加密,这里只是浅浅的做个预判,消息体应该还是透明的,只是由于有了不同的隧道和会话号,就能够别人读不出来我们在隧道中建立的会话用于传递的什么信息
消息体不会详细列举,只会讲解其中涉及到和服务器交互的一些报文,首先通过抓包是可以抓到这样的一些信息的:
上图中的框中就是和服务器交互并获得服务器返回隧道号和会话号的过程,流程简化如下:
3.1 各个消息体的作用
SCCRQ 由设备主动发起向对端发送控制连接请求,用来初始化设备和服务器之间的Tunnel,开始Tunnel的建立过程
SCCRP 接收对端的连接请求,Tunnel的建立过程可以继续
SCCCN 对SCCRP的回应,完成Tunnel的建立
ICRQ 当LAC检测由用户拨入的时候,向LNS发送ICRQ请求在已建立的Tunnel中建立Session
ICRP 回应ICRQ,标识ICRQ请求成功,服务器会在ICRP中表示L2TP Session必要的参数
ICCN 回应ICRP,表示L2TP会话建立成功
(SLI) PPP会话控制中用于设置链路信息
跟着上图中的流程走下来,只能说明和服务器那边建立了联系,但是还不能访问服务器内部的一些网络资源,为什么?因为这个过程中,你没有一个符合能够访问他内网网段的一个IP,肯定你发起的所有消息都会被服务器的防火墙就过滤掉了,换句话说,PPP5这样的IP不是在这里建立的,L2TP的使命视乎完成了80%
其次还有个需要关注的地方:就是好像只有吧隧道和会话都建立成功以后,才能够开启PPP数据帧交互,那是不是可以认为PPP数据帧实际上是被会话/隧道所承载的?然后根据隧道和会话建立的先后关系,不难看出,会话应该也是复用在隧道之上
后续的会话中也会在L2TP中就会封装对应的隧道号和会话号
下图作为了解即可:
四、压轴出场--->得到入场券
4.1 协商PPP链路特性,为挑战鉴权做准备
参看这句话
这里就是说会话一旦建立完成,就会收到对端发送的PPP帧,我们看看原来的交互报文,前面关于链接的哪里是有一个PPP LCP报文的
这里的主要是进行PPP链路中的一些参数的协商,前文讲过XL2TP的数据协议是不可靠的,这里发送ZLB的目的如下(保证通信双方的信息可靠传输):可靠信道(reliable control channel)、确认接受数据包(acknowledging packets);
继续拆解PPP LCP报文:
注意:这里不是只有这一种鉴权方式:具体方式根据上文中的code来确定
4.2 挑战鉴权正式开始
服务器发起鉴权
设备回应
回复结果
这上面的过程中的传输的用户名和密码都是会经过一些算法生成消息体在进行传输,不会通过铭文进程传输
此时应该有一个疑惑,我们认证成功了,不是说还会有一个PPP1或者ppp5这样的IP,他又是怎么得到的?
带着这个疑问:我们继续分析报文:
4.3 IP协商
这里也是基于PPP的IPCP协议进行的IP协商:
1、服务器那边会给你一个IP
2、设备这边此时没有IP的,他需要发送0.0.0.0这样的默认IP消息体给到对方,让他给予回应
- 服务器根据设备回复的消息进行相应的处理
五、数据的发送
根据前文的分析,得到IP以后,设备是不是就可以想服务器内部的设备发送消息了,但是这个报文怎么封装呢?我们这样想,应用层是基于比如TCP封装的协议,他需要满足以下的封装关系:
对应的报文
六、调试
xl2tpd -c /etc/xl2tpd/xl2tpd.conf -D (-D表示进入调试模式))
链接的服务器配置,下面的PPPoptfile里面就是写的用户名和密码
链接 echo 'c vpn-connection' >/var/run/xl2tpd/l2tp-control
断开echo 'd vpn-connection' >/var/run/xl2tpd/l2tp-control
后记:
以上内容只是皮毛,只能说将其应用起来能够实现两个网络的联通即可,至于其中的XL2TP和PPP之间是如何配合的这才是难点(因为Xl2TP中的鉴权和IP分配都是通过PPP协议来的),其次就是使用隧道号和会话号实现逻辑链接的消息体传送也是需要体会的,现在修为不够,不敢妄下推断,以上只是自己的个人简介,如有谬误,请帮忙指正出来。
七、参考资料
(Xl2tp源码中的指导文档)