張炳
山西大同同煤集團通信有限責任公司數據網絡中心
STUN技術及在VOIP中的應用
張炳
山西大同同煤集團通信有限責任公司數據網絡中心
STUN ;VOIP ;公私網穿越
隨著互聯網的迅速發展,以IP技術為基礎的新一代通信系統逐漸發展成熟,其中以VOIP技術為代表的通信技術已逐漸得到廣泛的應用。SIP、H.323、MGCP等網絡通信協議的開發為VOIP技術提供了技術保障,目前在國內正在大規模實施的NGN技術的核心即應用了VOIP技術。
盡管VOIP技術已經得到了廣泛的應用,但在具體實施的過程中,仍普遍面臨很多實際問題,大多數企業在部署VOIP應用時,大多采用了以下方案:
1、從安全的角度進行考慮,一般將VOIP網絡放在公司防火墻后面,由防火墻實施保護。因此必須考慮如何讓VOIP流可以穿越防火墻。特別是VOIP的客戶端和服務端均位于防火墻之后。
2、部分企業在實施VOIP項目時,由于沒有充足的IP地址,不得不采用私網地址,為了保證公網用戶可以注冊到VOIP系統中,需要在公司路由器或者邊界會話器等設備中進行NAT轉換。
在上述兩種方案中,均面臨如何解決NGN用戶公私網穿越這一難題,在VOIP技術的發展過程中,先后出現了多種針對以上問題的解決方案,可以讓基于VoIP呼叫穿透防火墻,但不同的NAT設備要求使用不同的NAT技術。因此在實施的過程中仍存在諸多不便。本文即討論一種新的解決方案:利用STUN服務器技術解決VOIP應用中的NAT問題。
STUN技術是一種輕量級協議,它允許位于NAT之后的VOIP客戶獲取所分配的公網IP及端口號,同時還能夠獲取NAT及防火墻類型。利用所獲取的公網IP信息可以以VOIP服務器端進行交互,從而實現NAT穿越。由于該技術實現簡單,因此它可以廣泛地應用于有NAT設備的VOIP網絡中。
STUN分為CLIENT和SERVER兩部分,其中CLIENT位于私網內部,可以集成到終端設備中,用于產生和發送STUN請求報文,而SERVER部分位于公網之中,用來接收并響應CLIENT發送的請求報文。所有的STUN報文均有20個字節長的報頭組成,如圖一所示:

圖一
其中消息類型分為Binding Request、BindingResponse、Binding ErrorResponse、SharedSecret Request、SharedSecretResponse、SharedSecretErrorResponse六類。事務ID是一個16個字長的標識符,在同一個事務中使用相同的事務ID。
在消息頭之后是消息屬性部分,如圖二所示屬性部分由三部分組成,屬性類型、屬性長度、屬性值:

圖二
其中屬性類型部分可分為MAPPEDADDRESS等共11種消息。
在FRC3489中將STUN協議中的NAT4種類型,分別為:FullCone、RestrictedCone、PortRestrictedCone和Symmetric。
FullCone:即一對一(one-toone)NAT,此類NAT中,同一個內部IP及端口均被映射到同一個公網的IP及端口上,公網的其他IP均可以通過所映射的公網IP及端口訪問該內部IP。
RestrictedCone:此類NAT中,一個內部IP及端口(IP1)映射到公網中的同一個IP及端口(IP2),IP1的數據包都需要通過IP2進行發送。公網其他IP3只有在IP1首先給IP3發送報文之后,才可以通過IP2訪問IP1。
PortRestrictedCone:該類NAT類似于RestrictedCone,但比Restricted Cone多了對端口的限制,在此類NAT中,一個內部IP及端口(IP1)映射到公網中的一個IP及端口(IP2),IP1的數據包都需要通過IP2進行發送。公網其他IP3只有在IP1首先給IP3發送包含IP及端口的報文之后,才可以通過IP2訪問IP1。
Symmetric:該類NAT中,一個內網的IP及端口發送請求到一個公網的IP地址和端口,均被映射到一個特殊的公網IP地址和端口。同一個內網IP訪問不同的公網IP,將使用不同的映射關系,該NAT的安全級別較高。
如圖三所示:STUN客戶端如:IP電話、IP語音網關等設備位于各自的私網內,通過防火墻(FireWall)或邊界會話器(SBC)公網互聯,與STUN技術在具體應用中,Stun客戶端會通過三種測試方式與公網上的Stun服務器的兩個IP和port進行交互,根據返回的結果可以判斷出NAT的類型。

圖三STUN技術示意圖
測試一:STUN客戶端給STUN服務器通過UDP協議發送一個STUN BindingRequest,如果STUN服務器沒有返回響應,則表明此類鏈接并非UDP鏈接。如果服務端接收到該請求,該服務器將檢查源IP地址和端口,并將該地址與端口號放入一個BindingResponse中發送會客戶端中。當客戶端收到該BindingResponse消息后,將其中由服務器端寫入的地址與端口號與客戶端地址及端口號進行對比,如果一致,則表明該客戶端位于公網之中,否則表明該客戶端位于一個或多個NAT之后。
測試二:經過測試一后,如果該客戶端位于NAT之后,則客戶端將進行測試二,該測試中將利用同一源IP地址和端口向服務器端的另一個IP地址及端口發送一個BindingRequest,服務器收到該請求后,將返回客戶端一個Binding Response。如果客戶端可以收到該BindingResponse,則表明客戶端位于一個FullCone類型的NAT之后。如果客戶端沒有收到BindingResponse,接著客戶端將利用該IP地址和端口再進行一次測試一,如果兩次測試中的IP地址和端口號一樣,則表明該客戶端位于RestrictedCone或PortRestrictedCone類型的NAT之后,否則該客戶端位于Symmetric類型NAT之后。
測試三:在測試中客戶端將向服務器端B向C的第二個IP的一個端口發送一個BindingRequest,并服務器端的第二個IP使用不同的端口號給客戶端返回一個BindingResponse。如果客戶端收到該BindingResponse,則表明該NAT類型為RestrictedCone,如果沒有收到該消息則表明該NAT對端口進行了限制,及客戶端位于PortRestrictedCone類型NAT之后。
通過上述測試流程,STUN客戶端即可獲取到NAT的公網IP端口號,利用該IP地址和端口即可替換VOIP注冊時的IP地址和端口號并進行注冊,即可實現NAT穿越進行VOIP注冊。而現在市場上大多數的VOIP設備均內置了STUN客戶端,因此使用該方法可以非常方便地實現VOIP功能。
10.3969/j.issn.1001-8972.2010.24.034