点对点隧道协议

点对点隧道协议（英语：Point-to-Point Tunneling Protocol，缩写为 PPTP）是实现虚拟专用网（VPN）的一种方式。PPTP 使用传输控制协议（TCP）建立控制通道以发送控制命令，并利用通用路由封装（GRE）通道封装点对点协议（PPP）数据包以发送数据。该协议最早由微软等厂商主导开发，但由于其加密方式容易被破解，微软现已不建议使用此协议。

PPTP 的协议规范本身并未描述加密或身份验证部分，而是依靠点对点协议（PPP）来实现安全功能。由于 PPTP 协议内置于微软 Windows 系列产品中，因此微软的点对点协议（PPP）协议栈提供了多种标准的身份验证与加密机制以支持 PPTP。例如，在微软视窗系统中，PPTP 可以搭配 PAP、CHAP、MS-CHAP v1/v2 或 EAP 进行身份验证，通常也可以与Microsoft Point-to-Point Encryption 或 IPSec 的加密机制结合使用以增强安全性。

在Windows 或 macOS平台之外，Linux 与 FreeBSD等平台也提供开源版本。

## 规格

PPTP不是IETF建议的标准，是由微软、阿森德通信公司（现在属于 Alcatel-Lucent 集团）、3Com 等厂商联合形成的产业联盟开发。1999年7月发布的 RFC 2637 是第一个正式的PPTP规格书。

PPTP以通用路由封装（GRE）协议向对方作一般的点对点传输。通过 TCP 1723 端口来发起和管理 GRE 状态。因为 PPTP 需要 2 个网络状态，因此会对穿越防火墙造成困难。很多防火墙不能完整地传递链接，导致无法连接。

在 Windows 或 macOS 平台，通常PPTP可搭配 MSCHAP-v2 或 EAP-TLS 进行身份验证，也可配合 微软点对点加密进行连接时的加密。

与 PPTP 相似的另一种常见的 VPN 协议是第二层隧道协议（L2TP）。

## 应用

PPTP因为易于设定和是首个支援微软拨号连线的协议而流行。自Microsoft Windows 95 OSR2开始包含PPTP用户端，但是被限制只可同时存2个向外连线。Windows XP的远程桌面连接包含PPTP。

过往因MPPE是软件专利，所以Linux曾缺乏完整的PPTP支援。但是，自从在2005年10月28日发布的Linux 2.6.14起，Linux核心提供完整的PPTP支援（包含对免费版本的MPPE支持）。

## 实作

PPTP 是第一个被 Microsoft 拨号网络支援的 VPN 通讯协定。自 Windows 95 OSR2 起，所有的 Microsoft Windows 版本都内建了 PPTP 用户端软件（虽然只能支援最多两个同时对外的连线）。

在 Mobile 版本上，Microsoft Windows Mobile 2003 与更新的版本也支援 PPTP。Windows 的路由及远端存取套件有包含 PPTP 服务器。

Microsoft 的实作在 MS-CHAP 认证协定内使用了单次 DES 加密，但单次 DES 常被认为无法提供资料足够等级的安全防护。2

Windows Vista 与更新版本的 PPTP 开始支援 PEAP。认证机制有 PEAPv0 / EAP-MSCHAPv2 (使用密码) 还有 PEAP-TLS (智能卡与凭证)。

Windows Vista 同时停止了 MSCHAP-v1 的认证协定。3

Linux 的 PPTP 服务器一般是使用 PoPToP4 套件加上 PPP 与 MPPE 的 Kernel Module。PPTP的用户端程式从 19975 就开始提供了，但服务器部分要等到 Matthew Ramsay 在 19996开发的版本从 Moreton Bay 以 GNU GPL 发行后才真正开始有人大量使用。但是，Linux发行版本一开始通常都不包含 MPPE 的部分（因为担心有专利问题）所以不完整，直到 2005/10/28 发布的 Linux Kernel 2.6.14 才正式支援 MPPE。

SuSE Linux 10 是第一个有完整可用的 PPTP 用户端程式的版本。另外还有 ACCEL-PPP 套件: 它提供了 PPTP / L2TP / PPPoE 服务器7，可提供 kernel 模式的 PPTP 协定。

OpenBSD 跟 FreeBSD 在 "ports" 套件系统里提供 PoPToP。

macOS 与 iOS 曾提供内建 PPTP 用户端程式，但在 2016 年发表的 iOS 10 和 macOS Sierra 中，PPTP 支援被移除。OS X Server 内建了 PPTP 服务。Cisco 与 Efficient Networks 有另外贩卖给旧版 Mac OS 使用的 PPTP 用户端程式。

许多 Android 智能手机也支援 PPTP，不过官方版本的 Android 12 已移除了PPTP功能。

## 安全性

因已经发现了PPTP严重的安全漏洞，所以该协议经常被使用作为安全分析的课题。已知的漏洞包括所使用的底层PPP认证协议、MPPE协议的设计以及MPPE和PPP认证之间在建立会话密钥方面的整合。

以下是这些漏洞的摘要：

- MS-CHAP-v1是不安全的，因为已有工具可以从捕获到的MSCHAP-v1交换包中轻易地提取出NT密码的哈希值。
- 当使用MS-CHAP-v1时，MPPE在通信流的两个方向上使用相同的RC4会话密钥进行加密。这可以通过将每个方向的数据流一起进行异或运算，用标准方法进行密文分析。
- MS-CHAP-v2对捕获的挑战响应（challenge response）数据包容易受到字典攻击。目前已有工具可以快速执行这一过程。
- 2012年，有研究表明，对MS-CHAP-v2密钥进行暴力攻击的复杂性相当于对单个DES密钥进行暴力攻击。还演示了一项在线服务，它能够在23小时内解密MS-CHAP-v2 MD4口令。
- MPPE使用RC4流密码进行加密。没有对密文流进行认证的方法，因此密文很容易受到比特翻转攻击。攻击者可以在传输过程中修改流并调整单比特来改变输出流而不被检测到。这些位翻转可能会被协议本身通过校验和或其他方式检测到。

EAP-TLS被认为是PPTP的高级认证选择；然而，它需要为用户和服务器证书实现公钥基础设施。因此，对于一些远程访问的设备来说，它可能不是一个可行的认证选择。大多数使用PPTP的网络必须应用额外的安全措施，否则会被认为完全不适合现代互联网环境。同时，这样做意味着在某种程度上否定了该协议的上述好处。因此，不管从哪方面考虑，使用PPTP都是一种双输的局面。

## 其他 VPN 协议

- L2F Layer 2 Forwarding Protocol
- L2TP Layer 2 Tunneling Protocol
- PLIP 并行线路互联网协议
- IPsec
- SLIP Serial Line Internet Protocol
- PPP Point-to-Point Protocol

## 外部链接

- On PPTP security
- Windows NT: Understanding PPTP from Microsoft
- FAQ on security flaws in Microsoft's implementation，Bruce Schneier，1998
- Cryptanalysis of Microsoft's PPTP Authentication Extensions (MS-CHAPv2), Bruce Schneier，1999
- Poptop，a PPTP Server for Linux
- PPTP Client，a Linux，FreeBSD，NetBSD and OpenBSD client
- pptpproxy，a Linux，FreeBSD，NetBSD and OpenBSD pptp protocol forwarder (proxy)
- ASLEAP，a PPTP password cracker and traffic sniffer
- PPTP Protocol Security by James Cameron and Peter Mueller
- Setting up EAP-TLS security for PPTP