SIP ALG穿透NAT的實現 - Tech黑手- 工作雜記

文章推薦指數: 80 %
投票人數:10人

1 SIP應用穿透NAT面臨的問題1.1 NAT的工作原理 NAT被置於兩網間的邊界。

· 2 SIP ALG的設計思想 由於媒體流端口是在呼叫雙方SIP信令建立連接後動態協商的, ... 2012年9月24日星期一 SIPALG穿透NAT的實現 摘要:為解決SIP應用穿透NAT的問題,剖析了NAT的工作原理,並針對SIP協議信令過程的特點,提出了採用ALG設備解決NAT的穿透問題,具體設計了ALG的結構和相關實現算法,並給出了詳細的實現方案。

關鍵詞:會話發起協議(SIP)網絡地址轉換(NAT)會話描述協議(SDP)信令      會話發起協議SIP [1] (SessionInitiationProtocol)是由IETF組織於1999年提出的在Internet網絡環境中實現實時通信應用的一種信令協議。

SIP引發了現代通信體系結構的變革,然而它卻在視頻能力、會議控制方面沒有一個完善的標準;同時,由於大量企業和駐地網都採用了私有編址[2],並通過網絡地址轉換NAT(NetworkAddressTranslation)來控制與公共網絡的通信,而SIP數據包需通過信令消息中的IP地址和端口號來實現目的地尋址,且它的媒體流端口是動態分配的,這就為在NAT上配置固定的包過濾策略帶來了困難。

因此,SIP穿透NAT是絕大多數VoIP運營商亟待解決的問題。

  當前,幾種主要的NAT穿透技術有SIPALG、FullProxy、MidCom、VPN、隧道穿透、STUN等。

其中,SIPALG方式是在傳統的NAT上進行擴展,使之具備感知SIP呼叫控制協議的能力,從而對基於SIP呼叫的地址實現穿透。

它是一種比較簡單的方案,最突出的特點是ALG和具體的SIP系統無關,對於一個SIP系統不需要做任何修改,只要在響應的NAT上加載SIPALG,就能完成私網到公網甚至私網中的兩個用戶之間的SIP連接。

1SIP應用穿透NAT面臨的問題1.1NAT的工作原理  NAT [3]被置於兩網間的邊界。

NAT技術使得一個私有網絡可以通過Internet註冊IP連接到外部世界。

位於內網和外網中的NAT路由器在發送數據包之前,負責把內部IP翻譯成外部合法地址。

當從外網來的含公網地址信息的數據包到達NAT時,NAT使用預設好的規則(其組元包含源地址、源端口、目的地址、目的端口、協議)來修改數據包,然後再轉發給內網接收點。

NAT的基本工作原理如圖1所示,NAT設備實際上是在維護一個狀態表,該表用於把非法的IP地址映射到合法的IP地址上。

1.2技術難點  與傳統NAT支持HTTP等數據的穿透不同,SIP應用中的語音和視頻數據需通過信令消息中的IP地址和端口號來實現目的地尋址,因此信令消息在地址穿透中不僅需要對TCP/UCP層的端口信息以及IP層的源地址和目的地址進行變換,還需對IP包載荷中的相關地址信息進行變換。

同時,對於SIP應用來說,是在控制信息中動態地協商媒體流端口,信令協議中的IP地址也是私有的,因此要準確把握相關的地址和端口信息,並進行正確的轉換。

這是本文需要解決的首要技術難點。

  其次,SIPALG實現對NAT的穿透會因呼叫方處在內網和外網而不同,因此對進出NAT的SIP消息在解析時要判斷是內網之間的呼叫請求(內部消息)、外網呼叫請求內網(對內消息),還是內網呼叫請求外網(對外消息),以便對該消息進行正確處理。

這也是本文需要解決的技術難點。

2SIPALG的設計思想  由於媒體流端口是在呼叫雙方SIP信令建立連接後動態協商的,因此對SIP消息穿透NAT設備要綜合考慮這兩個方面因素。

2.1SIP信令的穿透原理  SIP信令穿透NAT與HTTP穿透類似,NAT設備只要打開固定的端口,就能保證SIP信令穿透NAT並與外界建立連接。

  本文基於SIP終端設備的特殊性來考慮信令穿透NAT。

SIP終端設備會周期性地發送Register消息[1]到註冊服務器上,由於不斷有信令消息經過NAT設備,致使NAT設備對通過的消息流始終​​保持一個確定的端口;同時,當Register消息經過ALG,ALG就會記錄信令穿透NAT時經NAT轉換後的IP地址和端口等信息,並將此信息與NAT後面的終端用戶ID(如890010098)等信息進行綁定。

這樣,當一個信令到來,ALG將通過NAT上正確的地址和端口發送給被叫方。

2.2媒體流的穿透原理  當信令穿透NAT後,NAT後面的SIP終端就可以收到來自外網的呼叫請求。

這時呼叫方的Invite消息和響應方的200(OK)消息中都攜帶了用於描述與會話相關的信息及與流媒體相關參數的SDP(SessionDescriptionProtocol)消息體[4]。

當該消息通過ALG時,ALG將通過與該媒體流相關的呼叫——會話層消息中的用戶ID(如890010098)識別出NAT上的IP地址和端口並進行相應的轉換,這樣當呼叫方收到200(OK)消息時就能從SDP消息體中獲取該IP地址和端口等信息並發送ACK確認消息,從而完成一個會話的建立。

3SIPALG的實現  利用SIPALG實現對NAT的穿透,主要是對流經ALG的SIP消息進行處理和維護。

按照各部分功能的差異,可以將SIPALG劃分為消息解析模塊、消息修改模塊和消息轉發模塊,SIPALG的整體結構如圖2所示,該圖體現了各功能模塊間的相互關係。

下面以一個典型的兩個不同NAT內的用戶(Joe:[email protected]和Bob:[email protected])通過註冊服務器(SER服務器)完成連接的過程為例,來說明SIPALG的具體實現。

SIPALG解決NAT穿透的示意圖如圖3所示。

3.1前提條件  SIPALG的實現主要是對Request、Response消息進行解析、修改與轉發。

因此在實現ALG前首先要了解SIP請求(Request)的方法(Register、Invite、ACK、Options、Cancel、Bye) [1],SIP回答(Response,包括Trying、Ringing、OK和ACK) [1]以及SIP消息中的相關頭域(Request-URI、Via、From、To、Call-ID、Cseq、Contact等)[1]。

3.2消息解析模塊的實現  消息解析模塊主要對流經ALG的SIP消息進行解析,並判斷該消息是內部消息、對外消息還是對內消息,以便消息修改模塊能對這些消息進行正確的處理。

消息解析模塊的工作流程如圖4所示。

它主要判斷數據包From、To、Via等頭域中的IP地址信息,以準確解析消息類型。

3.3消息修改模塊的實現  由於同一NAT內部的用戶間可以直接通信,因此“內部消息處理”模塊不需要對消息體進行修改。

這樣就把消息修改模塊分為對內消息修改與對外消息修改。

這兩個過程實際上是可逆的。

對內消息修改主要根據地址映射表把外網IP和端口號轉換成內部IP和端口號,以便外部請求能準確到達NAT內側的用戶端;對外消息修改則根據地址映射表把內部IP和端口號轉化成外網可用的IP和端口號,這樣,來自外網的請求就能準確定位到該地址。

但無論哪個模塊,最終結果都是對相應的Request和Response消息中與NAT有關的IP地址和端口號進行修改。

消息修改模塊的處理流程如圖5所示。

對信令消息的修改需要對Invite、ACK、BYE和Register等Request消息和100(Tring)、180(Ringing)以及200(OK)等Response消息中的Via、From、To、Call-ID、Contact等頭域中包含的私有IP地址和端口信息進行修改。

而對SDP消息體的處理是SIPALG實現其功能的關鍵所在,因為SDP消息體的交換是實​​現呼叫雙方媒體流通信的前提和關鍵。

對SIP控制的向內的媒體流轉發,ALG分析向外的Invite和200(OK)消息中的SDP消息體中“MediaDescription”和“ConnectionInformation”行,根據這兩行中的描述地址在NAT上啟用未用端口,完成向內接收媒體流的目的地址翻譯,從而實現媒體流通信的建立。

需要注意的是,在對Response消息進行修改時,還需通過Call-ID匹配呼叫的上下文環境,也要加入Record-Route頭域以告知內網上的SIP終端,本次呼叫中以後所有的SIP消息都要流經該SIPALG,這樣才能保證ALG的正確轉發。

最後,對消息修改完畢後,需要重新計算消息的長度,並保存在Content-Length中。

3.4消息轉發模塊的實現  消息轉發模塊主要是通過控制NAT,對修改後的SIP消息進行轉發,以完成一個會話的建立。

消息轉發模塊在ALG中保留並維護當前呼叫的上下文環境,也就是一個地址映射信息表,如表1所示。

以記錄相關的地址映射信息。

 表1中的數據表示所有目的地址為202.205.11.230、60012的SIP包都會被NAT網關轉發到主機10.10.15.44:5060上處理。

消息修改模塊在做修改前,要首先查詢ALG內記錄的地址映射信息表,如果表內已建立了該用戶的信息,則按此信息對向NAT處的SIP消息做相應修改,否則丟棄該消息。

  為生成相關地址映射信息表,ALG首先需要分析向外的Register消息。

ALG記錄Register中的To和Contact頭域,按它們的值在NAT設備上啟用一個未用的端口,然後ALG記錄生成的映射信息並填入地址映射信息表。

生成地址映射信息表後,消息修改模塊再按映射信息修改向外的Invite和Register等報文,然後再通過消息轉發模塊實現對NAT的穿透。

  本文通過分析NAT的工作原理以及SIP信令與媒體流的特點,詳細講述了SIPALG的具體實現方法。

實驗證明,本文設計的SIPALG能很好地解決NAT穿透問題,且運行穩定,互通性好。

於 9月24,2012 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 沒有留言: 張貼留言 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) log可打timestamp並直接顯示在螢幕的termnal:extraputty  載點:https://sourceforge.net/projects/extraputty/ SMI(MDC/MDIO)介紹Clause22/45 From:http://blog.chinaaet.com/justlxy/p/5100064818SMI:串行管理接口(SerialManagementInterface),通常直接被稱為MDIO接口(ManagementDataInput/OutputI... VXLANvsVLAN from:https://zhuanlan.zhihu.com/p/36165475VXLAN(VirtualeXtensibleLocalAreaNetwork)或許是目前最熱門的網絡虛擬化技術。

網絡虛擬化是指在一套物理網絡設備上虛擬出多個二層網絡。

VXL... 常見以太網接口介紹 from:https://www.wpgdadatong.com/tw/blog/detail?BID=B0594一. PHY包含的各個子層:PCS:編碼和解碼PMA:串行器和反序列化器PMD:取決於物理介質Firgure1: OSI模型裡示意... 搜尋此網誌 網頁 首頁 Profile 髒圳嘎 檢視我的完整簡介 網誌存檔 ►  2022 (3) ►  四月 (2) ►  四月25 (2) ►  二月 (1) ►  二月18 (1) ►  2020 (7) ►  十一月 (2) ►  十一月17 (1) ►  十一月10 (1) ►  九月 (1) ►  九月18 (1) ►  七月 (2) ►  七月16 (1) ►  七月01 (1) ►  六月 (1) ►  六月02 (1) ►  二月 (1) ►  二月20 (1) ►  2019 (1) ►  三月 (1) ►  三月25 (1) ►  2018 (5) ►  十二月 (1) ►  十二月27 (1) ►  九月 (4) ►  九月20 (1) ►  九月18 (2) ►  九月12 (1) ►  2017 (1) ►  五月 (1) ►  五月15 (1) ►  2016 (9) ►  十二月 (1) ►  十二月07 (1) ►  八月 (1) ►  八月29 (1) ►  七月 (1) ►  七月08 (1) ►  六月 (2) ►  六月15 (1) ►  六月13 (1) ►  四月 (2) ►  四月27 (2) ►  二月 (1) ►  二月17 (1) ►  一月 (1) ►  一月12 (1) ►  2015 (6) ►  十一月 (2) ►  十一月25 (1) ►  十一月10 (1) ►  十月 (1) ►  十月27 (1) ►  八月 (1) ►  八月28 (1) ►  五月 (1) ►  五月04 (1) ►  四月 (1) ►  四月21 (1) ►  2014 (21) ►  八月 (3) ►  八月26 (1) ►  八月20 (2) ►  七月 (1) ►  七月31 (1) ►  六月 (4) ►  六月26 (1) ►  六月13 (2) ►  六月09 (1) ►  五月 (3) ►  五月27 (1) ►  五月01 (2) ►  四月 (2) ►  四月08 (1) ►  四月01 (1) ►  三月 (1) ►  三月13 (1) ►  二月 (5) ►  二月26 (2) ►  二月18 (1) ►  二月13 (2) ►  一月 (2) ►  一月24 (1) ►  一月16 (1) ►  2013 (30) ►  十二月 (2) ►  十二月20 (1) ►  十二月10 (1) ►  十一月 (3) ►  十一月22 (2) ►  十一月07 (1) ►  十月 (1) ►  十月14 (1) ►  九月 (2) ►  九月05 (1) ►  九月04 (1) ►  八月 (1) ►  八月06 (1) ►  七月 (2) ►  七月25 (1) ►  七月19 (1) ►  六月 (2) ►  六月21 (1) ►  六月02 (1) ►  五月 (7) ►  五月29 (1) ►  五月22 (1) ►  五月19 (1) ►  五月11 (1) ►  五月08 (1) ►  五月07 (1) ►  五月01 (1) ►  四月 (2) ►  四月24 (1) ►  四月03 (1) ►  三月 (4) ►  三月27 (1) ►  三月21 (1) ►  三月20 (1) ►  三月01 (1) ►  二月 (2) ►  二月20 (2) ►  一月 (2) ►  一月25 (1) ►  一月03 (1) ▼  2012 (82) ►  十二月 (7) ►  十二月28 (1) ►  十二月21 (1) ►  十二月20 (1) ►  十二月14 (2) ►  十二月03 (1) ►  十二月02 (1) ►  十一月 (7) ►  十一月30 (1) ►  十一月14 (2) ►  十一月12 (1) ►  十一月08 (2) ►  十一月05 (1) ►  十月 (7) ►  十月29 (2) ►  十月05 (1) ►  十月04 (2) ►  十月03 (2) ▼  九月 (3) ▼  九月24 (1) SIPALG穿透NAT的實現 ►  九月13 (2) ►  八月 (5) ►  八月29 (1) ►  八月16 (1) ►  八月14 (2) ►  八月07 (1) ►  七月 (4) ►  七月27 (1) ►  七月24 (1) ►  七月13 (1) ►  七月06 (1) ►  六月 (4) ►  六月28 (1) ►  六月25 (2) ►  六月19 (1) ►  五月 (3) ►  五月16 (1) ►  五月10 (1) ►  五月05 (1) ►  四月 (1) ►  四月05 (1) ►  三月 (9) ►  三月22 (2) ►  三月19 (3) ►  三月05 (3) ►  三月01 (1) ►  二月 (20) ►  二月22 (1) ►  二月21 (1) ►  二月16 (1) ►  二月15 (2) ►  二月14 (1) ►  二月09 (2) ►  二月07 (2) ►  二月06 (2) ►  二月03 (2) ►  二月02 (1) ►  二月01 (5) ►  一月 (12) ►  一月30 (7) ►  一月18 (1) ►  一月13 (1) ►  一月12 (1) ►  一月09 (1) ►  一月05 (1) ►  2011 (80) ►  十二月 (12) ►  十二月29 (2) ►  十二月24 (1) ►  十二月20 (1) ►  十二月18 (1) ►  十二月17 (1) ►  十二月14 (2) ►  十二月08 (1) ►  十二月04 (1) ►  十二月03 (2) ►  十一月 (5) ►  十一月14 (2) ►  十一月11 (1) ►  十一月10 (1) ►  十一月03 (1) ►  十月 (8) ►  十月31 (1) ►  十月28 (1) ►  十月21 (2) ►  十月19 (3) ►  十月11 (1) ►  九月 (5) ►  九月26 (1) ►  九月15 (1) ►  九月08 (2) ►  九月05 (1) ►  八月 (7) ►  八月30 (1) ►  八月25 (2) ►  八月17 (1) ►  八月03 (1) ►  八月02 (2) ►  七月 (8) ►  七月27 (1) ►  七月26 (1) ►  七月25 (1) ►  七月22 (1) ►  七月18 (1) ►  七月01 (3) ►  六月 (5) ►  六月21 (1) ►  六月20 (1) ►  六月19 (1) ►  六月17 (1) ►  六月02 (1) ►  五月 (7) ►  五月14 (2) ►  五月11 (1) ►  五月10 (3) ►  五月02 (1) ►  四月 (3) ►  四月17 (1) ►  四月15 (1) ►  四月01 (1) ►  三月 (4) ►  三月26 (1) ►  三月25 (1) ►  三月08 (2) ►  二月 (7) ►  二月25 (1) ►  二月21 (1) ►  二月10 (2) ►  二月09 (1) ►  二月08 (2) ►  一月 (9) ►  一月25 (1) ►  一月20 (1) ►  一月14 (2) ►  一月12 (1) ►  一月04 (3) ►  一月03 (1) ►  2010 (131) ►  十二月 (4) ►  十二月30 (1) ►  十二月29 (1) ►  十二月28 (1) ►  十二月08 (1) ►  十一月 (8) ►  十一月26 (3) ►  十一月25 (1) ►  十一月23 (1) ►  十一月16 (1) ►  十一月11 (1) ►  十一月10 (1) ►  十月 (14) ►  十月28 (1) ►  十月26 (1) ►  十月25 (1) ►  十月22 (2) ►  十月20 (1) ►  十月14 (1) ►  十月13 (1) ►  十月12 (1) ►  十月06 (1) ►  十月05 (2) ►  十月04 (1) ►  十月01 (1) ►  九月 (8) ►  九月27 (4) ►  九月09 (1) ►  九月03 (1) ►  九月02 (2) ►  八月 (18) ►  八月31 (4) ►  八月26 (1) ►  八月24 (1) ►  八月23 (1) ►  八月22 (1) ►  八月21 (1) ►  八月19 (1) ►  八月18 (1) ►  八月17 (2) ►  八月15 (1) ►  八月11 (1) ►  八月09 (1) ►  八月04 (2) ►  七月 (7) ►  七月15 (1) ►  七月14 (2) ►  七月05 (1) ►  七月01 (3) ►  六月 (16) ►  六月30 (2) ►  六月21 (4) ►  六月20 (3) ►  六月18 (1) ►  六月08 (1) ►  六月07 (1) ►  六月04 (1) ►  六月02 (2) ►  六月01 (1) ►  五月 (7) ►  五月20 (2) ►  五月18 (2) ►  五月17 (1) ►  五月14 (1) ►  五月07 (1) ►  四月 (40) ►  四月24 (1) ►  四月23 (1) ►  四月22 (5) ►  四月20 (1) ►  四月17 (1) ►  四月16 (1) ►  四月14 (2) ►  四月13 (2) ►  四月11 (2) ►  四月09 (6) ►  四月08 (5) ►  四月07 (1) ►  四月06 (2) ►  四月05 (6) ►  四月04 (3) ►  四月03 (1) ►  三月 (9) ►  三月31 (1) ►  三月26 (6) ►  三月23 (2) 標籤 Android antivirus asterisk BOOT Brazilfw Car GRUB Linux MBR music other peugeot Resource serverservice theme Tools trick troubleshooting Ubuntu ubunut voip VPN Windows Wireshark 檢舉濫用情形 總網頁瀏覽量 推薦網站 0xlab DD-WRT DataCenterofJeffHsueh Mobile01 OSSF::自由軟體鑄造場 OSSLab::開放軟體實驗室 OpenWrt PCZONE WikiDevi network01 tomato voip-info.org 恩山無線論壇 數位天堂 牛的大腦 酷!學園-Embedded討論版 面向Linux程序員和系統管理員的技術資源 鳥哥的Linux私房菜



請為這篇文章評分?