NAT解決方案的選擇
目前,根據對NAT支持的不同,處理機制的不同,業(yè)內把解決NAT的方法一般有分為以下幾種:

這些方案都有其各自的特點。根據國外有關市場研究人員的報告指出,不同企業(yè)類型的要求不同,部署成本,安全因素,維護成本等因素的影響,所以它們對解決方案的要求也可能有所不同,以下是調查結果發(fā)布狀態(tài):

- 一般家庭用戶選擇簡單的NAT解決方案,例如UPnp,STUN,TURN, ICE
- 小型企業(yè)用戶大部分用戶可能選擇STUN,TURN, ICE 或者SBC,也可能選擇UPnP的方案。
- 一般中型企業(yè)則選擇SBC,STUN, TURN和企業(yè)級的SBC加防火墻的方案。
- 比較大的企業(yè)則會選擇防火墻,SBC的解決方案。
當然,選擇是有成本的。對于VOIP的解決方案,安全是一個公司的非常重要的考慮因素,用戶也要根據不同的安全要求對解決方案進行比較全面的分析,以下圖例數據表示各種解決方案對安全的考慮和其可控性的考慮。

從以上數據我們可以看到,如果用戶需要更加安全的部署方式,需要對其訪問有非常大的靈活性和可靠性,最好的方式還是選擇SBC。
關于STUN和TURN的討論
在實際生產環(huán)境中,我們客戶通常使用的設備所支持的STUN和TURN都可能有所不同,所以這樣就會導致一個解決方案兼容性的問題。例如,可能有的物理話機支持STUN和TURN,但是不支持ICE,有的軟電話可能支持的舊版本的STUN,不支持新標準的STUN。

下面,我們介紹一下關于STUN的流程機制。這里我們要注意,一般我們舉例時使用的是RFC5389來解釋的,相對比較舊的STUN版本是RFC3489(classic STUN)。在RFC5389的規(guī)定中,STUN定義為輕量級的工具,它不是一個完整的NAT穿透解決方案(RFC3489定義為完整的解決方案),它僅是一個解決穿透能力的工具。另外,RFC3489的規(guī)定有幾個方面的不足,很難滿足真正的NAT解決方案。根據RFC5389的解釋,RFC3489的不足主要表現在:
在實際部署環(huán)境中,IP和端口有時可以作為Peer來進行通信,有時則不能。Classic STUN沒有提供準確的方法來處理這些問題。
Classic STUN的算法對多層NAT可能發(fā)生錯誤。
Classic STUN存在安全漏洞,可能有時駭客會利用某些端口重新映射時進行地址或者端口串改。
目前,根據RFC5389對STUN所執(zhí)行的功能包括:
- 用于ICE連接支持(MMUSIC-ICE)
- 用于客戶端的初始化連接(SIP-OUTBOUND)
- NAT行為發(fā)現(BEHAVE-TURN)。
STUN 簡單來說,內網SIP終端通過STUN對STUN發(fā)出請求,STUN回復一個響應,STUN服務器告訴使用指定的外網端口和IP地址。STUN使用UDP,默認端口是3478。它在響應的消息中包含了MAPPED-ADDRESS,RESPONSE-ORIGIN,OTHER-ADDRESS和XOR-MAPPED-ADDRESS這四個參數。通常來說,為了支持NAT的映射和過濾行為機制,STUN服務器必須支持兩個公網IP地址和兩個不同的端口,分別稱之為主信息地址和可選消息地址。讓我們看看具體的實現方式。
具體的流程包括:第一步客戶端A 通過設置的STUN地址查詢STUN外網地址和端口。第二步,客戶端A對客戶端B發(fā)生信令消息,通知客戶端B的外網地址和端口,可以對其發(fā)送媒體?蛻舳薆然后對NAT路由器發(fā)送媒體,NAT路由器然后轉發(fā)到客戶端 A。
以下圖例是一個簡單的STUN流程圖(缺少對Symmetric 的支持,需要TURN支持):

在上面的流程中,NAT是如何被檢測的?RFC 5780 規(guī)定了三個階段的NAT檢測方式:

NAT檢測的具體步驟:

研究人員Baruch 更加詳細地描述了這個test的流程,用戶可以查閱此研究人員的文檔做進一步了解。具體Test的邏輯順序請讀者參考 RFC5780的4.5 部分。如果讀者需要了解更多的相關定義,請參RFC 5780 相關協議:

現在讓我們看看在SIP中NAT請求和響應的示例。

STUN 返回的IP和port number, SIP然后在SIP header 使用這個新的地址。

大家需要注意以下SIP頭中的rport 1024, 當在NAT后的終端收到消息時,這個rport 端口會覆蓋原來的端口49300端口。這里,實際上,rport是做路由使用的。關于rport 端口的修改問題,讀者查閱RFC3581 的Server Behavior中rport的修改規(guī)則。用戶必須注意,在有一些網絡環(huán)境中,系統管理機制可能對收到的消息和返回的消息地址端口非常敏感,如果是這樣的話,RFC3581 標準建議開啟TLS服務。另外,用戶也應該注意到,如果修改rport了,這里可能涉及到了一個安全的問題,攻擊者在路由路徑中插入了一個中轉服務器的話,可能導致安全問題。

盡管STUN可以解決很多類型的NAT問題,但是仍然有很多局限性:
- STUN不支持Symmetric NAT類型,因為每一個新創(chuàng)建的IP:port 的會話映射可能地址以前STUN檢測到的數據失效。
- 如果防火墻設置了對UDP丟棄數據包的參數,也會導致STUN失敗。
- 因為UDP不是一個長連接的方式,防火墻可能關閉一些存活動端口,這樣可能導致會話失敗。
- 終端客戶的網絡環(huán)境可能導致STUN失敗,因為有的終端可以抵達服務商的服務器地址,有的SIP終端可能可能不會抵達STUN服務器地址(例如,很多國內用戶使用國外的STUN地址),這樣的話,SIP之間可能存在多層的NAT問題。整個網絡環(huán)境會變得更加復雜。
關于TURN的討論
既然STUN存在那么多的問題,但是如何解決這些問題是技術研究人員必須面對的困難。俗話說,辦法總比問題多。TURN是一個補充STUN不足的好辦法。TURN的英文全稱如下:
- Traversal Using Relays around NAT (TURN)
- Relay Extensions to Session Traversal Utilities for NAT (STUN)
從英文全稱就可以看出,它僅是STUN的一種拓展,使用了中繼穿透NAT的方式。根據RFC5766的描述,TURN的設計目的是ICE的一部分,但是可以獨立使用。

在很多應用場景中,位于NAT后面的終端可能不能與外網的終端進行點對點的通信,如果需要雙方通信的話,只能借助于一個外網的中轉服務點來實現互通。TURN的作用就是幫助雙方繞過阻擋的網絡點,使用中繼的方式,支持終端控制中繼操作從而實現雙方的數據交換,也可以支持終端對多點終端互通。
TURN和STUN相比,因為TURN的它本身的拓展,所以它也支持更多的功能,以下是對于TURN的一個總結:
除了本身工作方式類似以為,TURN可以支持SIP消息和媒體的轉發(fā),工作角色可以是一個代理的形式。
TURN可以支持UDP和TCP,TCP可以支持長連接,從而保證防火墻對會話的連接不會斷開。但是,這里要注意,根據RFC5766的規(guī)定,如果是TRUN server 到Peer則都使用UDP。大概20%以上的會話需要使用TURN。

TURN可以支持Symmetric NAT, 但是STUN則不能支持。我們前面已經提及。
TURN必須支持公網IP地址。
TURN的本身要求服務提供商的TURN服務器部署成本相對比較高。因為,TURN需要考慮大量會話,大量轉發(fā)數據,同時還要獲取Relays 路徑中的交換數據。
以上我們討論的是關于整個TURN的使用場景的各種因素,但是還有很多細節(jié)性的問題可能在實際應用中也可能出現,例如,以下圖例是一個開發(fā)人員在測試WebRTC中關于使用P2P和SFU時的數據,使用P2P或SFU測試的結果是完全不同的。以下是其中一個數據。

TURN服務器的表現因為地理原因,配置原因或者其他的原因造成的對語音時延也完全不同,以下示例來自于 Dag-Inge Aas, 在開發(fā)WebRTC時對于TURN服務器時延的實驗數據,各個服務器的帶寬不同,處理能力不同導致的各種不同的結果。

如果用戶選擇TURN的話,可以參考Twillio的標準來做出決定:是否全球部署,是否靠近用戶,是否支持拓展,是否優(yōu)化時延。

關于ICE討論
前面我們詳細討論了STUN和TURN的使用場景和各種影響。讀者可能會看到,以上兩種方式仍然存在一些問題。ICE的出現改善了兩種NAT解決方法的很多問題。ICE英文全名是Interactive Connectivity Establishment。RFC5245(更新的RFC6336)對ICE做了規(guī)定。一般簡單的定義是:ICE=STUN+TURN+協商機制+協商路徑。以下圖例中表示了ICE的架構。

以下是一個Candidate的消息架構體,關于結構體中每個參數的含義,請參閱RFC3245的第三部分(Terminology)。

ICE執(zhí)行的幾個步驟:
- 發(fā)現收集申請終端信息。收集到終端可通信的地址,終端申請者的類型(host, Reflexive和Relay candidate)。
- 根據優(yōu)先級對candidate 進行處理,大部分情況下,首先使用Relay candidate。
- 解析candidate信息,發(fā)送到對端candidate。
- 對candidate進行配對處理,保證雙方匹配。
- 檢查配對的candidated的連接性。
- 計算ICE是否可以連接成功,如果成功,則發(fā)送確認消息。
- 然后進行語音流的通信。
以下幾個步驟比較詳細地介紹了關于SIP ICE的協商過程:




通過priority oder,結合兩個pair check the ICE開始測試。如果雙方測試成功,則進行下一步的信令交互,例如SIP 2 發(fā)送180消息,發(fā)送200 OK消息。如果開始發(fā)送到消息和收到的消息不一致,則需要SIP Phone 1 重新發(fā)送Re-INVITE消息,然后進行測試驗證,最后收到200 OK消息。
ICE 測試成功以后,則雙方開始發(fā)送RTP語音。

關于ICE的支持問題,在我們很多常見的環(huán)境中,有的終端可以支持ICE,但是有一些終端可能不支持。用戶可以檢查各種軟電話的ICE配置功能。以下SIP消息中表示終端支持ICE:sip.ice。

如果對端終端不支持ICE的話,終端只能有兩種選擇:1)繼續(xù)連接,但是不使用ICE,ICE支持一個自動檢測返回的機制,通知對端不支持ICE。2)或者繼續(xù)執(zhí)行一個可選授權支持的方式使用ICE,根據RFC5768對Mandating Support的規(guī)定, SIP終端可以在INVITE請求的Require中添加一個ice option。
另外,用戶可能有時看到這樣的例子,在終端的SIP INVITE頭中沒有sip.ice, 但是在SDP中確實有ICE candidate的信息,這也是互相不兼容導致的結果,但是最終這是一種不支持ICE的標識。

因為SIP技術本身的快速發(fā)展,其實ICE的版本也在不斷更新。這里,我們簡單介紹兩個ICE的“升級”版本。這里,我稱之為升級版本僅是對ICE的一種優(yōu)化,它們并不是在ICE本身的升級或者更新:
ICE-lite主要功能是簡化了ICE的復雜性,例如,我們看到的SBC。
Trickle ICE主要目的是縮短了ICE的協商處理時間,避免重新分配已被轉發(fā)的candidate,如果需要則開啟。不像ICE的標準處理流程,標準的ICE需要收集candidate的信息狀態(tài)信息,它則一開始就和host candidate檢查連接狀態(tài),同時并行處理其他的交換機制。所以,Trickle ICE相對較低了處理流程花費的時間。
關于Near-NAT和Far-NAT討論
很多時候,大家可能會看到關于Near End NAT 和Far End NAT的解釋說明。從字面意思也可以基本理解這兩個概念的基本區(qū)別。
Near End NAT是在本地NAT處理機制中通過本地ALG或者本地SBC修改了SIP 頭消息,出局時SIP頭消息變成了公網的IP地址,然后運營商SBC增加一個Via到SIP 頭,最后呼叫到對端終端。下面圖例中的五個處理流程解釋了Near End NAT的完整過程。

Far End NAT是本地網絡對SIP頭消息不做任何處理,運營商側SBC修改SIP頭消息,添加Via,然后呼叫遠端終端。同時,運營商SBC會對內網SIP終端發(fā)送一個SIP OPTION 或者NOTIFY消息,保證終端SIP防火墻的端口不被關閉,通信端口一直處于存活狀態(tài)。

從以上介紹中,我們可以看到,兩者之間的區(qū)別就在于在說明地方修改的SIP頭的IP地址,而且Far End NAT的處理方式會引起路由器需要不斷地接收從運營商SBC發(fā)送到大量的NOTIFY消息,這樣可能會導致公司內網的不穩(wěn)定。關于ALG和SBC的解決方案介紹我們會在下一個講座中專門介紹這些內容。
總結,在本章節(jié)中,我們首先討論了關于STUN,TURN和ICE的原理和使用場景,同時,我們也介紹了它們之間的不同和各種在實際場景中所支持的功能和其局限性。另外,我們重點介紹了ICE的幾個協商流程,最后多兩個通常使用的NAT概念做了描述和介紹。ICE本身集合了STUN,TURN的各自的優(yōu)勢,在解決NAT方面可能是目前一種最佳的利器,但是因為網絡環(huán)境不斷變化,終端客戶的設備類型也不斷升級,所以ICE的技術應用仍然在不斷升級來支持更多的要求。用戶需要根據自身特點,網絡資源,本身成本等不同方式來解決NAT問題。
參考資料:
http://manoftoday.wdfiles.com/local--files/nat/SIPNATtraversal.pdf
https://medium.com/the-making-of-appear-in/webrtc-and-turn-latency-around-the-world-4d172dd59e8e
https://bloggeek.me/turn-public-ip-address/
關注我們的公眾微信號:asterisk-cn 獲得更多有價值的開源通信行業(yè)分享,訪問技術論壇獲得關于開源IPPBX的幫助和下載:www.issabel.cn/forum
