1. 程式人生 > >SIP穿越NAT&FireWall解決方案

SIP穿越NAT&FireWall解決方案

SIP從私網到公網會遇到什麼樣的問題呢?

包的地址轉換。

SIP訊息裡面的SIP地址轉換。

SIP訊息裡面的SDP中的RTP地址轉換。

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

NATFirewall的基本原理

首先,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}通訊。

PartialRestricted 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的基本策略:

lFirewall會判斷所有的包是來自內部(Inside)還是外部(Outside)

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

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

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

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

所有NATFirewall都是對於TCP/IP層以下進行處理和過濾的,而SIP應用的地址是在應用層。所以必須採用其他的途徑來解決這一問題。

針對不同的NAT型別,可以有不同的解決方案。

lUPnP

lExternal Query

lSTUN

lALG

其中前3種都是由SIP Client(包括UAProxy)通過某種手段或協議在INVITE之前獲取自己的公網地址和埠。需要SIP Client提供額外支援,並且也不適應所有的NAT方式。

ALG(Application Layer Gateway)適應所有NAT方式,並不需要SIP Client做任何額外的支援。它對Application層的SIP信令進行處理和修改,從而做到透明轉換地址。

下面針對一個案例詳細描述ALG的解決方案。

ALG修改SIP訊息裡面的SIP地址和埠和SDP訊息裡面的RTP地址和埠,其中RTP地址和埠要向RTP Proxy請求獲得,RTP Proxy分配自己的一個空閒的地址和埠,並和這個Call保持對映關係。併為分配給呼叫雙方的地址和埠進行繫結,這樣,呼叫雙方的RTP連線地址都是RTP Proxy,由RTP Proxy經過中轉,發至真正的目的地。

假設,有兩個SIP Client要進行通訊,AdaBob,他們分別位於自己的Nat Server後面:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

其中兩臺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

這樣,一個通話的連線就成功建立。

因為無論如何,都需要所有RTP包經過RTP Proxy,所以所有的MS都要有修改SDP的能力,而只有SIP ALG需要有修改SIP訊息的能力。讓使用者配置自己的Proxy是什麼,避免公網的SIP Client也經過SIP ALG,造成沒必要的消耗。

補充

如果SIP ALG發現INVITE包的地址和SIP地址是一致的話,它將不對這個包進行修改,它認為這個包是來自公網,或者SIP Client具備了穿越NAT的能力。但它會修改其SDPIP地址。

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地址。

參考

“SIP, NAT, and Firewalls”, Fredrik Thernelius, May 2000

“Cisco - VoIP Traversal of NAT and Firewall”, Cisco Systems, Inc.

(Noiile)

 

相關推薦

SIP穿越NAT&FireWall解決方案

SIP從私網到公網會遇到什麼樣的問題呢? 包的地址轉換。 SIP訊息裡面的SIP地址轉換。 SIP訊息裡面的SDP中的RTP地址轉換。  <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:

[轉]SIP穿越NAT&FireWall解決方案

SIP從私網到公網會遇到什麼樣的問題呢? 1. 包的地址轉換。 2. SIP訊息裡面的SIP地址轉換。 3. SIP訊息裡面的SDP中的RTP地址轉換。 網路現存結構複雜,SIP服務提供商並不一定是NETWORK提供商,很難要求客戶只能使用某種方式的NAT&

SIP穿越NAT SIP穿越防火墻-SBC

和源 消息 alt spl sim 連接建立 穿透 creat nec FireWall&NAT FireWall是一種被動網絡安全防衛技術,位於網絡的邊界。在兩個網絡之間運行訪問控制策略。防止外部網絡對內部信息資源的非法訪問,也能夠阻止特定

SIP穿越NAT的rport機制

具體的RFC文件參見RFC3581。 RPORT機制: 客戶端需要在top most via上帶上rport引數服務端發現via中有rport引數時,將此via中加入received引數和rport引數,引數帶的值分別是服務端看到的訊息來源地址和埠(如果有NAT等地址轉換裝置,則即為轉換後的IP和p

NAT穿透解決方案介紹

原文連結:http://www.cnblogs.com/javaminer/p/3575282.html 最近公司要實現在各種網路環境下面的多屏互動(機頂盒、android phone、iphone及PC端)的需求;由於IP地址資源有限的原因,目前我們使用的各種終端裝置

針對VMware虛擬機NAT無法使用解決方案——橋接的力量!

bit 找到 abi -1 技術 這就是 win 不能上網 需要 由於校園網的識別共享機制會誤將虛擬機的NAT搭建方式識別為共享方式。在這裏我需要解釋一下NAT和橋接之間的差別: NAT在進行網絡連接的時候,會將宿主機當做一個路由器使用,這樣做的好處是可以將私有ip地址轉換

CentOS7 NAT模式下systemctl restart network 出錯的解決方案

今天在重新安裝CentOS7之後,重啟網路後報錯 [[email protected] ~]# systemctl status network ● network.service - LSB: Bring up/down networking    Loaded

vmware中NAT配置不能上網的一個解決方案

其實只需開啟VMWARE中的Edit->Virtual Network Editor,點選左下角的restore default,重置下vmware的網路設定即可。 先說我遇到的導致vmware中nat情況不能上網的情景(vmware 9): 1.當主機斷網再重新

Linux系統下NAT模式連不上網解決方案

NAT連不上網解決如下; 上面這一步可做可不做,無所謂,這一步只不過是又生成一個網路連線而已! 接下來點選編輯,然後選擇虛擬機器編輯 然後開啟計算機的控制面板,找到網路和internet點進去,然後在點選網路和共享中心 雙擊點進去,然後點選屬性 然後重新開啟虛擬機器,

NAT模式下宿主機與虛擬機器ping不通的解決方案

    為了方便,一般情況下我們都會遠端連線來操作虛擬機器,但是一般我們設定好虛擬機器的模式NAT模式後,虛擬機器和宿主機之間是互相ping不通的。    因此導致我們無法遠端連線,            其實非常簡單,少說廢話,直接上圖:                  

NAT的完全分析及其UDP穿透的完全解決方案

NAT的完全分析及其UDP穿透的完全解決方案 一:基本術語 防火牆 防火牆限制了私網與公網的通訊,它主要是將(防火牆)認為未經授權的的包丟棄,防火牆只是檢驗包的資料,並不修改資料包中的IP地址和TCP/UDP埠資訊。 網路地址轉換(NAT) 當有資料包通過時,網路地址轉換

端口占用解決方案大全,最方便快速的解除端口被占用,強制解除占用端口

強制解除端口占用 切換mysql windows 綠色環境搭建 解除端口占用 強制解除端口占用可以使用我最新開發的新版本PHPWAMP8.8.8.8(截止目前最新版)PHPWAMP最新版支持自定義Mysql版本和自定義PHP版本,是目前唯一集成了VC運行庫的真正純綠色軟件。最新版PHPWA

VS 解決方案文件結構分析

nbsp 項目文件 需要 管理器 TTT lease new projects build VS2013 解決方案文件結構分析 Visual Studio 的解決方案文件是一個文本文件,其中的內容不是太復雜,有些時候 Visual Studio 會把這個文件搞亂,理解一下

Ultimus BPM 市場營銷費用解決方案

市場營銷費用 工作流 BPM 流程管理 采購管理流程 Ultimus BPM 市場營銷費用解決方案 解決方案簡介 實現營銷費用閉環管理、建立以促銷活動為主線的費用預算、費用申請、費用變更、費用督導、費用核銷、費用分析為核心的營銷費用控制

JAVA開發中文亂碼的幾個解決方案

ont character delete bsp mage gbk net utf-8 type 一:html亂碼或者引入的JS亂碼 1:第一步,text file encoding 首先確保文件的保存格式要UTF-8,如在eclipse中,要在文件上點屬性,確保這裏選擇U

U盤安裝CentOS7的最終解決方案

u盤安裝 發現 clas usb 設置 電腦 安裝 軟件 哪裏 U盤安裝CentOS7的最終解決方案 終於將CentOS7裝上筆記本了,過程無比艱辛,因為我發現網上大家提到的所有U盤安裝CentOS7時碰到的問題幾乎都被我碰到了,像什麽: 1.刻錄鏡像的時候只能刻

ASP.NET Zero--解決方案結構(層)

ges 檢測 lan auto git png 其他 nan repos 解決方案結構(層) 創建和下載項目後,您將具有如下所示的解決方案結構: 解決方案有8個項目: Core項目包含域層類(如 實體 和 域服務)。 Application項目包含應用

Android studio 代碼突然報錯解決方案

cache dst roi image 技術分享 users 方案 file sdn 1.點擊File->Invalidate Caches / Restart... 2.重啟Gradle,清除緩存 3.Clean Project 4.關閉Android Stud

C#進階系列——WebApi 異常處理解決方案(轉)

機制 輸出 ges 如果 但是 rom lba slist 解決 出處:http://www.cnblogs.com/landeanfen/p/5363846.html 閱讀目錄 一、使用異常篩選器捕獲所有異常 二、HttpResponseException自

ubuntu MySQL數據庫輸入中文亂碼 解決方案

title str itl alt 查詢 ref cte class nbsp 一、登錄MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,顯示如下:+--------------------------+--------------