SIP穿越NAT&FireWall解決方案

SIP穿越NAT&FireWall解決方案
 
SIP從私網到公網會遇到什麼樣的問題呢?

1. 包的地址轉換。
2. SIP
消息裏面的SIP地址轉換。
3. SIP
消息裏面的SDP中的RTP地址轉換。

網絡現存結構複雜,SIP服務提供商並不一定是NETWORK提供商,很難要求客戶只能使用某種方式的NAT&FireWall。如何找出一種可以滿足各種網絡的SIP應用解決方案呢?

NAT
Firewall的基本原理

首先,NAT的幾種方式:
Full Cone
:當一臺私網內的主機向公網發一個包,其本地地址和端口是{A:B}NAT會將其私有地址{A:B}轉換成公網地址{X:Y}並綁定。任何包都可以通過地址{X:Y}送到該主機的{A:B}地址上,NAT會將任何發送到{X:Y}incoming包的地址{X:Y}轉換成{A:B}

Partial/Restricted Cone
:當一臺私網內的主機向公網發一個包,其本地地址和斷口是{A:B}NAT會將其私有地址{A:B}轉換成公網地址{X:Y}並綁定。任何包都可以通過地址{X:Y}送到該主機的{A:B}地址上,但是,NAT只爲第一個發往{X:Y}的包綁定成{A:B}|{X:Y}<->{C:D},其中{C:D}是那個包的源地址和端口。也就是說,只有來自{C:D}的包才能於主機{A:B}通信。
Partial
Restricted Cone的區別是Partial只綁定incoming packet IP地址,而Restricted Cone會綁定incoming packetIP地址和端口。也就是上面描述的那種情況。

Symmetric Cone
:當一臺私網內的主機向公網某臺主機發送一個包,{A:B}à{C:D}NAT會將其地址{A:B}轉換成{X:Y},併爲其綁定成{A:B}|{X:Y}<->{C:D}NAT只接受來自{C:D}incoming packet,將它轉給{A:B}。也就是說,如果私網內的主機要向外面發送一個包,它必須要知道對方的公網IP和端口。但如果對方也是處於一個私網內,它就很難獲知對方的公網IP和端口。
由此可見,Symmetric Cone條件最嚴格,Partial/Restricted Cone次之,Full Cone條件最不嚴格。

下面再看看Firewall的基本策略:
Firewall
會判斷所有的包是來自內部(Inside)還是外部(Outside)

一般,允許所有來自inside的包發出去。

一般,允許來自Outside的包發進來,但這個連接必須是由Inside發起的。

一般,禁止所有連接由Outside發起的包發進來。

一般,firewall會允許幾個信任的outside主機,他們可以發起建立連接,併發包進來。

    
所有NATFirewall都是對於TCP/IP層以下進行處理和過濾的,而SIP應用的地址是在應用層。所以必須採用其他的途徑來解決這一問題。
針對不同的NAT類型,可以有不同的解決方案。
1. UPnP
2. External Query
3. STUN
4. ALG

   
其中前3種都是由SIP Client(包括UAProxy)通過某種手段或協議在INVITE之前獲取自己的公網地址和端口。需要SIP Client提供額外支持,並且也不適應所有的NAT方式。
    ALG(Application Layer Gateway)
適應所有NAT方式,並不需要SIP Client做任何額外的支持。它對Application層的SIP信令進行處理和修改,從而做到透明轉換地址。
下面針對一個案例詳細描述ALG的解決方案。

SIP ALG解決方案
    ALG
修改SIP消息裏面的SIP地址和端口和SDP消息裏面的RTP地址和端口,其中RTP地址和端口要向RTP Proxy請求獲得,RTP Proxy分配自己的一個空閒的地址和端口,並和這個Call保持映射關係。併爲分配給呼叫雙方的地址和端口進行綁定,這樣,呼叫雙方的RTP連接地址都是RTP Proxy,RTP Proxy經過中轉,發至真正的目的地。假設,有兩個SIP Client要進行通信,AdaBob,他們分別位於自己的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 ServerNAT將其私有地址轉換成公網地址,並綁定,由於是採用Symmetric Cone方式,所以還綁定目的的IP地址。
{192.168.1.10:5060}|{128.96.41.1:5678}<->{128.97.41.56:5060}
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始終爲它保留着這麼個綁定,{10.0.0.12:5060}|{128.96.63.25:5566}<->{128.97.41.56:5060}。所以,由SIP ALG發出的INVITEBob能收到。
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保持着這麼個連接綁定
{128.97.44.5:3000|128.97.44.5:3002}

8.         Ada
收到200 OK,它認爲對方的RTP地址是128.97.44.5:3002。將與其建立連接。
Bob認爲對方的RTP地址是128.97.44.5:3000。將與其建立連接。

9.        
RTP Proxy3002端口收到包,它可以從包地址獲得AdaRTP公網IP
RTP Proxy3000端口收到包,它可以從包地址獲得BobRTP公網IP
從而,RTP Proxy會將3002端口收到的包轉發到BobRTP公網IP
同樣,RTP Proxy會將3000端口收到的包轉發到AdaRTP公網IP

這樣,一個通話的連接就成功建立。
    SIP ALG
的部署因爲無論如何,都需要所有RTP包經過RTP Proxy,所以所有的MS都要有修改SDP的能力,而只有SIP ALG需要有修改SIP消息的能力。讓用戶配置自己的Proxy是什麼,避免公網的SIP Client也經過SIP ALG,造成沒必要的消耗。
補充如果SIP ALG發現INVITE包的地址和SIP地址是一致的話,它將不對這個包進行修改,它認爲這個包是來自公網,或者SIP Client具備了穿越NAT的能力。但它會修改其SDPIP地址。
ISSUE:

1.       如果SDP描述的是單工工作的話,RTP連接無法建立,因爲RTP proxy始終無法知道沉默方的RTP公網IP
2.      
每次建立RTP連接,某一方的RTP包可能會丟掉若干個,直到RTP proxy獲知另一方的RTP公網IP
3.      
是否應該強制任何RTP包都要經過RTP Proxy,無論它們都是來自公網,可以直接連接。我想是的,因爲主叫方是不知道被叫方的網絡環境的。
4.      
如果多個RTP Proxy進行均衡,如何保證爲主叫方分配IPProxy和爲被叫方分配IPProxy是一致的呢?(它們必須是同一臺Proxy
可以增加一個header,比如RTP proxy,這個header只有SIP ALG認識。
5.      
如果SIP消息加密,就無法修改其SIPIP地址。

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章