sip從私網到公網會遇到什麼樣的問題呢?
包的位址轉換。
sip訊息裡面的sip位址轉換。
sip訊息裡面的sdp中的rtp位址轉換。
網路現存結構複雜,sip服務提供商並不一定是network提供商,很難要求客戶只能使用某種方式的nat&firewall。如何找出一種可以滿足各種網路的sip應用解決方案呢?
nat和firewall的基本原理
首先,nat的幾種方式:
full cone:當一台私網內的主機向公網發乙個包,其本地位址和埠是,nat會將其私有位址轉換成公網位址並繫結。任何包都可以通過位址送到該主機的位址上,nat會將任何傳送到的incoming包的位址轉換成。
partial/restricted cone:當一台私網內的主機向公網發乙個包,其本地位址和斷口是,nat會將其私有位址轉換成公網位址並繫結。任何包都可以通過位址送到該主機的位址上,但是,nat只為第乙個發往的包繫結成|<->,其中是那個包的源位址和埠。也就是說,只有來自的包才能於主機通訊。
partial和restricted cone的區別是partial只繫結incoming packet 的ip位址,而restricted cone會繫結incoming packet的ip位址和埠。也就是上面描述的那種情況。
symmetric cone:當一台私網內的主機向公網某台主機傳送乙個包,à。nat會將其位址轉換成,並為其繫結成|<->。nat只接受來自的incoming packet,將它轉給。也就是說,如果私網內的主機要向外面傳送乙個包,它必須要知道對方的公網ip和埠。但如果對方也是處於乙個私網內,它就很難獲知對方的公網ip和埠。
由此可見,symmetric cone條件最嚴格,partial/restricted cone次之,full cone條件最不嚴格。
下面再看看firewall的基本策略:
l firewall會判斷所有的包是來自內部(inside)還是外部(outside)。
l 一般,允許所有來自inside的包發出去。
l 一般,允許來自outside的包發進來,但這個連線必須是由inside發起的。
l 一般,禁止所有連線由outside發起的包發進來。
l 一般,firewall會允許幾個信任的outside主機,他們可以發起建立連線,並發包進來。
所有nat和firewall都是對於tcp/ip層以下進行處理和過濾的,而sip應用的位址是在應用層。所以必須採用其他的途徑來解決這一問題。
針對不同的nat型別,可以有不同的解決方案。
l upnp
l external query
l stun
l alg
其中前3種都是由sip client(包括ua和proxy)通過某種手段或協議在invite之前獲取自己的公網位址和埠。需要sip client提供額外支援,並且也不適應所有的nat方式。
下面針對乙個案例詳細描述alg的解決方案。
sip alg解決方案
alg修改sip訊息裡面的sip位址和埠和sdp訊息裡面的rtp位址和埠,其中rtp位址和埠要向rtp proxy請求獲得,rtp proxy分配自己的乙個空閒的位址和埠,並和這個call保持對映關係。並為分配給呼叫雙方的位址和埠進行繫結,這樣,呼叫雙方的rtp連線位址都是rtp proxy,由rtp proxy經過中轉,發至真正的目的地。
假設,有兩個sip client要進行通訊,ada和bob,他們分別位於自己的nat server後面:
其中兩台nat server都是symmetric cone方式。
其信令流程如下:
1. ada發起信令,invite bob。
ip packet ip address:
from: 192.168.1.10:5060
to: 128.97.41.56:5060 (sip alg)
sip msg ip address:
from: 192.168.1.10:5060
to: 128.97.41.56:5060
sdp body ip address for rtp:
192.168.1.10:10024
2. 經過nat server,nat將其私有位址轉換成公網位址,並繫結,由於是採用symmetric cone方式,所以還繫結目的的ip位址。
|<->
ip packet ip address:
from: 128.96.41.1:5678
to: 128.97.41.56:5060 (sip alg)
sip msg ip address:
from: 192.168.1.10:5060
to: 128.97.41.56:5060
sdp body ip address for rtp:
192.168.1.10:10024
3. sip alg接受到該invite,發現其包的ip位址和sip ip位址不同,就判斷其是經過nat,於是就將其相關的sip ip位址修改。
並檢查它的body中是否是包含sdp資訊,如果是,且有rtp位址,sip alg就會去向rtp proxy請求乙個公網rtp位址來代替原有的rtp位址。
ip packet ip address:
from: 128.97.41.56:5060
to: 128.96.63.25:5566
sip msg ip address:
from: 128.96.41.1:5678
to: 128.96.63.25:5566(下一跳的位址)
sdp body ip address for rtp:
128.97.44.5:3000
4. 因為bob不斷的向sip alg傳送註冊包,所以,它的nat server始終為它保留著這麼個繫結,|<->。所以,由sip alg發出的invite,bob能收到。
bob返回200 ok,包含sdp資訊。
ip packet ip address:
from: 10.0.0.12:5060
to: 128.97.41.56:5060
sip msg ip address:
from: 10.0.0.12:5060
to: 128.97.41.56:5060(下一跳的位址)
sdp body ip address for rtp:
10.0.0.12:10002
5. nat server將其包的ip位址修改。發往sip alg。
6. sip alg接受到該200 ok,發現其包的ip位址和sip ip位址不同,就判斷其是經過nat,於是就將其相關的sip ip位址修改。
並檢查它的body中是否是包含sdp資訊,如果是,且有rtp位址,sip alg就會去向rtp proxy請求乙個公網rtp位址來代替原有的rtp位址。
ip packet ip address:
from: 128.96.63.25:5566
to: 128.96.41.1:5678
sip msg ip address:
from: 128.96.63.25:5566
to: 128.96.41.1:5678(下一跳的位址)
sdp body ip address for rtp:
128.97.44.5:3002
7. 此時,rtp proxy為這個session保持著這麼個連線繫結
8. ada收到200 ok,它認為對方的rtp位址是128.97.44.5:3002。將與其建立連線。
而bob認為對方的rtp位址是128.97.44.5:3000。將與其建立連線。
9. 當rtp proxy的3002埠收到包,它可以從包位址獲得ada的rtp公網ip。
當rtp proxy的3000埠收到包,它可以從包位址獲得bob的rtp公網ip。
從而,rtp proxy會將3002埠收到的包**到bob的rtp公網ip。
同樣,rtp proxy會將3000埠收到的包**到ada的rtp公網ip。
這樣,乙個通話的連線就成功建立。
sip alg的部署
因為無論如何,都需要所有rtp包經過rtp proxy,所以所有的ms都要有修改sdp的能力,而只有sip alg需要有修改sip訊息的能力。讓使用者配置自己的proxy是什麼,避免公網的sip client也經過sip alg,造成沒必要的消耗。
補充如果sip alg發現invite包的位址和sip位址是一致的話,它將不對這個包進行修改,它認為這個包是來自公網,或者sip client具備了穿越nat的能力。但它會修改其sdp的ip位址。
issue:
1. 如果sdp描述的是單工工作的話,rtp連線無法建立,因為rtp proxy始終無法知道沉默方的rtp公網ip。
2. 每次建立rtp連線,某一方的rtp包可能會丟掉若干個,直到rtp proxy獲知另一方的rtp公網ip。
3. 是否應該強制任何rtp包都要經過rtp proxy,無論它們都是來自公網,可以直接連線。我想是的,因為主叫方是不知道被叫方的網路環境的。
4. 如果多個rtp proxy進行均衡,如何保證為主叫方分配ip的proxy和為被叫方分配ip的proxy是一致的呢?(它們必須是同一臺proxy)
可以增加乙個header,比如rtp proxy,這個header只有sip alg認識。
5. 如果sip訊息加密,就無法修改其sip的ip位址。
SIP概述 SIP學習筆記(一)
sip是乙個應用層控制協議,它能建立 修改和終止多 會話 會議 sip透明的支援名字對映和重定向服務。sip支援建立和終止多 通訊的5個方面 1 使用者位置 確定用於通訊的終端系統 2 使用者可用性 確定被呼叫者參加通訊的意願 3 使用者能力 確定使用的 和 引數 一般結合sdp 4 會話建立 響鈴...
SIP概述 SIP學習筆記(一)
sip是乙個應用層控制協議,它能建立 修改和終止多 會話 會議 sip透明的支援名字對映和重定向服務。sip支援建立和終止多 通訊的5個方面 1 使用者位置 確定用於通訊的終端系統 2 使用者可用性 確定被呼叫者參加通訊的意願 3 使用者能力 確定使用的 和 引數 一般結合sdp 4 會話建立 響鈴...
SIP除錯 使用NGREP進行快速SIP包分析
astercc呼叫中心系統是乙個基於sip通訊的系統,與傳統的 系統相比,語音的傳送基於ip網路,因此學會如何除錯voip通訊是網路管理員們必須掌握的技能之一。這裡我們會逐步介紹一些voip除錯工具,希望能夠幫助大家更好的設計 維護語音通訊和呼叫中心系統。ngrep是網路版的grep,用於從網路中過...