首先,先来理解下什么是 PPTP。PPTP将PPP(Point-to-Point Protocol)帧封装进IP数据报中,通过IP网络如Internet或其他企业专用Intranet等发送。PPTP通过PPTP控制连接来创建、维护、终止一条隧道,并使用通用路由封装GRE(Generic Routing Encapsulation)对PPP帧进行封装。封装前,PPP帧的有效载荷即有效传输数据一般会经过加密、压缩或是两者的混合处理。PPTP协议假定在PPTP客户机和PPTP服务器之间有连通且可用的IP网络。因此如果PPTP客户机本身已经是某IP网络的组成部分,那么即可通过该IP网络与PPTP服务器取得连接.MPPE只提供连接加密,而不提供端-端加密。端-端加密属于应用层的加密技术,如果应用中要求实现端-端加密,则可在PPTP隧道建立之后,使用IPSec对两端的IP数据流进行加密处理。基于Internet的PPTP服务器即使用PPTP协议的VPN服务器,它的一个接口在Internet上,另一个接口在Intranet上。
一、 PPTP连接过程与隧道维护
PPTP控制连接建立在PPTP客户机IP地址和PPTP服务器IP地址之间,PPTP客户机使用动态分配的TCP端口号,而PPTP服务器则使用保留TCP端口号1723。PPTP控制连接携带PPTP呼叫控制和管理信息,用于维护PPTP隧道,其中包括周期性地发送回送请求和回送应答消息,以期检测出客户机与服务器之间可能出现的连接中断。PPTP控制连接数据包包括一个IP报头,一个TCP报头和PPTP控制信息,数据包格式如下。所示的PPTP控制连接数据包还包括数据链路层报头和报尾。
PPTP典型连接过程:
TCP连接由PPTP客户机上的一个动态分配的TCP端口到PPTP服务器上的TCP端口1723建立。
二、大致分析下客户端和服务端的报文
start-control-connection-request : 由PPTP客户端发出,请求建立控制连接。PPTP隧道要求在发送任何其他PPTP消息之前,先建立一条控制连接。
start-control-connection-reply:由PPTP服务器发出,回应start-controlconnection-request消息。
outgoing-call-request:由PPTP客户机发出,请求创建PPTP隧道,outgoing-call-request消息包含GRE报头中的Call ID,该ID可唯一地标识一条隧道。
outgoing-call-reply:PPTP服务器对outgoing-call-request消息的回应。
echo-request:作为保持连线机制,可由PPTP客户机或服务器任何一方发出,若echo-request了没有应答,则PPTP隧道逐渐终止。
echo-reply:对echo-request的应答。注:PPTP的echo-request和echo-reply的消息与ICMP回送请求和回送应答消息无关。
WAN-Error-Notify:由PPTP服务器向所有VPN客户机发出,指示服务器的PPP接口处于错误状态。
set-link-info:可由PPTP客户机或服务器任何一方发出,设置PPP协商选项。
call-clear-request:由PPTP客户机发出,请求终止隧道。
call-disconnect-notify:PPTP服务器回应call-clear-request,或因其他原因指示必须终止隧道。如果PPTP服务器终止隧道,则发送出call-disconnect-notify消息。
stop-control-connection-request:可由PPTP客户机或服务器任何一方发出,通知对方控制连接将被终止。
stop-control-connection-reply:回应stop-control-connection-request消息。
三、详细分析数据包的内容
1. Start-control-connection-request
Length : 该 PPTP 信息的八位总长,包括整个 PPTP 头。
PPTP Message Type : 信息类型。可能值有:1、控制信息;2、管理信息。
Magic Cookie : Magic Cookie 以连续的 0x1A2B3C4D 进行发送,其基本目的是确保接收端与 TCP数据流间的正确同步运行。
Control Message Type :值为1。
Reserved 0 & 1 : 必须设置为0。
Protocol Version : PPTP版本号。
Framing Capabilities: 指出帧类型,该信息发送方可以提供:
1、异步帧支持(Asynchronous Framing Supported);
2、同步帧支持(Synchronous Framing Supported)。
Bearer Capabilities : 指出承载性能,该信息发送方可以提供:
1、模拟访问支持(Analog Access Supported);
2、数字访问支持(Digital access supported)。
Maximum Channels : 该 PPTP服务器 可以支持的个人 PPP 会话总数。
Firmware Revision :若由 PPTP服务器 出发,则包括发出 PPTP服务器时的固件修订本编号;
若由 PPTP客户端出发,则包括 PPTP客户端 PPTP 驱动版本。
Host Name : 包括发行的 PPTP服务器 或 PPTP客户端的 DNS 名称。
Vendor Name : 包括特定供应商字串,指当请求是由 PPTP客户端 提出时,使用的 PPTP服务器 类型或PPTP客户端软件类型。
2. Start-Control-Connection-Reply
大部分字段的含义与Start-control-connection-request一致。不同的字段含义如下:
Control Message Type :值为2;
Result Code:表示建立channal是否成功的结果码,值为1表示成功,值为2表示通用错误,暗示着有问题。值为3表示channal已经存在,值为4表示请求者未授权,值为5表示请求的PPTP协议版本不支持。
Error Code:表示错误码,一般值为0,除非Result Code值为2,不同的错误码表示不同的含义。
3. Outgoing-call-request
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。不同的字段含义如下:
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 Recv. Window Size:PPTP客户端为此次会话提供最大接收缓冲大小;
Packet Processing Delay:表示PPTP客户端对数据包处理的延时度量,对于PPTP客户端来说,一般设置比较小越好。
Phone number length: 拔号号码长度;
Phone number:建立会话向外拔号的号码,一般对于ISDN或模拟方式拔号来说,此字段域为一个ASCII串。
Sub address:额外信息域,一般长度少于64个字节。
4. Outgoing-Call-Reply
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。不同的字段含义如下:
Control Message Type :值为8。
Call ID:由PPTP服务器指定的唯一的会话ID。主要用于在PPTP服务器与PPTP客户端建立的会话上,复用与解封装隧道包使用的。
Peer’s 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。
5. Set-Link-Info
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。
Control Message Type :值为15。
Peer’s Call ID:设置的值是从接收到的Outgoing-call-request中Call ID值,是由PPTP客户端指定的,用于GRE中对于隧道数据解封与复用。
Reserved0/Reserve1:保留位,必须为0;
Send ACCM: 发送的ACCM值,默认值为0XFFFFFFFF;
Receive ACCM:接收的ACCM值,默认值为0XFFFFFFFF;
6. Echo request
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。
不同的字段含义如下:
Control Message Type :值为5。
Peer’s Call ID:设置的值是从接收到的Outgoing-call-request中Call ID值,是由PPTP客户端指定的,用于GRE中对于隧道数据解封与复用。
Reserved0:保留位,必须为0;
Identifier:发送者用来标识Echo request与Echo reply对应标识。
7. Echo-reply
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。
不同的字段含义如下:
Control Message Type :值为6。
Peer’s Call ID:设置的值是从接收到的Outgoing-call-request中Call ID值,是由PPTP客户端指定的,用于GRE中对于隧道数据解封与复用。
Reserved0/1:保留位,必须为0;
Identifier:标识值,为接收者从Echo request里标识字段复制填入。
Result Code:结果码,为1表示Echo-reply是有效的,为2表示出现一般性错误。
Error code:同上面所描述的。
8. Call-Clear-Request
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。不同的字段含义如下:
Control Message Type :值为12。
Call ID:由PPTP客户端指定的会话ID。
Reserved0/1:保留位,必须为0;
9、Call-Disconnect-Notify
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。不同的字段含义如下:
Control Message Type :值为13;
Call ID:由PPTP客户端指定的会话ID;
Reserved0/1:保留位,必须为0;
Result Code:结果码,
为1表示媒介断开,
为2表示出现一般性错误,
为3表示为管理员关闭连接,
为4表示收到Call-Clear-Request;
Error code: 同上面所描述的。
Cause Code:此域表示额外说明断开原因。
10. Stop-Control-Connection-Request
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。不同的字段含义如下:
Control Message Type :值为3。
Resverve0/1/2:保留位,必须为0;
Reason:表示会话连接关闭的原因,
为1表示响应会话清除请求;
为2表示不支持对端PPTP版本;
为3表示本地系统关闭。
12. Stop-Control-Connection-Reply
Length、PPTP Message、Magic cookie与Start-control-connection-request一致。
不同的字段含义如下:
Control Message Type :值为4。
Resverve0/1/2:保留位,必须为0;
Result Code:表示关闭连接结果码,为1表示正常关闭成功,为2表示发生一般性错误。
Error Code : 表示当Result Code为2时,对应具体的一般性错误,Result Code为1时,必须为0。
四、总结
1. PPTP原理
首先,PPTP客户机使用动态分配的TCP端口号,与PPTP服务器使用的保留TCP端口号1723建立控制连接(PPTP控制连接携带PPTP呼叫控制和管理信息,用于维护PPTP隧道)。
其次,客户端与服务器通过控制连接来创建、维护、终止一条隧道。
然后,PPP帧的有效载荷经过加密、压缩或是两者的混合处理。
接着,使用通用路由封装GRE对PPP帧进行封装。
再者,将PPP帧封装进IP数据报文中。通过IP网络如Internet或其他企业准用INTRANET等发送给PPTP服务器。
最后,服务器接收到PPTP数据包后进行常规处理。
2. PPTP控制连接数的数据包格式
包括一个IP报头,一个TCP报头和PPTP控制信息,还包括数据链路层报头和报尾。