一 PPTP概述
PPTP(Point to Point Tunneling Protocol),即點對點隧道協議。該協議是在PPP協議的基礎上開發的一種新的增強型安全協議,支持多協議虛擬專用網,可以通過密碼驗證協議,可擴展認證協議等方法增強安全性。遠程用戶可以通過ISP、直接連接Internet或者其他網絡安全地訪問企業網;
它能夠將PPP(點到點協議)幀封裝成IP數據包,以便能夠在基於IP的互聯網上進行傳輸。PPTP使用TCP是實現隧道的創建、維護與終止,並使用GRE(通用路由封裝)將PPP幀封裝成隧道數據。被封裝后的PPP幀的有效載荷可以被加密或壓縮;
PPTP通信過程中需要建立兩種連接,一種是控制連接,另一種是數據連接。控制連接用來協商通信過程中的參數和進行數據連接的維護。而真正的數據通信部分則交由PPTP數據連接完成。以下兩個章節分別介紹PPTP的控制連接和數據連接
二 PPTP控制連接的建立流程分析
PPTP控制連接建立過程可以分為以下幾步:
1、 建立TCP連接
2、 PPTP控制連接和GRE隧道建立
3、 PPP協議的LCP協商
4、 PPP協議的身份驗證
5、 PPP協議的NCP協商
6、 PPP協議的CCP協商
以下以抓包的方式分析上述幾個步驟,
pptp client : 192.168.163.56
pptp server : 192.168.162.196
2.1 建立TCP連接
PPTP控制層協議是建立在TCP協議的基礎上,所以剛開始即使普通的TCP三次握手
圖2-1 TCP三次握數據包

圖2-2 TCP三次握手時序圖
1、 Client端向Server的1723端口發TCPSYN包,請求建立TCP連接。
2、 Server接收TCP連接請求,回SYN ACK。
3、 Client端向Server發送確認包ACK
2.2 PPTP控制連接和隧道的建立
在此過程,完成PPTP控制層連接和Gre隧道建立的工作
圖2-3 PPTP控制層連接建立過程
圖2-4 PPTP控制層連接時序圖
1、 Client向Server發送Start-Control-Connection-Request,請求建立控制連接
2、 Server向Client發送Start-Control-Connecton-Reply,應答客戶端的請求
3、 Client向Server發送Outgoing-Call-Request,請求建立PPTP隧道,該消息包含GRE報頭中的Callid,該id可唯一地標識一條隧道
4、 Server向Client發送Outgoing-Call-Reply,應答客戶端的建立PPTP隧道請求
5、 有Client或者Server任意一方發出Set-Link-info,設置PPP協商的選項2.3 PPP協議的LCP協商
LCP是PPP協議的鏈路控制協議,負責建立、拆除和監控數據鏈路。協商鏈路參數,如認證方法,壓縮方法,是否回叫等。

圖2-5 PPP協議的LCP協商過程

圖2-6 PPP協議的LCP協商時序圖
1、 Client發送一個Configuration Request,把自己的配置參數發送給Server
2、 Server發送一個Configuration Request,把自己的配置參數發送給Client
3、 Server發送一個Configuration Reject,將自己不能識別的參數告知Client,讓Client進行修正
4、 Client發送一個Configuration Ack,表示所有配置參數全部認識且可以接受,應答Server
5、 Client修改配置項后再次發送Configuration Request
6、 Server發送一個Configuration Ack,標示所有配置參數全部認識且可以接受,應答Client
2.4 PPP協議的身份認證
LCP協商完成后,PPP協議的Server端會對Client端進行身份驗證,在LCP協商中已經協商好身份驗證協議,本文以MS-CHAP-2為例說明

圖2-7 PPP協議的Chap身份認證過程

圖2-8 PPP協議的Chap身份認證時序圖
1、 Server向Client發送Challenge,其中包括一個Challenge string(value字段)和Server Name(pptpd)
2、 Client向Server發送Response,其中用戶名使用明文發送,密碼(syberos)和Challenge字段混合hash后以密文(value字段)形式發送
3、 Server讀取密碼文件,對用戶身份進行驗證,驗證成功,向Client發送Success,表示身份驗證成功
2.5 PPP協議的NCP協商
NCP協議是PPP協議的網絡控制協議,主要用來協商雙方網絡層接口參數,配置虛擬端口,分配IP,DNS等信息。圖中的IPCP是NCP基於TCP/IP的接口協商協議。Server和Client都要把自己的Miniport信息發送給對方

圖2-9 PPP協議的NCP協商過程

圖2-10 PPP協議的NCP協商時序圖
1、 Server把自己的Miniport信息通過Configuration Request發送給Client
2、 Client接收Server的接口配置,向Server發送Configuration ACK,應答上一步驟的Request
3、 Client把自己的Miniport信息(無效數據,等待Server分配)通過Configuration Request發送給Server
4、 Server發現Client的配置是無效的,則給Client發送一條有效的配置信息,使用Configuration Nak發送,其中主要是給Client分配ip
5、 Client根據Server端發送過來的配置,修改自己的Miniport的接口,再次發送Configuration Request
6、 Server接受Client的配置,發送Configuration Ack應答Request
2.6 PPP協議的CCP協商
CCP協議協商PPP通訊中數據加密的協議
圖2-11 PPP協議的NCP協商過程
圖2-12 PPP協議的NCP協商時序圖
1、 Server向Client發送Configuration Request,標識服務端支持的加密協議
2、 Client向Server發送Configuration Request,標識客戶端支持的加密協議
3、 Client向Server發送Configuration ack,標識接受服務端的加密協議
4、 Server向Client發送Configuration ack,標識接受客戶端的加密協議
三 PPTP數據連接的分析

圖3-1 PPTP數據包格式
我們以應用層使用HTTP連接為例說明PPTP數據包的封裝和解析過程;
3.1 PPTP數據包封裝過程

圖3-2 PPTP數據包封裝過程
封裝過程:
1、 應用層數據封裝成IP數據包
2、 將IP數據包發送到VPN的虛擬接口
3、 VPN的虛擬接口將IP數據包壓縮和加密,並增加PPP頭
4、 VPN的虛擬接口將PPP幀發送給PPTP協議驅動程序
5、 PPTP協議驅動程序在PPP幀外添加GRE報頭
6、 PPTP協議驅動程序將GRE報頭提交給TCP/IP協議驅動程序
7、 TCP/IP協議驅動程序為GRE驅動添加IP頭部
8、 為IP數據包進行數據鏈路層封裝后通過物理網卡發送出去3.2 PPTP數據包解析過程

圖3-2 PPTP數據包解析過程
解析過程:
1、物理thernet幀
2、剝掉Ethernet幀后交給TCP/IP協議驅動程序
3、TCP/IP協議解析剝掉IP頭部
4、IP協議解析剝掉GRE頭部
5、將PPP幀發送給VPN虛擬網卡
6、VPN虛擬網卡剝掉PPP頭並對PPP有效負載進行解密或者解壓縮
7、解密或者解壓縮完成后將數據提交給上層應用
8、上層應用對數據進行處理
從應用層看,Service和Client是直接點對點連接的,他們之間的媒介就是GRE。而這個GRE的底層並不是真正的點對點連接,
而是建立在物理網絡上的一個隧道,保護傳輸的數據;