首先,先來了解下什麼是 PPTP。PPTP将PPP(Point-to-Point Protocol)幀封裝進IP資料報中,通過IP網絡如Internet或其他企業專用Intranet等發送。PPTP通過PPTP控制連接配接來建立、維護、終止一條隧道,并使用通用路由封裝GRE(Generic Routing Encapsulation)對PPP幀進行封裝。封裝前,PPP幀的有效載荷即有效傳輸資料一般會經過加密、壓縮或是兩者的混合處理。PPTP協定假定在PPTP客戶機和PPTP伺服器之間有連通且可用的IP網絡。是以如果PPTP客戶機本身已經是某IP網絡的組成部分,那麼即可通過該IP網絡與PPTP伺服器取得連接配接.MPPE隻提供連接配接加密,而不提供端-端加密。端-端加密屬于應用層的加密技術,如果應用中要求實作端-端加密,則可在PPTP隧道建立之後,使用IPSec對兩端的IP資料流進行加密處理。基于Internet的PPTP伺服器即使用PPTP協定的VPN伺服器,它的一個接口在Internet上,另一個接口在Intranet上。
一、 PPTP連接配接過程與隧道維護
PPTP控制連接配接建立在PPTP客戶機IP位址和PPTP伺服器IP位址之間,PPTP客戶機使用動态配置設定的TCP端口号,而PPTP伺服器則使用保留TCP端口号1723。PPTP控制連接配接攜帶PPTP呼叫控制和管理資訊,用于維護PPTP隧道,其中包括周期性地發送回送請求和回送應答消息,以期檢測出客戶機與伺服器之間可能出現的連接配接中斷。PPTP控制連接配接資料包包括一個IP報頭,一個TCP報頭和PPTP控制資訊,資料包格式如下。所示的PPTP控制連接配接資料包還包括資料鍊路層報頭和報尾。
PPTP典型連接配接過程:
TCP連接配接由PPTP客戶機上的一個動态配置設定的TCP端口到PPTP伺服器上的TCP端口1723建立。
二、大緻分析下用戶端和服務端的封包
start-control-connection-request : 由PPTP用戶端發出,請求建立控制連接配接。PPTP隧道要求在發送任何其他PPTP消息之前,先建立一條控制連接配接。
start-control-connection-reply:由PPTP伺服器發出,回應start-controlconnection-request消息。
outgoing-call-request:由PPTP客戶機發出,請求建立PPTP隧道,outgoing-call-request消息包含GRE報頭中的Call ID,該ID可唯一地辨別一條隧道。
outgoing-call-reply:PPTP伺服器對outgoing-call-request消息的回應。
echo-request:作為保持連線機制,可由PPTP客戶機或伺服器任何一方發出,若echo-request了沒有應答,則PPTP隧道逐漸終止。
echo-reply:對echo-request的應答。注:PPTP的echo-request和echo-reply的消息與ICMP回送請求和回送應答消息無關。
WAN-Error-Notify:由PPTP伺服器向所有VPN客戶機發出,訓示伺服器的PPP接口處于錯誤狀态。
set-link-info:可由PPTP客戶機或伺服器任何一方發出,設定PPP協商選項。
call-clear-request:由PPTP客戶機發出,請求終止隧道。
call-disconnect-notify:PPTP伺服器回應call-clear-request,或因其他原因訓示必須終止隧道。如果PPTP伺服器終止隧道,則發送出call-disconnect-notify消息。
stop-control-connection-request:可由PPTP客戶機或伺服器任何一方發出,通知對方控制連接配接将被終止。
stop-control-connection-reply:回應stop-control-connection-request消息。
三、詳細分析資料包的内容
1. Start-control-connection-request
Length : 該 PPTP 資訊的八位總長,包括整個 PPTP 頭。
PPTP Message Type : 資訊類型。可能值有:1、控制資訊;2、管理資訊。
Magic Cookie : Magic Cookie 以連續的 0x1A2B3C4D 進行發送,其基本目的是確定接收端與 TCP資料流間的正确同步運作。
Control Message Type :值為1。
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 : 該 PPTP伺服器 可以支援的個人 PPP 會話總數。
Firmware Revision :若由 PPTP伺服器 出發,則包括發出 PPTP伺服器時的固件修訂本編号;
若由 PPTP用戶端出發,則包括 PPTP用戶端 PPTP 驅動版本。
Host Name : 包括發行的 PPTP伺服器 或 PPTP用戶端的 DNS 名稱。
Vendor Name : 包括特定供應商字串,指當請求是由 PPTP用戶端 提出時,使用的 PPTP伺服器 類型或PPTP用戶端軟體類型。
2. Start-Control-Connection-Reply
大部分字段的含義與Start-control-connection-request一緻。不同的字段含義如下:
Control Message Type :值為2;
Result Code:表示建立channal是否成功的結果碼,值為1表示成功,值為2表示通用錯誤,暗示着有問題。值為3表示channal已經存在,值為4表示請求者未授權,值為5表示請求的PPTP協定版本不支援。
Error Code:表示錯誤碼,一般值為0,除非Result Code值為2,不同的錯誤碼表示不同的含義。
3. Outgoing-call-request
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。不同的字段含義如下:
Control Message Type :值為7。
Call ID:由PPTP用戶端指定的唯一的會話ID。
Call Serial Number:是由PPTP用戶端指定的唯一辨別符,用于在記錄會話資訊中辨別特定會話,與Call ID不一樣的是,Call Serial Number PPTP用戶端與PPTP伺服器來說,唯一綁定到一個給定的會話,且是相同的。
Minimum BPS :對于此次會話可接受的最低傳輸速度,機關為位/秒;
Maximum BPS:對于此次會話可接受的最大傳輸速度,機關為位/秒;
Bearer Type: 指出承載通路支援,該資訊發送方可以提供:
1、模拟通路支援(Analog Access Supported);
2、數字通路支援(Digital access supported)。
3、可支援的任何類型。
Framing Type: 指出幀類型,該資訊發送方可以提供:
1、異步幀支援(Asynchronous Framing Supported);
2、同步幀支援(Synchronous Framing Supported)。
3、異步或同步幀支援。
Packet Recv. Window Size:PPTP用戶端為此次會話提供最大接收緩沖大小;
Packet Processing Delay:表示PPTP用戶端對資料包處理的延時度量,對于PPTP用戶端來說,一般設定比較小越好。
Phone number length: 拔号号碼長度;
Phone number:建立會話向外拔号的号碼,一般對于ISDN或模拟方式拔号來說,此字段域為一個ASCII串。
Sub address:額外資訊域,一般長度少于64個位元組。
4. Outgoing-Call-Reply
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。不同的字段含義如下:
Control Message Type :值為8。
Call ID:由PPTP伺服器指定的唯一的會話ID。主要用于在PPTP伺服器與PPTP用戶端建立的會話上,複用與解封裝隧道包使用的。
Peer’s Call ID:設定的值是從接收到的Outgoing-call-request中Call ID值,是由PPTP用戶端指定的,用于GRE中對于隧道資料解封與複用。
Result Code:表示響應Outgoing-call-request握手是否成功,
值為1表示成功;
值為2表示通用錯誤,暗示着有問題;
值為3表示無載波;
值為4表示伺服器忙,無法及時響應;
值為5表示無拔号音;
值為6表示呼号逾時;
值為7表示未授權。
Error Code:表示錯誤碼,一般值為0,除非Result Code值為2,不同的錯誤碼表示不同的含義。
Cause Code:表示進一步錯誤資訊描述;
Connect Speed:連接配接使用的實際速率;
Rev window size:PPTP伺服器為此次會話提供最大接收緩沖大小;
Packet Processing Delay:表示PPTP伺服器對資料包處理的延時度量。
Physical Channel ID:由PPTP伺服器指定的實體信道ID。
5. Set-Link-Info
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為15。
Peer’s Call ID:設定的值是從接收到的Outgoing-call-request中Call ID值,是由PPTP用戶端指定的,用于GRE中對于隧道資料解封與複用。
Reserved0/Reserve1:保留位,必須為0;
Send ACCM: 發送的ACCM值,預設值為0XFFFFFFFF;
Receive ACCM:接收的ACCM值,預設值為0XFFFFFFFF;
6. Echo request
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為5。
Peer’s Call ID:設定的值是從接收到的Outgoing-call-request中Call ID值,是由PPTP用戶端指定的,用于GRE中對于隧道資料解封與複用。
Reserved0:保留位,必須為0;
Identifier:發送者用來辨別Echo request與Echo reply對應辨別。
7. Echo-reply
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為6。
Peer’s Call ID:設定的值是從接收到的Outgoing-call-request中Call ID值,是由PPTP用戶端指定的,用于GRE中對于隧道資料解封與複用。
Reserved0/1:保留位,必須為0;
Identifier:辨別值,為接收者從Echo request裡辨別字段複制填入。
Result Code:結果碼,為1表示Echo-reply是有效的,為2表示出現一般性錯誤。
Error code:同上面所描述的。
8. Call-Clear-Request
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。不同的字段含義如下:
Control Message Type :值為12。
Call ID:由PPTP用戶端指定的會話ID。
Reserved0/1:保留位,必須為0;
9、Call-Disconnect-Notify
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為13;
Call ID:由PPTP用戶端指定的會話ID;
Reserved0/1:保留位,必須為0;
Result Code:結果碼,
為1表示媒介斷開,
為2表示出現一般性錯誤,
為3表示為管理者關閉連接配接,
為4表示收到Call-Clear-Request;
Error code: 同上面所描述的。
Cause Code:此域表示額外說明斷開原因。
10. Stop-Control-Connection-Request
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為3。
Resverve0/1/2:保留位,必須為0;
Reason:表示會話連接配接關閉的原因,
為1表示響應會話清除請求;
為2表示不支援對端PPTP版本;
為3表示本地系統關閉。
12. Stop-Control-Connection-Reply
Length、PPTP Message、Magic cookie與Start-control-connection-request一緻。
不同的字段含義如下:
Control Message Type :值為4。
Resverve0/1/2:保留位,必須為0;
Result Code:表示關閉連接配接結果碼,為1表示正常關閉成功,為2表示發生一般性錯誤。
Error Code : 表示當Result Code為2時,對應具體的一般性錯誤,Result Code為1時,必須為0。
四、總結
1. PPTP原理
首先,PPTP客戶機使用動态配置設定的TCP端口号,與PPTP伺服器使用的保留TCP端口号1723建立控制連接配接(PPTP控制連接配接攜帶PPTP呼叫控制和管理資訊,用于維護PPTP隧道)。
其次,用戶端與伺服器通過控制連接配接來建立、維護、終止一條隧道。
然後,PPP幀的有效載荷經過加密、壓縮或是兩者的混合處理。
接着,使用通用路由封裝GRE對PPP幀進行封裝。
再者,将PPP幀封裝進IP資料封包中。通過IP網絡如Internet或其他企業準用INTRANET等發送給PPTP伺服器。
最後,伺服器接收到PPTP資料包後進行正常處理。
2. PPTP控制連接配接數的資料包格式
包括一個IP報頭,一個TCP報頭和PPTP控制資訊,還包括資料鍊路層報頭和報尾。