点对点隧道协议(PPTP)是广泛使用的虚拟专用网络协议,Windows 98、Windows Millennium Edition、Windows 2000和Windows XP中都包含有该协议。 PPTP是用于在中间网络上传输点对点协议(PPP)帧的一种隧道机制。 通过利用PPP的身份验证、加密和协议配置机制,PPTP连接同时为远程访问和路由器到路由器的虚拟专用网(×××)连接提供了一条在公共网络(比如:Internet)上创建安全连接的途径。有关PPTP的详细描述见RFC 2367。

PPTP流量概述
PPTP流量由以下几方面组成:

• PPTP控制连接

这是一个逻辑连接,表示必须通过一系列PPTP消息创建、维持和终止的PPTP隧道。 PPTP控制连接流量使用PPTP客户端上动态分配的TCP端口,以及PPTP服务器上由IANA保留的TCP端口1723。

• 数据的GRE封装

当数据通过PPTP连接发送时,PPP帧将使用通用路由封装(Generic Routing Encapsulation,GRE)报头进行封装,报头包含用于识别该数据包的特定PPTP隧道的信息。


PPTP流量的防火墙配置
在最常见的配置中,防火墙连接到Internet,同时×××服务器(一台PPTP服务器)作为企业内联网(intranet)资源同周边网络相连接。这种配置如下图所示。
做人要厚道,转贴请注明出自bbs.winos.cn
cg010301_BIG.gif (13.94 KB)
下载次数:3
2006-5-23 20:42
cg010301_BIG.gif
 
×××服务器在周边网络和企业内联网上都有一个接口。在此配置中,必须在所属的Internet和周边网络接口上通过输入和输出筛选器配置防火墙,从而允许PPTP隧道维持流量和通过PPTP隧道的数据传输到×××服务器上。

Internet接口上的筛选器
在防火墙的Internet接口上配置以下输入包筛选器,以允许传入下列各类流量:

• ×××服务器的周边网络接口的目标IP地址和TCP目标端口1723(0x6BB)。

该筛选器允许PPTP隧道维持传入PPTP服务器的流量。

• ×××服务器的周边网络接口的目标IP地址和IP协议ID 47(0x2F)。

该筛选器允许数据通过PPTP隧道传到PPTP服务器上。

• ×××服务器的周边网络接口的目标IP地址和TCP源端口1723(0x6BB)。

该筛选器仅在×××服务器充当路由器到路由器的×××连接的调用路由器(一个×××客户端)时才是必需的。 这个筛选器应该仅和×××服务器的周边网络接口上推荐的IP数据包筛选器结合使用。 ×××服务器周边网络接口上推荐的包筛选器包括那些允许(×××服务器发起的TCP连接的)来自端口1723的入站TCP流量和到TCP端口1723的出站流量的筛选器。 有关×××服务器的周边网络接口上推荐的筛选器的更多信息,请参见×××和防火墙。


在防火墙的Internet接口上配置以下输出筛选器,以允许传入下列各类流量:

• ×××服务器的周边网络接口的源IP地址和TCP源端口1723(0x6BB)。

该筛选器允许PPTP隧道维持来自PPTP服务器的流量。

• ×××服务器的周边网络接口的源IP地址和IP协议ID 47(0x2F)。

该筛选器允许来自×××服务器的数据通过PPTP隧道。

• ×××服务器的周边网络接口的源IP地址和TCP目标端口1723(0x6BB)。

该筛选器仅在×××服务器在路由器到路由器的×××连接中充当调用路由器(一个×××客户端)时才是必需的。 这个筛选器应该仅和×××服务器的周边网络接口上推荐的IP包筛选器结合使用。


周边网络接口上的筛选器
在防火墙的周边网络接口上配置以下输入筛选器,以允许传入下列各类流量:

• ×××服务器的周边网络接口的源IP地址和TCP源端口1723(0x6BB)。

该筛选器允许PPTP隧道维持来自PPTP服务器的流量。

• ×××服务器的周边网络接口的源IP地址和IP协议ID 47(0x2F)。

该筛选器允许来自×××服务器的数据通过PPTP隧道。

• ×××服务器的周边网络接口的源IP地址和TCP目标端口1723(0x6BB)。

该筛选器仅在×××服务器在路由器到路由器的×××连接中充当调用路由器(一个×××客户端)时才是必需的。 这个筛选器应该仅和×××服务器的周边网络接口上推荐的IP包筛选器结合使用。


在防火墙的周边网络接口上配置以下输出数据包筛选器,以允许传入下列各类流量:

• ×××服务器的周边网络接口的目标IP地址和TCP目标端口1723(0x6BB)。

该筛选器允许PPTP隧道维持到PPTP服务器的流量。

• ×××服务器的周边网络接口的目标IP地址和IP协议ID 47(0x2F)。

该筛选器允许数据通过PPTP隧道传到PPTP服务器。

• ×××服务器的周边网络接口的目标IP地址和TCP源端口1723(0x6BB)。

该筛选器仅在×××服务器在路由器到路由器的×××连接中充当调用路由器(一个×××客户端)时才是必需的。 该筛选器应该仅和×××服务器的周边网络接口上推荐的IP包筛选器结合使用。
 
 
=============================================================
 
PPTP控制连接创建
PPTP控制连接通过以下步骤建立:

1.
TCP连接由PPTP客户机上的一个动态分配的TCP端口到PPTP服务器上的TCP端口1723建立。

2.
PPTP客户端发送一条PPTP Start-Control-Connection-Request(开始控制连接请求)消息,后者将用于建立一个PPTP控制连接。

3.
PPTP服务器使用一条PPTP Start-Control-Connection-Reply(开始控制连接应答)消息予以响应。

4.
PPTP客户端发送一条PPTP Outgoing-Call-Request(传出调用请求)消息,并选择一个调用ID,识别用于将数据从PPTP客户端发送到PPTP服务器的PPTP隧道。PPTP客户端使用PPTP Outgoing-Call-Request消息从PPTP服务器请求一个PPTP隧道(也称为调用)。

5.
PPTP服务器发送一条PPTP Outgoing-Call-Reply(传出调用应答)消息,并选择自身的调用ID,识别将数据从PPTP服务器发送到PPTP客户端的PPTP隧道。

6.
PPTP客户端发送一条PPTP Set-Link-Info(设置链路信息)消息来指定PPTP协商选项。


PPTP控制连接创建过程的最终结果如下:

• PPTP服务器已允许创建一个PPTP隧道。

• PPTP客户端已确定了在通过PPTP隧道向PPTP服务器发送数据时在GRE报头中使用的调用ID。

• PPTP服务器已确定了在通过PPTP隧道向PPTP客户端发送数据时在GRE报头中使用的调用ID
 
=================================================================
 
PPTP数据封装
在建立PPTP控制连接之后,数据就可以在PPTP客户端和PPTP服务器之间发送了。 通过PPTP连接发送的第一个数据包将用于建立PPP连接。

数据包首先被加密并使用一个PPP报头进行封装。 所得到PPP帧将使用一个通用路由封装(GRE)报头进行封装,该报头已针对PPTP修改过。 然后,GRE封装的PPP帧使用一个IP报头进行封装,这个报头包含对应于PPTP隧道端点的源和目标IP地址。

经过修改应用于PPTP数据包的GRE报头具有如下图所示的结构。 最初的GRE报头在RFC 1701中有所定义。
cg010302.gif (25.65 KB)
下载次数:3
2006-5-23 20:43
cg010302.gif
 
=================================================================
 
修改过的GRE报头中的字段如下:

• Checksum Present 一个1位标志,当设置为1时,表示提供了一个Checksum字段。对于PPTP,该标志总被设为0。

• Routing Present 一个1位标志,当设置为1时,表示提供了一个Routing字段。对于PPTP,该标志总被设为0。

• Key Present 一个1位标志,当设置为1时,表示提供了一个Key字段。对于PPTP,该标志总被设为1。Key字段是Protocol Type、Payload Length和Call ID字段的组合。

• Sequence Number Present 一个1位标志,当设置为1时,表示提供了Sequence Number字段。

• Strict Source Route Present 一个1位标志,当设置为1时,表示提供了一个“严格源路由”。对于PPTP,该标志总被设置为0。

• Recursion Control 一个用于递归的3位标志。对于PPTP,该字段总被设为0。

• Acknowledgement Number Present 一个1位标志,当设置为1时,表示提供了Acknowledgement Number字段。

• Flags 一个用于GRE标志的4位字段。对于PPTP,该字段总被设为0。

• Version 一个用于表示GRE报头版本的3位字段。对于PPTP,该字段总被设为1。

• Protocol Type 一个用于存储GRE有效负载(payload)的EtherType值的16位字段。对于PPTP,该字段总被设为0x880B,即PPP帧的EtherType值。

• Payload Length 一个用于表示GRE有效负载长度的16位字段。

• Call ID 一个用于表示这个包的PPTP隧道的16位字段。对于PPTP连接,Call ID字段有两个不同的值。 一个值用于PPTP客户端发送的数据,另一个值用于PPTP服务器发送的数据。

• Sequence Number 一个用于表示这个数据包的序列号的32位字段。该字段仅在Sequence Number Present标志被设置为1时才提供。

• Acknowledgement Number 一个32位字段,用于表示这个隧道接收的某个GRE封装的数据包的最高序列号。 这个字段仅在Acknowledgement Number Present标志被设置为1时才提供。


PPTP使用Sequence Number和Acknowledgement Number字段检测被丢弃的数据包。

对PPTP数据封装使用一种单独的机制给网络地址转换(NAT)带来了一个有趣的副作用。 关于NAT的更多信息,请参见“Windows 2000 网络地址转换器(NAT)”(Cable Guy于2001年3月发表的文章)。 大多数NAT都能够转换基于TCP的流量来维持隧道。然而,具有GRE报头的PPTP数据包通常不是使用静态地址映射或PPTP NAT编辑器来转换的。

当PPTP服务器位于NAT后方时,必须手动地将该NAT配置为使用静态地址映射,即把某个特定的公共地址的所有流量映射到某个特定的专用地址。 在这种情况下,只有IP报头中的地址才会被修改。

当PPTP客户端位于NAT后方时,通常会使用一个PPTP NAT编辑器。 NAT编辑器是NAT上的一个附加软件组件,用于执行除IP地址、TCP端口和UDP端口之外的转换服务。 虽然使用PPTP NAT编辑器来监视GRE有效载载的传入数据包并转换IP报头中的IP地址是一件简单的事情,但是在NAT后方可能会有多个PPTP客户端。 在这种情况下,该NAT无法确定应该将传入的PPTP包发送给哪个专用客户端,因为多个专用客户端使用了相同的公共地址。为了确定应该向其发送传入数据包的专用客户端,PPTP NAT编辑器在GRE报头中使用了一个调用(Call)ID。 然而,当两个不同的PPTP客户端使用相同的调用 ID时,NAT就无法确定应该将包发送给哪个专用客户端。

为了给不同的专用客户端提供GRE封装的流量的正确多路复用,PPTP NAT编辑器监控PPTP控制连接设置,并以转换TCP或UDP源端口的相同方式,同时转换PPTP消息和GRE封装的数据包中的PPTP客户端调用 ID字段。通过转换PPTP客户端调用 ID字段,NAT确保了对每个PPTP隧道和每个PPTP客户端使用一个唯一的调用 ID。
 
=================================================================
 
PPTP控制连接维持
为了维持PPTP控制连接,PPTP客户端每隔60秒发送一条PPTP Echo Request(回送请求)消息,不管PPTP客户端和服务器之间是否正在发送GRE封装的数据。在接收到PPTP Echo Request消息时,PPTP服务器将发送一条PPTP Echo Reply(回送应答)消息。PPTP Echo Request消息包含一个Identifier字段,该字段的值将在PPTP Echo Reply消息中回显,以便PPTP客户端能够将PPTP Echo Request与其应答相匹配。
 
 
==================================================================
 
PPTP控制连接终止
为了终止PPTP连接,PPP连接、PPTP协议连接和TCP连接必须全部终止。 当PPTP客户端终止PPTP连接时,将会交换如下数据包:

1.
PPTP客户端发送一条PPTP Set-Link-Info消息来指定链路的PPP参数。

2.
PPTP客户端发送一条Link Control Protocol (LCP) Terminate-Request消息来终止PPP连接。 LCP是PPP协议族中的一种协议,它管理逻辑PPP连接的配置和维护。

3.
PPTP服务器发送一条PPTP Set-Link-Info消息来指定链路的PPP参数。

4.
PPTP服务器发送LCP Terminate-Ack消息来响应LCP Terminate-Request消息,从而终止PPP连接。

5.
PPTP客户端发送一条PPTP Clear-Call-Request消息,向PPTP服务器表示PPTP控制连接即将终止。

6.
PPTP服务器使用一条PPTP Call-Disconnected-Notify消息进行响应。

7.
PPTP客户端发送一条PPTP Stop-Control-Connection-Request消息来终止PPTP控制连接。

8.
PPTP服务器使用一条PPTP Stop-Control-Connection-Reply消息进行响应。

9.
TCP连接终止。


如果PPTP服务器要终止连接,所交换的消息是相同的,只要将上述过程中的PPTP客户端替换成了PPTP服务器即可(反之亦然)。
 
================================================================