SIP NAT/FW
預設字型9pt10pt11pt12pt13pt14pt15pt16pt17pt18pt20pt25pt30pt35pt40pt45pt50pt
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的基本策略:
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(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
T 128.97.41.56:5060 (SIP ALG)
SIP Msg IP Address:
From: 192.168.1.10:5060
T 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
T 128.97.41.56:5060 (SIP ALG)
SIP Msg IP Address:
From: 192.168.1.10:5060
T 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
T 128.96.63.25:5566
SIP Msg IP Address:
From: 128.96.41.1:5678
T 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
T 128.97.41.56:5060
SIP Msg IP Address:
From: 10.0.0.12:5060
T 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
T 128.96.41.1:5678
SIP Msg IP Address:
From: 128.96.63.25:5566
T 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,造成沒必要的消耗。