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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 因?yàn)镹AT連接超時(shí)的頻率:

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

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

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

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

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

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

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

總結(jié),在本章節(jié)中我們介紹了關(guān)于防火墻的基本概念,另外,我們也討論了NAT的形成和一些關(guān)于NAT的打洞的技術(shù)討論,以及市場(chǎng)上各種NAT所在比例,我們還通過(guò)各種圖例結(jié)合SIP場(chǎng)景介紹了NAT的幾種類型。通過(guò)以上對(duì)NAT的完整介紹,筆者希望用戶對(duì)NAT有一個(gè)完整的概念。在接下來(lái)的章節(jié)中,我們將介紹如何通過(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è)知識(shí),請(qǐng)關(guān)注我們的微信號(hào):asterisk-cn, 訪問(wèn)技術(shù)論壇:www.issabel.cn/forum 獲得開(kāi)源融合通信軟件。