SIP穿越NAT&FireWall解決方案
SIP從私網到公網會遇到什麼樣的問題呢?
1. 包的地址轉換。
2. SIP消息裏面的SIP地址轉換。
3. SIP消息裏面的SDP中的RTP地址轉換。
網絡現存結構複雜,SIP服務提供商並不一定是NETWORK提供商,很難要求客戶只能使用某種方式的NAT&FireWall。如何找出一種可以滿足各種網絡的SIP應用解決方案呢?
NAT和Firewall的基本原理
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 packet的IP地址和端口。也就是上面描述的那種情況。
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)。
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 packet的IP地址和端口。也就是上面描述的那種情況。
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主機,他們可以發起建立連接,併發包進來。
所有NAT和Firewall都是對於TCP/IP層以下進行處理和過濾的,而SIP應用的地址是在應用層。所以必須採用其他的途徑來解決這一問題。
針對不同的NAT類型,可以有不同的解決方案。
1. UPnP
2. External Query
3. STUN
4. ALG
其中前3種都是由SIP Client(包括UA和Proxy)通過某種手段或協議在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要進行通信,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地址。
{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發出的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保持着這麼個連接綁定
{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 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:
所有NAT和Firewall都是對於TCP/IP層以下進行處理和過濾的,而SIP應用的地址是在應用層。所以必須採用其他的途徑來解決這一問題。
針對不同的NAT類型,可以有不同的解決方案。
1. UPnP
2. External Query
3. STUN
4. ALG
其中前3種都是由SIP Client(包括UA和Proxy)通過某種手段或協議在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要進行通信,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地址。
{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始終爲它保留着這麼個綁定,{
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 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地址。
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地址。