SIP穿越NAT FireWall解決方案

2021-06-03 05:29:28 字數 4775 閱讀 3318

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,用於從網路中過...