Mediaproxy:
Mediaproxy是Opensips的一個子產品,它用來實作現有大多數sip用戶端的自動NAT穿透。這就意味着,當使用mediaproxy子產品時,不需要對NAT盒子進行任何配置就能使位于NAT之後的用戶端正常工作。
工作原理:
此解決方案就是在兩個sip使用者代理之間放置一個媒體中繼,并修改他們的sdp消息,使每個參與方都與中繼互動,而對他們自身來說 就像直接與對端互動一樣。
Mediaproxy由兩部分組成:
(1)Opensip的mediaproxy子產品
(2)外部應用程式MediaProxy,它使用一個配置設定器(dispatcher)和多級分布媒體中繼。
Meidaproxy的配置設定器與opensips運作在同一台機器上,他的主要作用就是呼叫選擇媒體中繼。媒體中繼可以與配置設定器運作在同一台機器上,也可以運作在多台遠端主機上,他的主要作用就是在通話雙方之間轉發媒體流。為了能夠在兩個使用者代理之間起到中繼的作用,運作子產品/代理伺服器的計算機必須擁有一個公共的ip位址。
Rtpproxy:
This module is used by OpenSIPS to communicate with RTPProxy, a media relay proxy used to make the communication between user agents behind NAT possible.
處理兩個位于nat之後的用戶端進行媒體轉發
This module is also used along with RTPProxy to record media streams between user agents or to play media to either UAc orUAs.
MediaProxy is a media relay for RTP/RTCP and UDP streams that works in tandem with OpenSIPS to provide NAT traversal capability for media streams from SIP user agents located behind NAT. MediaProxy supports ICE negotiation by behaving like a TURN relay candidate and the policy can be controlled from OpenSIPS configuration.
rtp傳輸:當使用stun能夠穿透nat,擷取對方的ip位址後,可以直接進行端對端的傳輸。面對對稱型nat,stun不能穿透的情況下,可以使用turn進行穿透,即通過mediaproxy進行轉發。
---------------------------------------------------------
關于nat的一些東西
NAT的作用
NAT 不僅實作位址轉換,同時還起到防火牆的作用,隐藏内部網絡的拓撲結構,保護内部主機。 NAT 不僅完美地解決了 lP 位址不足的問題,而且還能夠有效地避免來自網絡外部的攻擊,隐藏并保護網絡内部的計算機。 這樣對于外部主機來說,内部主機是不可見的。但是,對于P2P 應用來說,卻要求能夠建立端到端的連接配接,是以如何穿透NAT 也是P2P 技術中的一個關鍵。
由于nat的透明性,是以clienta-1和clientb-1不用關心和server通信的過程,他們隻需知道server開放服務的位址和端口即可。
使用udp穿透nat
通常情況下,當程序使用udp和外部主機通信時,NAT會建立一個session,這個session能夠保留多久并沒有标準,或許幾秒,幾分鐘,幾小時。假設Clienta-1在應用程式中看到了Clientb-1線上,并且想和Clientb-1通信,一種辦法是server作為中間人,負責轉發Clienta-1和Clientb-1之間的消息,但是這樣伺服器太累。另一種方法就是讓Clienta-1和Clinetb-1建立端到端的連接配接,然後他們自己通信。這也就是p2p連接配接。
(1 )全錐NAT ,穿透全錐型NAT 很容易,根本稱不上穿透,因為全錐型NAT 将内部主機的映射到确定的位址,不會阻止從外部發送的連接配接請求,是以可以不用任何輔助手段就可以建立連接配接。
(2 )限制性錐NAT 和端口限制性錐NAT (簡稱限制性NAT ),穿透限制性錐NAT 會丢棄它未知的源位址發向内部主機的資料包。是以如果現在ClientA-1 直接發送UDP 資料包到ClientB-1 ,那麼資料包将會被NAT-B 無情的丢棄。
是以采用下面的方法來建立ClientA-1 和ClientB-1 之間的通信
1 Clienta-1(202.103.142.29:5000)發送資料包到Server,請求和Clientb-1(221.10.145.84:6000)通信。
2 Server将Clienta-1的位址和端口(202.103.142.29:5000)發送給Clientb-1,告訴Clinetb-1,Clineta-1想和他通信。
3 Clinetb-1向Clineta-1(202.103.142.29:5000)發送udp資料包,當然這個包在到達NAT-A的時候,還是會被丢棄,這并不是關鍵,因為發送這個udp包隻是為了讓NAT-B記住這次通信的目的位址,端口号,當下次以這個位址和端口号為源的資料到達的時候就不會被NAT-B丢棄,這樣就在NAT-B上打了一個從Clinetb-1到Clineta-1的洞。
4 為了讓Clineta-1知道什麼時候才可以向Clinetb-1發送資料,是以Clientb-1在向Clienta-1(202.103.142.29:5000)打孔之後還要向Server發送一個消息,告訴Server它已經準備好了。
5 Server發送一個消息給Clineta-1,内容為:Clinetb-1已經準備好了,你可以向Clientb-1發送消息了。
6 Clienta-1向Clientb-1發送udp資料包,這個資料包不會被NAT-B丢棄,以後Clinetb-1向Clineta-1發送的資料包也不會被Clienta-1丢棄,因為NAT-A已經知道是Clienta-1首先發起的通信.至此,Clineta-1和Clientb-1就可以通信了。
使用TCP 穿透NAT
使用TCP 協定穿透NAT 的方式和使用UDP 協定穿透NAT 的方式幾乎一樣,沒有什麼本質上的差別,隻是将無連接配接的UDP 變成了面向連接配接的TCP 。值得注意是:
1. ClientB-1 在向ClientA-1 打孔時,發送的SYN 資料包,而且同樣會被NAT-A 丢棄。同時,ClientB-1 需要在原來的socket 上監聽,由于重用socket ,是以需要将socket 屬性設定為SO_REUSEADDR 。
2. ClientA-1 向ClientB-1 發送連接配接請求。同樣,由于ClientB-1 到ClientA-1 方向的孔已經打好,是以連接配接會成功,經過3 次握手後,ClientA-1 到ClientB-1 之間的連接配接就建立起來了。
對稱型NAT的穿透
上面讨論的都是怎樣穿透錐(Cone )NAT ,對稱NAT 和錐NAT 很不一樣。對于 對稱NAT ,當一個私網内主機和外部多個不同主機通信時,對稱NAT 并不會像錐(Cone ,全錐,限制性錐,端口限制性錐)NAT 那樣配置設定同一個端口。而是會建立立一個Session ,重新配置設定一個端口。參考上面穿透限制性錐NAT 的過程,在步驟3 時:ClientB-1 (221.10.145.84: ?)向ClientA-1 打孔的時候,對稱NAT 将給ClientB-1 重新配置設定一個端口号,而這個端口号對于Server 、ClientB-1 、ClientA-1 來說都是未知的。同樣, ClientA-1 根本不會收到這個消息,同時在步驟4 ,ClientB-1 發送給Server 的通知消息中,ClientB-1 的socket 依舊是(221.10.145.84:6000 )。而且,在步驟6 時:ClientA-1 向它所知道但錯誤的ClientB-1 發送資料包時,NAT-1 也會重新給ClientA-1 配置設定端口号。是以,穿透對稱NAT 的機會很小。下面是兩種有可能穿透對稱NAT 的政策。
UDP 端口猜測政策
同時開放TCP 政策非常依賴于猜測對方的下一個端口,而且強烈依賴于發送連接配接請求的時機,而且還有網絡的不确定性,是以能夠建立的機會很小,即使Server 充當同步時鐘的角色。下面是一種通過UDP 穿透的方法,由于UDP 不需要建立連接配接,是以也就不需要考慮“同時開放”的問題。
為了介紹ClientB-1 的詭計,先介紹一下STUN 協定。STUN (Simple Traversal of UDP Through NATs )協定是一個輕量級協定,用來探測被NAT 映射後的位址:端口。STUN 采用C/S 結構,需要探測自己被NAT 轉換後的位址:端口的Client 向Server 發送請求,Server 傳回Client 轉換後的位址:端口。
參考4.2 節中穿透NAT 的步驟2 ,當ClientB-1 收到Server 發送給它的消息後,ClientB-1 即打開3 個socket 。socket-0 向STUN Server 發送請求,收到回複後,假設得知它被轉換後的位址:端口( 221.10.145.84:600 5 ),socket-1 向ClientA-1 發送一個UDP 包,socket-2 再次向另一個STUN Server 發送請求,假設得到它被轉換後的位址:端口( 221.10.145.84:60 20 )。通常,對稱NAT 配置設定端口有兩種政策,一種是按順序增加,一種是随機配置設定。如果這裡對稱NAT 使用順序增加政策,那麼,ClientB-1 将兩次收到的位址:端口發送給Server 後,Server 就可以通知ClientA-1 在這個端口範圍内猜測剛才ClientB-1 發送給它的socket-1 中被NAT 映射後的位址:端口,ClientA-1 很有可能在孔有效期内成功猜測到端口号,進而和ClientB-1 成功通信。