首先,先來理解下什麼是 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
不同的字段含義如下:
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
不同的字段含義如下:
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控制信息,還包括數據鏈路層報頭和報尾。