vpn协议之pptp
2013-12-07 22:16:11 阿炯

点对点隧道协议(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软件套件。

参考链接
http://blog.chinaunix.net/uid/20424888.html
http://wiki.het.net/wiki/PPTP_server