關(guān)于SIP服務(wù)器問題的探討
對于SIP協(xié)議來說,可能有些朋友比較熟悉。在這方面,最突出的就是VoIP業(yè)務(wù)了。在VoIP業(yè)務(wù)中,常會涉及到SIP協(xié)議和SIP服務(wù)器等相關(guān)內(nèi)容。下面我們就來具體看看SIP服務(wù)器當中的穿越問題吧。
1. SIP服務(wù)器問題描述
大多數(shù)傳統(tǒng)的voip協(xié)議(SIP、h323…)在設(shè)計之初都沒有充分考慮NAT穿越問題,它們只關(guān)注怎樣傳輸呼叫信號(連線、拆線…)和應(yīng)用RTP(實時傳輸協(xié)議)傳輸聲音信息。
呼叫信號通常應(yīng)用固定的或標準的端口,而RTP 卻應(yīng)用任意端口收發(fā)聲音信息。
大多數(shù)防火墻/NATs沒有能力將呼叫信號協(xié)議包和聲音信息包捆綁在一起,同時它們也不能識別聲音將向哪里發(fā)送。
這樣,在呼叫者發(fā)起呼叫時,雖然呼叫可以順利獲得通過,響起振鈴,被叫者也可以選擇拾起或者掛斷這個電話,但是,線路上會出現(xiàn)一方或雙方都沒有聲音的現(xiàn)象。
2. NATs 和防火墻
在下面幾種情況下,UDP 可能會受到NAT 或者防火墻影響:
2.1 全錐型NAT:
全錐型NAT是指所有來自同一個內(nèi)部IP地址和端口的請求都被指向同一個外部IP地址和端口,而且,任何外部主機都可以通過發(fā)送信息包到這個被指向的外部地址,向內(nèi)部主機發(fā)送信息包。
2.2 限制錐型NAT:
限制錐型NAT是指所有來自同一個內(nèi)部IP地址和端口的請求都被指向同一個外部IP地址和端口,與全錐型NAT不同的是,只有在一個內(nèi)部主機先向IP地址XXXX發(fā)送信息包后,IP地址是XXXX的外部主機才可以向這個內(nèi)部主機發(fā)送信息。
2.3 端口限制錐型NAT:
端口限制錐型NAT與限制錐型NAT相像,只是限制范圍包括端口號碼。
具體說,只有在一個內(nèi)部主機先向IP地址XXXX和端口PPPP發(fā)送信息包后,外部主機才可以通過IP地址是XXXX和端口PPPP發(fā)送信息包。
2.4 對稱型NAT:
對稱型NAT是指所有來自同一個內(nèi)部IP地址和端口的請求,發(fā)送到特定目標IP地址和端口時,被指向同一個外部IP地址和端口。如果相同的主機通過相同的IP地址和端口向不同的目標發(fā)送信息包,指向也有所不同,而且,只有接收到信息包的外部主機才可以回復(fù)UDP信息包給內(nèi)部主機。
您屬于以上哪種呢?您可以通過應(yīng)用一個stun客戶端軟件來查看:
例如:http://sourceforge.net/projects/stun/#p#
3. SIP服務(wù)器問題詳解
3.1 MVB2000作為一個NAT外部的SIP服務(wù)器,客戶端在NAT內(nèi)部。
(1) 呼叫來自NAT后面,MVB2000發(fā)送聲音到一個私網(wǎng)IP
如果這個VOIP電話沒有應(yīng)用STUN或其它方式檢測它的公網(wǎng)IP(=NAT防火墻上的公網(wǎng)IP),而是直接嵌入私網(wǎng)IP地址到邀請消息,那么MVB2000將不斷向這個私網(wǎng)IP發(fā)送RTP信息包,而這些信息包會被路由器截獲并刪除,導(dǎo)致單方向說話。
(呼叫者聽不到聲音)
這通常是在用戶不去關(guān)心NAT設(shè)備怎樣應(yīng)用,將nat=never、nat=no或者nat=rfc3581寫入sip.conf時所發(fā)生的情況。
(2) 呼叫來自NAT后面,MVB2000發(fā)送聲音到錯誤端口
如果電話可以檢測到它的公網(wǎng)IP, 并且正確地置入SIP服務(wù)器的邀請字頭,MVB2000就會知道向哪個IP地址發(fā)送RTP了。
但是,假設(shè)應(yīng)用的是一個錐型防火墻,NAT設(shè)備發(fā)送RTP到MVB2000的端口不一定與最初的RTP端口相同,這樣,MVB2000將發(fā)送信息包到最初的端口,NAT設(shè)備不會知道信息包去哪里而將其截獲刪除。
用戶可以將nat=route或者nat=yes 寫入sip.conf解決這個問題。
如果NAT后面僅僅有一部電話,您也可以查看一下這部電話使用RTP端口的范圍,然后在防火墻上應(yīng)用端口轉(zhuǎn)移,將公網(wǎng)IP指向內(nèi)網(wǎng)。
如果NAT后面有多部電話,您可以為每一部電話設(shè)定一個非重疊的RTP端口范圍,這樣,應(yīng)用端口轉(zhuǎn)移指向每一部與RTP端口范圍相符的電話。
和應(yīng)用一個STUN服務(wù)器(如果電話有STUN支持)一樣,應(yīng)用對稱型NAT也將解決這個問題。
(3) 呼叫來自NAT外部的MVB2000服務(wù)器,應(yīng)用全錐型NAT設(shè)備
沒有SIP服務(wù)器的電話注冊到MVB2000或sip.conf 里面的NAT設(shè)備IP,這樣,MVB2000不會知道到哪里去查找這部電話,呼叫將被拒絕通過。
(對于所有的NAT設(shè)備都是一樣的)
如果sip.conf 里面host=123.123.123.123 或者電話注冊到MVB2000了,MVB2000將能夠發(fā)送呼叫信號和RTP聲音包到NAT設(shè)備,然后轉(zhuǎn)移到這部電話。
如果電話有STUN支持,它可以打開NAT設(shè)備上的封裝信息,應(yīng)用IP和SDP域中SIP服務(wù)器的消息里面的端口(1個對應(yīng)呼叫信號的端口、1個對應(yīng)RTP的端口和1個對應(yīng)RTCP的端口)
STUN也同時維護這個封裝信息使之處于存活狀態(tài)(檢測NAT超時和發(fā)送保持存活的封裝信息)。
如果電話沒有STUN支持,您需要注冊這部電話到服務(wù)器上,讓MVB2000發(fā)送保持存活的信息(the qualify= line),確認MVB2000發(fā)送的信息比您的NAT設(shè)備超時更快。
沒有STUN支持,您也需要設(shè)置NAT=yes或者NAT=route,在MVB2000服務(wù)器接收那部NAT電話聲音之前,您將不能聽到呼入的聲音。
(4) 呼叫來自NAT外部的MVB2000服務(wù)器,應(yīng)用限制錐型NAT設(shè)備
與上面所講相同,只有被叫電話首先發(fā)出信息到NAT設(shè)備,NAT設(shè)備才可以將MVB2000來電呼叫的聲音包發(fā)送到那個電話上。
您可以通過讓電話發(fā)送一個注冊信息,或者空SIP服務(wù)器的消息(如果您的電話支持STUN)到MVB2000服務(wù)器,打開封裝信息來實現(xiàn)。
如果應(yīng)用STUN,那么這部電話將會知道它被指向的端口和SDP信息(STUN將不必為了做封裝信息而發(fā)送RTP到您的MVB2000服務(wù)器上,只在STUN服務(wù)器上操作即可)。
如果沒有STUN支持,您將需要設(shè)置NAT=yes或者NAT=route,并且在MVB2000服務(wù)器沒有收到來自電話的聲音包之前,您將聽不到聲音。
注意:如果沒有STUN支持,那么注冊地址和代理服務(wù)器地址必須是同一個IP地址,(如果您僅僅應(yīng)用MVB2000服務(wù)器沒有其余的組件如SER 就不存在這個問題)。
(5) 呼叫來自NAT外部的MVB2000服務(wù)器,應(yīng)用端口限制錐型NAT設(shè)備
即使我們注冊這部電話到MVB2000服務(wù)器,MVB2000服務(wù)器也不能發(fā)送任何聲音包到這部電話上,除非這部電話首先發(fā)送聲音包到MVB2000上,而且必須采用NAT設(shè)備上的5060端口。
如果您的電話支持STUN,這部電話將發(fā)送一個空SIP服務(wù)器的消息到您的MVB2000服務(wù)器上,以便打開封裝信息,像任何發(fā)送到MVB2000服務(wù)器上的RTP信息包可以打開RTP封裝信息一樣。
如果應(yīng)用STUN,那么這部電話將會知道它被指向的端口和SDP信息(STUN將不必為了做封裝信息而發(fā)送RTP到您的MVB2000服務(wù)器上,只在STUN服務(wù)器上操作即可)。
如果沒有STUN支持,您將需要設(shè)置NAT=yes或者NAT=route,并且在MVB2000服務(wù)器沒有收到來自電話的聲音包之前,您將聽不到聲音。
3.2 MVB2000作為SIP服務(wù)器在NAT外部,與NAT外部的SIP代理服務(wù)器或客戶端相聯(lián)。
不用地址轉(zhuǎn)換,不存在問題
3.3 MVB2000作為SIP客戶端在NAT外部,與NAT外部的SIP代理服務(wù)器或電話相聯(lián)。
不用地址轉(zhuǎn)換,不存在問題
3.4 MVB2000作為SIP客戶端在NAT外部,與NAT內(nèi)部的SIP代理服務(wù)器相聯(lián)。
您需要將端口轉(zhuǎn)移到NAT上的信號端口,同時轉(zhuǎn)移RTP端口(如果代理服務(wù)器也負責RTP端口)
這個問題與第一個問題相識。
3.5 MVB2000作為SIP服務(wù)器在NAT內(nèi)部,與NAT內(nèi)部的SIP代理服務(wù)器或客戶端相聯(lián)。
不用地址轉(zhuǎn)換,不存在問題
3.6 MVB2000作為SIP服務(wù)器在NAT內(nèi)部,與NAT外部的客戶端相聯(lián)。
您需要將MVB2000應(yīng)用到的所有RTP端口(在RTP.conf中定義)轉(zhuǎn)移到NAT上,同樣,也要做SIP信號端口(sip.conf中有端口選項)轉(zhuǎn)移
您也可以在sip.conf 上配置externip和localnet 選項。
3.7 MVB2000作為SIP客戶端在NAT內(nèi)部,與NAT外部的SIP代理服務(wù)器/電話/網(wǎng)關(guān)相聯(lián)。
能不能工作依賴于對方的電話/網(wǎng)關(guān)(您必須使用externip和localnet 選項)
3.8 MVB2000作為SIP客戶端在NAT內(nèi)部,與NAT內(nèi)部的SIP代理服務(wù)器/電話/網(wǎng)關(guān)相聯(lián)。
不用地址轉(zhuǎn)換,不存在問題
3.9 MVB2000在NAT內(nèi)部,電話/網(wǎng)關(guān)在另一個NAT內(nèi)部
針對這種情況,我們需要一個中間人來相互辨認對方,它應(yīng)該是一個局外的SIP代理服務(wù)器,由它來負責SIP服務(wù)器的傳輸,而且所有的終端都能與它建立聯(lián)接。如果希望點對點傳輸多媒體信息流,那么,我們需要另外一個多媒體服務(wù)器。
可以采用的解決多媒體服務(wù)器辦法有:
◆Portaone's RTPProxy(適合對稱型NAT,需要SER組件支持)
◆AG Projects MediaProxy(適合對稱型NAT,需要SER組件支持)
◆在NAT外設(shè)置兩個MVB2000(通過配置適合所有NAT類型,非對稱型NATs需要設(shè)置NAT=route)
當MVB2000處于NAT內(nèi)部時,如果您想應(yīng)用對稱型NAT,您需要了解sip.conf里面的 externip和localnet。