点对点隧道协议(PPTP)是广泛使用的虚拟专用网络协议。 PPTP 是用于在中间网络上传输点对点协议(PPP)帧的一种隧道机制。 通过利用 PPP 的身份验证、加密和协议配置机制,PPTP 连接同时为远程访问和路由器到路由器的虚拟专用网(VPN)连接提供了一条在公共网络(比如:Internet)上创建安全连接的途径。有关 PPTP 的详细描述见 RFC 2367。
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 服务器发送数据时在 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中有所定义。
修改过的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 都能够转换基于 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 连接时,将会交换如下数据包: PPTP 客户端发送一条 PPTP Set-Link-Info 消息来指定链路的 PPP 参数。 PPTP 客户端发送一条 Link Control Protocol (LCP) Terminate-Request 消息来终止 PPP 连接。 LCP 是 PPP 协议族中的一种协议,它管理逻辑 PPP 连接的配置和维护。 PPTP 服务器发送一条 PPTP Set-Link-Info 消息来指定链路的 PPP 参数。 PPTP 服务器发送 LCP Terminate-Ack 消息来响应 LCP Terminate-Request 消息,从而终止 PPP 连接。 PPTP 客户端发送一条 PPTP Clear-Call-Request 消息,向 PPTP 服务器表示 PPTP 控制连接即将终止。 PPTP 服务器使用一条 PPTP Call-Disconnected-Notify 消息进行响应。 PPTP 客户端发送一条 PPTP Stop-Control-Connection-Request 消息来终止 PPTP 控制连接。 PPTP 服务器使用一条 PPTP Stop-Control-Connection-Reply 消息进行响应。 TCP 连接终止。
如果PPTP服务器要终止连接,所交换的消息是相同的,只要将上述过程中的 PPTP 客户端替换成了 PPTP 服务器即可(反之亦然)。 PPTP流量概述
PPTP流量由以下几方面组成:
这是一个逻辑连接,表示必须通过一系列 PPTP 消息创建、维持和终止的 PPTP 隧道。 PPTP 控制连接流量使用 PPTP 客户端上动态分配的 TCP 端口,以及 PPTP 服务器上由 IANA 保留的TCP端口 1723。
当数据通过PPTP连接发送时,PPP帧将使用通用路由封装(Generic Routing Encapsulation, GRE )报头进行封装,报头包含用于识别该数据包的特定 PPTP 隧道的信息。
PPTP 流量的防火墙配置
在最常见的配置中,防火墙连接到 Internet,同时 VPN 服务器(一台 PPTP 服务器)作为企业内联网(intranet)资源同周边网络相连接。这种配置如下图所示:
VPN 服务器在周边网络和企业内联网上都有一个接口。在此配置中,必须在所属的 Internet 和周边网络接口上通过输入和输出筛选器配置防火墙,从而允许 PPTP 隧道维持流量和通过 PPTP 隧道的数据传输到 VPN 服务器上。
Internet 接口上的筛选器
在防火墙的 Internet 接口上配置以下输入包筛选器,以允许传入下列各类流量:
- VPN 服务器的周边网络接口的目标 IP 地址和 TCP 目标端口1723(0x6BB)
该筛选器允许 PPTP 隧道维持传入 PPTP 服务器的流量。
- VPN 服务器的周边网络接口的目标 IP 地址和 IP 协议ID 47(0x2F)
该筛选器允许数据通过 PPTP 隧道传到 PPTP 服务器上。
- VPN 服务器的周边网络接口的目标 IP 地址和 TCP 源端口1723(0x6BB)
该筛选器仅在 VPN 服务器充当路由器到路由器的 VPN 连接的调用路由器(一个VPN客户端)时才是必需的。 这个筛选器应该仅和 VPN 服务器的周边网络接口上推荐的 IP 数据包筛选器结合使用。 VPN 服务器周边网络接口上推荐的包筛选器包括那些允许(VPN 服务器发起的 TCP 连接的)来自端口 1723 的入站 TCP 流量和到 TCP 端口 1723 的出站流量的筛选器。
在防火墙的 Internet 接口上配置以下输出筛选器,以允许传入下列各类流量:
- VPN 服务器的周边网络接口的源IP地址和TCP源端口1723(0x6BB)
该筛选器允许 PPTP 隧道维持来自 PPTP 服务器的流量。
- VPN服务器的周边网络接口的源IP地址和TCP目标端口1723(0x6BB)
该筛选器仅在 VPN 服务器在路由器到路由器的VPN连接中充当调用路由器(一个 VPN 客户端)时才是必需的。 这个筛选器应该仅和 VPN 服务器的周边网络接口上推荐的 IP 包筛选器结合使用。
周边网络接口上的筛选器
在防火墙的周边网络接口上配置以下输入筛选器,以允许传入下列各类流量:
- VPN 服务器的周边网络接口的源IP地址和 TCP 源端口 1723(0x6BB)
该筛选器允许PPTP隧道维持来自PPTP服务器的流量。
- VPN服务器的周边网络接口的源IP地址和IP协议ID 47(0x2F)
该筛选器允许来自VPN服务器的数据通过PPTP隧道。
- VPN服务器的周边网络接口的源IP地址和 TCP 目标端口1723(0x6BB)
该筛选器仅在 VPN 服务器在路由器到路由器的VPN连接中充当调用路由器(一个VPN客户端)时才是必需的。 这个筛选器应该仅和 VPN 服务器的周边网络接口上推荐的IP包筛选器结合使用。
在防火墙的周边网络接口上配置以下输出数据包筛选器,以允许传入下列各类流量:
- VPN 服务器的周边网络接口的目标 IP 地址和 TCP 目标端口 1723(0x6BB)
该筛选器允许 PPTP 隧道维持到 PPTP 服务器的流量。
- VPN 服务器的周边网络接口的目标 IP 地址和IP协议ID 47(0x2F)
该筛选器允许数据通过 PPTP 隧道传到 PPTP 服务器。
- VPN服务器的周边网络接口的目标 IP 地址和 TCP 源端口 1723(0x6BB)
该筛选器仅在 VPN 服务器在路由器到路由器的 VPN 连接中充当调用路由器(一个 VPN 客户端)时才是必需的。 该筛选器应该仅和 VPN 服务器的周边网络接口上推荐的IP包筛选器结合使用。
|