1.單一網(wǎng)絡(luò)環(huán)境
如上圖,手機APP和IP話機通過SIP注冊消息,向服務(wù)器提供自身的IP地址,服務(wù)器將注冊地址保存起來,兩個終端互相通話沒有什么問題。
2. 服務(wù)器處于公網(wǎng)環(huán)境
NAT設(shè)備會將IP數(shù)據(jù)包頭的地址和端口,換成外網(wǎng)的地址和端口,但是服務(wù)器正常情況下采用的SIP注冊消息中攜帶的地址作為終端地址,此時兩個終端連注冊都無法成功,服務(wù)器在SIP注冊消息中獲取的是局域網(wǎng)IP地址,發(fā)出的200 OK無法抵達終端設(shè)備。
這里涉及三個角色,有各自的辦法可解決NAT穿透問題:
1)終端設(shè)備側(cè)
采用STUN服務(wù),STUN的原理是:在公網(wǎng)上部署一個STUN服務(wù)器,位于NAT后面的客戶端設(shè)備向它發(fā)送一系列的UDP包先在NAT設(shè)備上“打洞”,STUN服務(wù)器取到UDP包的來源地址后,回送相關(guān)的消息告訴該客戶端它被映射的外網(wǎng)地址。使用STUN后,SIP消息的contact頭域中就可以直接填入外網(wǎng)地址。
注意,STUN技術(shù)在對稱型NAT設(shè)備中是無能為力的,因為學習到的外網(wǎng)IP地址會失效,此時需要和TURN中繼服務(wù)配合使用。
2)NAT設(shè)備側(cè)
應用層網(wǎng)關(guān)(ALG)是解決NAT對應用層協(xié)議無感知的一個最常用方法,已經(jīng)被NAT設(shè)備廠商廣泛采用,通過感知應用層協(xié)議,對報文深層的內(nèi)容進行檢查,當發(fā)現(xiàn)任何形式表達的IP地址和端口時,將會把這些信息同步轉(zhuǎn)換,并且為這個新連接創(chuàng)建一個附加的轉(zhuǎn)換表項。
注意,NAT設(shè)備的ALG無法解決私有協(xié)議或加密協(xié)議的穿越問題。
3)服務(wù)器側(cè)
融合通信服務(wù)器通過開啟NAT檢測功能,內(nèi)含nat.auto是一個ACL,包含了RFC1918規(guī)定的私網(wǎng)地址,并去掉了本地網(wǎng)絡(luò)的地址。當SIP終端注冊時,通過比較contact地址是否包含在此ACL中來判定該終端是否處于NAT背后,如果是那么它就把contact地址自動替換為SIP包的來源地址,信令就可以正常抵達。
3. 服務(wù)器處于內(nèi)網(wǎng)NAT環(huán)境
當服務(wù)器處于內(nèi)網(wǎng)環(huán)境時,服務(wù)器的解決辦法有:STUN、直接配置外網(wǎng)地址,同時服務(wù)器還支持Upnp協(xié)議,需要NAT設(shè)備支持該協(xié)議并開啟,該協(xié)議允許應用程序向NAT設(shè)備申請并管理內(nèi)外網(wǎng)地址、端口映射。
之所以要配置端口轉(zhuǎn)發(fā),是因為NAT設(shè)備的特性決定了只能內(nèi)網(wǎng)主機接觸過的外網(wǎng)主機才能向內(nèi)發(fā)數(shù)據(jù),而融合通信系統(tǒng)首先發(fā)起注冊的是終端設(shè)備。
4.服務(wù)器和客戶頓都處于NAT環(huán)境
測試環(huán)境中很多都是這個網(wǎng)絡(luò)環(huán)境,但是實際部署的環(huán)境通常卻比較簡單。
這樣的結(jié)構(gòu),將解決NAT穿透的問題主要交給了服務(wù)器側(cè),因為終端設(shè)備的種類多,無法讓所有終端都自行解決穿透問題。