PPTP协议抓包分析及PPTP穿越NAT
目录
1、PPTP协议概述
PPTP英文全称:Point to Point Tunneling Protocol,即点对点隧道协议。是建立在PPP(Point to Point)点对点协议上的VPN隧道技术。
PPTP有两个并行的组成部分:
- 1. PPTP链路控制: 基于TCP的PAC-PNS对操作的控制连接
- 2. PPTP数据传输:一个在相同的PAC-PNS对之间的IP隧道操作。 该操作用来传送封装好的PPP包的GRE(Generic Routing Encapsulation,即通用路由封装协议),为PAC-PNS对之间的用户提供服务。
2、链接控制
在PAC和PNS之间的PPP隧道建立之前, 它们之间必须建立控制连接。
控制层的主要功能包括:
1. 彼此交换基本信息;
2. 负责创建、维护、删除Session;
3. 负责创建、维护、删除Tunnel;
4. 更新通信参数;(Set-Link-Info)
5. 维护控制层自身的连接状态。(Echo-Request、Echo-Reply)
控制连接是标准的TCP会话, PPTP呼叫控制和管理信息就可以通过TCP传送。
控制层连接是基于TCP建立的,PPTP Server监听TCP1723端口,等待Client的连接请求。
控制层自身的状态维护:
PPTP连接双方在一段时间内(60秒)如果没有收到任何控制层信息,就会发Echo-Request查询控制层连接状态,接收方会应答Echo-Reply。如果发送方在60秒内还没有收到应答就会断开控制层连接。
3、报文流程
PPTP链接的建立可以分为以下几个阶段:
1. TCP连接的建立阶段
2. PPTP控制层连接的建立阶段
3. PPP会话阶段(包括LCP协商、身份认证、NCP协商等)
4. PPTP隧道中数据包的交互(实际通信流量、通信的packages是经过GRE封装过的PPP包)
5. PPTP链接的维护
6. PPTP链接的终止
3.1、PPTP建立拓扑
(DNAT)
Client----------------------------------FW----------------------------------server
(192.168.10.115) (192.168.10.114) (10.10.10.1) (10.10.10.2)
3.2、详细报文解释
1、控制连接
包5-7:client和server建立TCP连接
包8:client向server发送start control connection request报文,请求建立控制连接,初始化client和server之间的隧道,开始建立隧道
Length:该PPTP信息的八位总长,包括整个PPTP头。
Massage type:消息类型;1为控制消息,2为管理消息
Magic Cookie:以连续的 0x1A2B3C4D 进行发送,其基本目的是确保接收端与TCP数据流间的正确同步运行
Control Message Type:控制消息类型;
- 1为控制连接请求
- 2为控制连接应答
Reserved:保留位
Protocol Version:PPTP版本号
Framing Capabilities:指出帧类型,该信息发送方可以提供:
- 异步帧支持(Asynchronous Framing Supported)
- 同步帧支持(Synchronous Framing Supported)
Bearer Capabilities:指出承载性能,该信息发送方可以提供:
- 模拟访问支持(Analog Access Supported)
- 数字访问支持(Digital access supported)
Maximum Channels:该 PPTP服务器 可以支持的个人 PPP 会话总数。
Firmware Revision:若由 PPTP服务器 出发,则包括发出 PPTP服务器时的固件修订本编号;若由 PPTP客户端出发,则包括 PPTP客户端 PPTP 驱动版本。
Host Name:包括发行的 PPTP服务器 或 PPTP客户端的 DNS 名称。
Vendor Name:包括特定供应商字串,指当请求是由 PPTP客户端 提出时,使用的 PPTP服务器 类型或PPTP客户端软件类型。
包9:server响应ACK报文
包10:server发出的start control connection reply报文,用于响应start control connection request报文。
start control connection reply报文部分字段和start control connection request报文字段一致。
不同点有:
Control Message Type:控制连接应答报文
Result Code:表示建立channal是否成功的结果码
- 1表示成功
- 2表示通用错误,暗示着有问题
- 3表示channal已经存在
- 4表示请求者未授权
- 5表示请求的PPTP协议版本不支持
Error Code:表示错误码,一般值为0,除非Result Code值为2,不同的错误码表示不同的含义。
包11:由PPTP客户机发出,请求创建PPTP隧道,outgoing-call-request消息包含GRE报头中的Call ID,该ID可唯一地标识一条隧道。
Control Message Type:值为7。
Call ID:由PPTP客户端指定的唯一的会话ID。
Call Serial Number:是由PPTP客户端指定的唯一标识符,用于在记录会话信息中标识特定会话,与Call ID不一样的是,Call Serial Number PPTP客户端与PPTP服务器来说,唯一绑定到一个给定的会话,且是相同的。
Minimum BPS:对于此次会话可接受的最低传输速度,单位为位/秒;
Maximum BPS:对于此次会话可接受的最大传输速度,单位为位/秒;
Bearer Type:指出承载访问支持,该信息发送方可以提供:
- 1 模拟访问支持(Analog Access Supported);
- 2 数字访问支持(Digital access supported)。
- 3 可支持的任何类型。
Framing Type:指出帧类型,该信息发送方可以提供:
- 1 异步帧支持(Asynchronous Framing Supported);
- 2 同步帧支持(Synchronous Framing Supported)。
- 3 异步或同步帧支持。
Packet Receive Window Size:PPTP客户端为此次会话提供最大接收缓冲大小;
Packet Processing Delay:表示PPTP客户端对数据包处理的延时度量,对于PPTP客户端来说,一般设置比较小越好。
Phone number length:拔号号码长度;
Phone number:建立会话向外拔号的号码,一般对于ISDN或模拟方式拔号来说,此字段域为一个ASCII串。
Sub address:额外信息域,一般长度少于64个字节。
包12:服务端回应客户端outgoing-call-request的报文
outgoing-call-reply报文和outgoing-call-request报文大部分字段都一致。
不同字段如下:
Control Message Type:值为8。
Call ID:由PPTP服务器指定的唯一的会话ID。主要用于在PPTP服务器与PPTP客户端建立的会话上,复用与解封装隧道包使用的。
Peer Call ID:设置的值是从接收到的Outgoing-call-request中Call ID值,是由PPTP客户端指定的,用于GRE中对于隧道数据解封与复用。
Result Code:表示响应Outgoing-call-request握手是否成功,
- 1表示成功
- 2表示通用错误,暗示着有问题
- 3表示无载波
- 4表示服务器忙,无法及时响应
- 5表示无拔号音
- 6表示呼号超时
- 7表示未授权
Error Code:表示错误码,一般值为0,除非Result Code值为2,不同的错误码表示不同的含义。
Cause Code:表示进一步错误信息描述;
Connect Speed:连接使用的实际速率;
Rev window size:PPTP服务器为此次会话提供最大接收缓冲大小;
Packet Processing Delay:表示PPTP服务器对数据包处理的延时度量。
Physical Channel ID:由PPTP服务器指定的物理信道ID。
包13:可由PPTP客户机或服务器任何一方发出,控制连接建立成功,设置PPP协商选项。
Length、PPTP Message、Magic cookie与Start-control-connection-request一致
不同的字段含义如下:
Control Message Type:值为15
Peer Call ID:设置的值是从接收到的Outgoing-call-request中Call ID值,是由PPTP客户端指定的,用于GRE中对于隧道数据解封与复用
Reserved:保留位,必须为0
Send ACCM:发送的ACCM值,默认值为0XFFFFFFFF
Receive ACCM:接收的ACCM值,默认值为0XFFFFFFFF
2、数据连接
包14-19:PPP LCP建立PPP链路
包24-25:PPP客户端和服务器建立握手认证。
包26-35:协商PPP压缩算法
包36-53:PPP客户端和服务端协商网络配置
包54-63:PPP封装客户端和服务端之间传输的数据
4、PPTP穿越NAT原理报文分析
通过修改PPTP报文中的call ID值来判断子连接属于哪个控制连接的,然后进行NAT转换。
4.1、控制连接
包30:客户端向服务端发送start control connection request报文,请求建立控制连接
源端口:57371 目的端口:1723
包31:经过防火墙,转换目的IP为pptp服务器IP,源端口转换为1226
源端口:1226 目的地端口:1723
包34:服务端响应start-control-connection-reply报文
源端口:1723 目的端口1226
包35:经过防火墙,匹配连接跟踪表,转换目的IP为192.168.10.115,目的端口转换为57371
源端口:1723 目的端口:57371
包36:客户端发送outgoing-call-request报文,请求建立PPTP隧道,并且携带自己的唯一标识(call id 20631)发送给服务器。
源端口:57371 目的端口:1723 call ID:20631
包37:经过防火墙,生成map表,并记录客户端的call id,转换目的IP为服务器IP,并且修改携带的call ID为源端口并记录修改后的call id带map表中。
源端口:1226 目的端口:1723 call ID:1226
包38:服务器响应outgoing-call-reply报文,携带自己的唯一标识(call id 1280)发送给客户端,并且peer call id填写客户端的ID
源端口:1723 目的端口:1226 call ID:1280 peer call ID:1226
包39:经过防火墙后,通过map表转换peer call id(1226)为对应的客户端peer call id(20631),并且记录服务端的call id(1280)到map表中。然后匹配链接跟踪表转换源IP为客户端IP。
源端口:1723 目的端口:57371 call ID:1280 peer call ID:20631
包40:客户端请求设置PPP协商,携带服务器的call id 1280
源端口:57371 目的端口:1723 peer call ID:1280
包41:经过防火墙,转换目的IP为服务器IP,源端口为1226,不转换服务器的call id
源端口:1226 目的端口:1723 peer call ID:1280
4.2、数据连接
包42:PPP LCP 协商,携带服务器的call id
包43:经过防火墙后,查找map表,发现有call id 1280的表项,然后转换目的IP为服务器IP,并且生成链接跟踪表。
包44:向客户端发送PPP LCP报文,携带客户端的call id 1226
包45:防火墙收到后,防火墙查找map表发现有1226的表项,修改call id 1226为20631。然后查看链接跟踪表,转换目的IP为客户端IP。