内容纲要

点对点隧道协议 (PPTP: Point to Point Tunneling Protocol) 是一种支持多协议虚拟专用网络 (VPN) 的网络技术。通过该协议,远程用户能够通过 Windows NT、9x 操作系统以及其它装有点对点协议的系统安全访问公司网络,并能拨号连入本地 ISP,通过 Internet 安全链接到公司网络。

PPTP stands for “Point-to-Point Tunneling Protocol”. It’s a protocol developed by a vendor consortium (including Cisco and Microsoft) for client-server virtual private networks. It’s described in RFC2637[1] which is informational and isn’t accepted as an Internet standard (L2TP is recommended instead). Nevertheless it’s still widely used, especially for Microsoft Windows clients (and Windows has a built-in client for it).

PPTP uses two different connection for its operation. The first is TCP/1723 connection for session control. The second is GRE tunnel for data transmission which encapsulates PPP.

PPTP supports various authentication algorithms (PAP, CHAP, MS-CHAP, MS-CHAP-v2) and MPPE encryption algorithm for data security.

PPTP 可以用于在 IP 网络上建立 PPP 会话隧道。在这种配置下,PPTP 隧道和 PPP 会话运行在两个相同的机器上,呼叫方充当 PNS。PPTP 使用客户机-服务器结构来分离当前网络访问服务器具备的一些功能并支持虚拟专用网络。PPTP 作为一个呼叫控制和管理协议,它允许服务器控制来自 PSTN 或 ISDN 的拨入电路交换呼叫访问并初始化外部电路交换连接。

PPTP 只能通过 PAC 和 PNS 来实施,其它系统没有必要知道 PPTP。拨号网络可与 PAC 相连接而无需知道 PPTP。标准的 PPP 客户机软件可继续在隧道 PPP 链接上操作。

PPTP 使用 GRE 的扩展版本来传输用户 PPP 包。这些增强允许为在 PAC 和 PNS 之间传输用户数据的隧道提供低层拥塞控制和流控制。这种机制允许高效使用隧道可用带宽并且避免了不必要的重发和缓冲区溢出。PPTP 没有规定特定的算法用于低层控制,但它确实定义了一些通信参数来支持这样的算法工作。

Length ― 该 PPTP 信息的八位总长,包括整个 PPTP 头。

PPTP Message Type ― 信息类型。可能值有:1、控制信息;2、管理信息。

Magic Cookie ― Magic Cookie 以连续的 0x1A2B3C4D 进行发送,其基本目的是确保接收端与 TCP 数据流间的正确同步运行。

Control Message Type ― 可能值有:1、开始-控制-链接-请求 (Start-Control-Connection-Request);2、开始-控制-链接-答复 (Start-Control-Connection-Reply);3、停止-控制-链接-请求 (Stop-Control-Connection-Request);4、停止-控制-链接-答复 (Stop-Control-Connection-Reply);5、回音-请求 (Echo-Request);6、回音-答复 (Echo-Reply);

Call Management――可能值有:1、导出-呼叫-请求 (Outgoing-Call-Request);2、导出-呼叫-答复 (Outgoing-Call-Reply);3、导入-呼叫-请求 (Incoming-Call-Request);4、导入-呼叫-答复 (Incoming-Call-Reply);5、导入-呼叫-链接 (Incoming-Call-Connected);6、呼叫-清除-请求 (Call-Clear-Request);7、呼叫-断开链接-通告 (Call-Disconnect-Notify);8、广域网-错误-通告 (WAN-Error-Notify)。

PPP Session Control ― 设置-链路-信息 (Set-Link-Info)。

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 ― 该 PAC 可以支持的个人 PPP 会话总数。

Firmware Revision ― 若由 PAC 出发,则包括发出 PAC 时的固件修订本编号;若由 PNS 出发,则包括 PNS PPTP 驱动版本。

Host Name ― 包括发行的 PAC 或 PNS 的 DNS 名称。

Vendor Name ― 包括特定供应商字串,指当请求是由 PNS 提出时,使用的 PAC 类型或 PNS 软件类型。

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 中有所定义。

修改过的 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 连接时,将会交换如下数据包:
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 服务器即可 (反之亦然)。

可以选择 “Poptop-The PPTP Server for Linux” 作为 Linux 下的 VPN 服务器的软件实现。Poptop 是一个开放源代码项目,基于 PPTP 点对点隧道协议开发,支持 Windows9x/NT 及 Linux 的 PPTP 客户端。Poptop 与微软的加密和认证协议 (MSCHAPv2,MPPE40-128bitRC4 加密) 完全兼容,如果使用 RADIUS 插件还可以与微软网络环境 (LDAP、SAMBA) 进行无缝整合。

pptpd 是 Poptop 中最重要的程序, 它是 Poptop 的 PPTP 守护进程,用来管理所有的基于 PPTP 隧道协议的 VPN 连接。当 pptpd 接收到用户的 VPN 接入请求后会自动调用 pppd 程序去完成相应的认证过程,然后建立 VPN 连接。所以,要使 Poptop 正常工作必须安装 PPP 软件套件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注