VOIP的運行需要對接很多公網(wǎng)資源,例如,對接運營(yíng)商的SIP中繼,對接第三方的其他支持服務(wù)器,對接分公司業(yè)務(wù)等等數據。但是,無(wú)論怎么對接,用戶(hù)都需要一個(gè)標準的網(wǎng)絡(luò )架構來(lái)實(shí)現內網(wǎng)分機和外網(wǎng)的互聯(lián)互通。因為,網(wǎng)絡(luò )地址資源的限制,所以,內網(wǎng)和外網(wǎng)的互聯(lián)互通就需要一個(gè)內網(wǎng)地址轉換的機制,通過(guò)一個(gè)外網(wǎng)轉換到多個(gè)內網(wǎng)的地址。這里,就涉及到了路由器防火墻和應用業(yè)務(wù)的端口管理問(wèn)題,其中有一些應用可能還不是問(wèn)題,但是對SIP的語(yǔ)音通信來(lái)講,這是一個(gè)非常具有挑戰性的難題。為了幫助讀者盡快了解這些相關(guān)的技術(shù)細節,我們盡可能在有限的篇幅中對NAT提供多角度,多維度的討論,幫助用戶(hù)盡快了解這些必要的技術(shù)。
今天,我們將重點(diǎn)討論以下幾個(gè)方面的內容,它們包括:防火墻,關(guān)于NAT的相關(guān)基礎概念,UDP 打洞介紹,NAT的類(lèi)型。
1、請讀者注意,這里我們討論所有的相關(guān)細節時(shí)不會(huì )介紹太多和本話(huà)題不相關(guān)的技術(shù)內容,所以,筆者建議用戶(hù)首先了解一般的網(wǎng)絡(luò )環(huán)境和知識點(diǎn),以免引起造成困擾。在討論NAT之前,我們首先解釋一下關(guān)于為什么防火墻的對NAT處理有影響。以下圖例解釋了一個(gè)簡(jiǎn)單的防火墻的工作拓撲圖:

這里,防火墻置于企業(yè)網(wǎng)絡(luò )邊界的地方,防火墻的工作就是保護公司內網(wǎng)的安全。關(guān)于防火墻的具體功能和配置,我們這里不再介紹。但是,為了配合SIP的相關(guān)話(huà)題,我們這里再次強調一下關(guān)于防火墻的使用環(huán)境的問(wèn)題,一般意義上,防火墻的應該是:
- 防火墻對網(wǎng)絡(luò )數據進(jìn)行策略管理,數據流量管理。
- 防火墻對某些設備進(jìn)行權限的設置管理。
- 防火墻一般允許內網(wǎng)用戶(hù)訪(fǎng)問(wèn)外網(wǎng),同時(shí)允許內網(wǎng)訪(fǎng)問(wèn)外網(wǎng)時(shí)返回的數據進(jìn)入到內網(wǎng)。
- 防火墻通常允許HTTP,SMTP這些一般的工作應用業(yè)務(wù)進(jìn)行數據傳輸。
- 防火墻通常對SIP不太友好,可能過(guò)濾SIP端口,RTP 端口。

- 防火墻只能對外網(wǎng)進(jìn)行保護,但是不能對內網(wǎng)軟件病毒或者其他內網(wǎng)設備發(fā)起的攻擊進(jìn)行保護。所以,進(jìn)來(lái)避免在內部電腦安裝其他的未授權的第三方軟件。

2、大家知道,如果我們給公司公網(wǎng)申請一個(gè)固定IP地址的話(huà)是需要付費的,IP地址是一個(gè)緊缺資源,IPv4的地址資源已經(jīng)非常緊缺。通常情況下,一個(gè)可以上網(wǎng)的網(wǎng)絡(luò )環(huán)境至少需要一個(gè)公網(wǎng)的地址,這個(gè)公網(wǎng)地址對應內部網(wǎng)絡(luò )地址(Class A, Class B 和Class C)進(jìn)行轉換。RFC 6314 和RFC 4787對NAT做了規范。
為了實(shí)現一個(gè)公網(wǎng)地址對應多個(gè)內網(wǎng)地址來(lái)實(shí)現正常的網(wǎng)絡(luò )訪(fǎng)問(wèn),我們必須使用一個(gè)NAT的機制,我們簡(jiǎn)單稱(chēng)之為網(wǎng)絡(luò )地址轉換(1:N),通過(guò)NAT可以實(shí)現公網(wǎng)地址轉換為內網(wǎng)地址的作用。關(guān)于更多的NAT介紹,讀者可以參考網(wǎng)絡(luò )上的學(xué)習資料學(xué)習,這里不做過(guò)多討論。根據德國研究人員Florian Wohlfart對一般小型企業(yè)和家庭用戶(hù)對NAT的測試,根據網(wǎng)絡(luò )的不同,NAT過(guò)濾的比例也完全不同,所以NAT確實(shí)影響了數據的正常互通。

以下是一個(gè)內網(wǎng)終端訪(fǎng)問(wèn)外網(wǎng)的IP狀態(tài),讀者通過(guò)以下圖例可以看到,內網(wǎng)地址在通過(guò)防火墻到公網(wǎng),然后到達另外一個(gè)公網(wǎng)地址時(shí),自己的內網(wǎng)IP地址已經(jīng)給替換成了公網(wǎng)的IP地址。在公網(wǎng)出局之前,內網(wǎng)地址會(huì )被過(guò)濾。

對端網(wǎng)絡(luò )響應的消息將會(huì )返回到防火墻,然后通過(guò)路由器策略返回到請求的終端IP地址。

上面,我們看到的是終端和服務(wù)器端的互通,現在我們看看兩個(gè)帶NAT的終端直接互通的實(shí)現方式。在以下的示例中,兩個(gè)帶NAT的終端都需要注冊到公網(wǎng)以外的服務(wù)器,然后實(shí)現正常的通信流程。

如果兩個(gè)終端需要直接互通的話(huà),可以對服務(wù)器發(fā)出請求,然后服務(wù)器對其注冊策略進(jìn)行調整,讓兩個(gè)終端可以自己直接協(xié)商,兩個(gè)終端設備打洞以后實(shí)現雙方的直接互通。下面,我們介紹幾個(gè)不同NAT的流程處理方式:
同一NAT Hole Punching的一個(gè)具體流程:

不同NAT環(huán)境下 Hole Punching的處理流程:

多層NAT處理流程和一層NAT的處理機制基本上相同,但是多了一層協(xié)商的機制。網(wǎng)絡(luò )環(huán)境也變得更加復雜。

我們一直討論再不停解釋協(xié)商的概念,大家知道,UDP是一種不可靠的傳輸方式,需要端口一直處于存活狀態(tài)。如果打開(kāi)的洞好久時(shí)間沒(méi)有數據交換,可能這個(gè)洞就會(huì )關(guān)閉。所以在UDP的打洞時(shí)也使用了定時(shí)器的開(kāi)關(guān)來(lái)保證一定時(shí)間內這個(gè)洞是開(kāi)放的狀態(tài)。但是,不幸的是,很多NAT設備的設置和定時(shí)器的設置可能都不完全相同,一些設備的NAT的定時(shí)器設置一般為20秒,如果為了保證會(huì )話(huà)一直存活的話(huà),可能需要調整定時(shí)器的時(shí)間長(cháng)度,在網(wǎng)絡(luò )中不停發(fā)送keep-live的數據包,可能在很短早期需要再次重新發(fā)送這些數據包,讓打開(kāi)的這個(gè)洞一直參與存活狀態(tài)。但是,更為不幸的是,這樣的做法同樣生成很多的無(wú)效數據,耗費了很多網(wǎng)絡(luò )資源。
上面我們討論了關(guān)于UDP 打洞的幾個(gè)方式和UDP打洞的定時(shí)器設置問(wèn)題。既然有關(guān)于UDP的打洞的方式就會(huì )有基于TCP的打洞方式。關(guān)于TCP的方式,因為篇幅的關(guān)系,而且在我們的SIP案例中的使用量不多,所以,我們這里不再繼續展開(kāi)討論。讀者可以參考Bryan Ford 發(fā)表的文章做進(jìn)一步的研究,他的文章也討論了關(guān)于基于UDP打洞和TCP打洞的測試方式和測試流程。
根據Bryan發(fā)表的完整,在實(shí)際生產(chǎn)環(huán)境中,用戶(hù)對各種路由器的使用比例做了一個(gè)統計,以下是統計結果:

在使用點(diǎn)對點(diǎn)處理打洞的方法上,業(yè)內有很多公司也使用了UDP Hole Punching 來(lái)保證用戶(hù)的連接效果。Tribler的測試結果可以作為一個(gè)參考,根據它們官方數據,成功率都在85%以上。Tribler使用的具體測試方法和工具,請讀者查閱參考資料鏈接。

下面,我們結合一些我們經(jīng)常使用的場(chǎng)景來(lái)形象化地解釋一下打洞的實(shí)現方式。這些場(chǎng)景可能是:點(diǎn)對點(diǎn)的通信,或者服務(wù)器端的的Bypass功能。以下圖例是經(jīng)過(guò)雙方協(xié)商以后,實(shí)現雙方互通的流程。

如果終端都在同一NAT的內網(wǎng)環(huán)境中,系統也可以實(shí)現互通連接。這里,我們拿一個(gè)目前最為典型的云托管的FreePBX舉例。如果兩個(gè)終端都在同一內網(wǎng),而且帶NAT環(huán)境。首先,兩個(gè)終端都需要實(shí)現SIP信令的連接,確保連接成功。

在這種情況下,IPPBX可以支持內網(wǎng)之間的互通,兩個(gè)同一內網(wǎng)的終端就可以實(shí)現語(yǔ)音或視頻的通話(huà)。這樣相對節省了很多網(wǎng)絡(luò )的資源。但是,也存在很多缺點(diǎn),例如,影響計費功能,影響系統錄音功能。關(guān)于IPPBX終端直接互通的功能的設置和影響,我們在以前的Asterisk功能設置的講座中已經(jīng)提及,這里不再繼續討論。

但是,在現實(shí)的網(wǎng)絡(luò )環(huán)境中,我們的網(wǎng)絡(luò )架構也遠遠不是我們介紹的那樣簡(jiǎn)單。很多網(wǎng)絡(luò )已經(jīng)涉及了多個(gè)NAT的環(huán)境,多個(gè)網(wǎng)絡(luò )地址,而且不同的防火墻對SIP的過(guò)濾也有所不同。

在實(shí)際運行環(huán)境中,比較典型的實(shí)例就是關(guān)聯(lián)了SIP內網(wǎng)地址,如果內網(wǎng)的終端SIP消息在出局時(shí),防火墻經(jīng)過(guò)了NAT以后,相關(guān)的內網(wǎng)SIP 頭消息都會(huì )被丟棄或者修改(Via,Contact,SDP中的c),發(fā)送出去的只有公網(wǎng)IP地址的消息。如果外網(wǎng)終端返回響應的消息時(shí),路由器就可能丟棄這些無(wú)效的消息,或者無(wú)法做出路由策略的判斷,返回的消息也不知道如何路由到內網(wǎng)相應的終端。

3、剛才,我們介紹了NAT對SIP的影響,現在,我們介紹一下NAT的四種類(lèi)型和各自的不同。完整的NAT類(lèi)型的定義可以參考維基百科的定義。

根據以下圖例我們可以看到,不同的NAT類(lèi)型,對IP地址和端口的定義是完全不一樣的,通過(guò)不同的IP地址和端口的組合限制來(lái)確定NAT的類(lèi)別。

以上圖例來(lái)自思科網(wǎng)絡(luò )資料
簡(jiǎn)單來(lái)說(shuō),以上四種類(lèi)型的定義為:
- Full Cone來(lái)自網(wǎng)絡(luò )所有的請求都轉發(fā)到一個(gè)內網(wǎng)地址,IP地址,端口都不受到限制。
- Restricted Cone則限定某些外網(wǎng)的IP可以可以轉發(fā)到相應的一個(gè)內網(wǎng)地址,端口可以變動(dòng)。
- Port Restricted Cone則要求具體的IP地址和端口都限定。
- Symmetric Cone則可以同時(shí)支持多個(gè)IP地址/端口的版本,端口和IP地址必須是一組的限定。
從幾個(gè)類(lèi)型的定義看,NAT類(lèi)型對網(wǎng)絡(luò )的要求是完全不同的,Full Cone是最為寬松的,而Symmetric是最為嚴格的。我們這里根據不同的顏色和字體表示對NAT轉換的寬松程度。當然,越來(lái)越寬松勢必帶來(lái)很多的網(wǎng)絡(luò )安全隱患問(wèn)題和其他的問(wèn)題。
運營(yíng)商或者網(wǎng)絡(luò )本身也有對NAT的很多方面的限制。幾年前,德國研究人員在德國和美國針對中小型企業(yè)和家庭網(wǎng)絡(luò )調查得出的各種NAT的比例:
Tribler 公司對用戶(hù)做的NAT環(huán)境的調查結果,幾種NAT對用戶(hù)網(wǎng)絡(luò )的影響:
Tribler 公司對用戶(hù)做的NAT環(huán)境的調查結果,幾種NAT對用戶(hù)網(wǎng)絡(luò )的影響:

- 基于全球的NAT分布狀態(tài):

- 因為NAT連接超時(shí)的頻率:

- 盡管NAT問(wèn)題非常復雜,很多商業(yè)公司提供了NAT測試的工具,用戶(hù)可以下載測試。Nattest 公司提供關(guān)于NAT檢測的一些解決方案,這家公司也提供檢測NAT的工具檢測超時(shí),端口存活等狀態(tài)數據。
- 客戶(hù)端對服務(wù)器端發(fā)送請求,服務(wù)器端返回響應消息。這樣的交互大約要互相發(fā)送100多次,才能獲取到真實(shí)的數據。

以下是檢測關(guān)閉的測試流程。

4、在上一個(gè)部分我們介紹了NAT的幾種類(lèi)型,現在我們主要針對SIP終端結合NAT做一個(gè)簡(jiǎn)單的介紹。以下圖例簡(jiǎn)單解釋了SIP失敗的原因,用戶(hù)可以查閱RFC6314對NAT做更多了解。

以下圖例表示了UA呼叫外網(wǎng)的NAT類(lèi)型,full cone 對所有外網(wǎng)開(kāi)發(fā)。

以下圖例限定僅對IP地址開(kāi)發(fā),即使用戶(hù)使用不同的端口。

以下圖例限定了用戶(hù)使用的端口和IP地址。

以下圖例說(shuō)明用戶(hù)同時(shí)限定了在同一會(huì )話(huà)時(shí)IP地址和端口的匹配。

總結,在本章節中我們介紹了關(guān)于防火墻的基本概念,另外,我們也討論了NAT的形成和一些關(guān)于NAT的打洞的技術(shù)討論,以及市場(chǎng)上各種NAT所在比例,我們還通過(guò)各種圖例結合SIP場(chǎng)景介紹了NAT的幾種類(lèi)型。通過(guò)以上對NAT的完整介紹,筆者希望用戶(hù)對NAT有一個(gè)完整的概念。在接下來(lái)的章節中,我們將介紹如何通過(guò)各種解決方案來(lái)解決NAT的問(wèn)題。
參考資料:
https://tools.ietf.org/html/rfc6314
https://tools.ietf.org/html/rfc4787
http://www.brynosaurus.com/pub/net/p2pnat.pdf
http://conferences.sigcomm.org/co-next/2013/workshops/HotMiddlebox/program/p43.pdf
https://www.tribler.org/NATMeasurements/
http://www.ds.ewi.tudelft.nl/reports/2010/PDS-2010-007.pdf
更多開(kāi)源VOIP行業(yè)知識,請關(guān)注我們的微信號:asterisk-cn, 訪(fǎng)問(wèn)技術(shù)論壇:www.issabel.cn/forum 獲得開(kāi)源融合通信軟件。