stun詳解

STUN是RFC3489規定的一種NAT穿透方式,它採用輔助的方法探測NAT的IP和端口。毫無疑問的,它對穿越早期的NAT起了巨大的作用,並且還將繼續在NAT穿透中佔有一席之地。

 

STUN的探測過程需要有一個公網IP的STUN server,在NAT後面的UAC必須和此server配合,互相之間發送若干個UDP數據包。UDP包中包含有UAC需要了解的信息,比如NAT外網IP,PORT等等。UAC通過是否得到這個UDP包和包中的數據判斷自己的NAT類型。

假設有如下UAC(B),NAT(A),SERVER(C),UAC的IP爲IPB,NAT的IP爲 IPA ,SERVER的 IP爲IPC1 、IPC2。請注意,服務器C有兩個IP,後面你會理解爲什麼需要兩個IP。 

(1)NAT的探測過程
STEP1:B向C的IPC1的port1端口發送一個UDP包。C收到這個包後,會把它收到包的源IP和port寫到UDP包中,然後把此包通過IP1C和port1發還給B。這個IP和port也就是NAT的外網IP和port,也就是說你在STEP1中就得到了NAT的外網IP。

熟悉NAT工作原理的朋友可以知道,C返回給B的這個UDP包B一定收到(如果你不知道,去讀下我的其它文章)。如果在你的應用中,向一個STUN服務器發送數據包後,你沒有收到STUN的任何迴應包,那只有兩種可能:1、STUN服務器不存在,或者你弄錯了port。2、你的NAT設備拒絕一切UDP包從外部向內部通過(不支持cone NAT)。

當B收到此UDP後,把此UDP中的IP和自己的IP做比較,如果是一樣的,就說明自己是在公網,下步NAT將去探測防火牆類型,我不想多說。如果不一樣,說明有NAT的存在,系統進行STEP2的操作。

STEP2:B向C的IPC1發送一個UDP包,請求C通過另外一個IPC2和PORT(不同與SETP1的IP1)向B返回一個UDP數據包(現在知道爲什麼C要有兩個IP了吧,爲了檢測cone NAT的類型)。

我們來分析一下,如果B收到了這個數據包,那說明什麼?說明NAT來着不拒,不對數據包進行任何過濾,這也就是STUN標準中的full cone NAT。遺憾的是,full cone nat太少了,這也意味着你能收到這個數據包的可能性不大。如果沒收到,那麼系統進行STEP3的操作。

STEP3:B向C的IPC2的port2發送一個數據包,C收到數據包後,把它收到包的源IP和port寫到UDP包中,然後通過自己的IPC2和port2把此包發還給B。

和step1一樣,B肯定能收到這個迴應UDP包。此包中的port是我們最關心的數據,下面我們來分析:

如果這個port和step1中的port一樣,那麼可以肯定這個NAT是個CONE NAT,否則是對稱NAT。道理很簡單:根據對稱NAT的規則,當目的地址的IP和port有任何一個改變,那麼NAT都會重新分配一個port使用,而在step3中,和step1對應,我們改變了IP和port。因此,如果是對稱NAT,那這兩個port肯定是不同的。

如果在你的應用中,到此步的時候PORT是不同的,恭喜你,你的STUN已經死了。如果不同,那麼只剩下了restrict cone 和port restrict cone。系統用step4探測是是那一種。

STEP4:B向C的IP2的一個端口PD發送一個數據請求包,要求C用IP2和不同於PD的port返回一個數據包給B。

我們來分析結果:如果B收到了,那也就意味着只要IP相同,即使port不同,NAT也允許UDP包通過。顯然這是restrict cone NAT。如果沒收到,沒別的好說,port restrict  NAT.

(2)SIP怎麼使用STUN

個人認爲這是個很不值得提的問題,不過有許多人問我,還是簡要提一下。其實這是個很簡單的問題,SIP通過STUN得到NAT的外網IP和SIP的信令監聽端口的外網port,替換SIP註冊包中的contact頭中的IP和port,然後註冊。這樣就可以確保當有人呼叫你的的時候註冊服務器能找到你。需要提醒你的是,NAT發現一個連接超過一段時間後沒有活動,它就會關閉這個影射,因此你必須間隔一端時間發送一個數據包出去以keep alive。

另外,當你要和別人建立RTP通訊的時候,不要忘記把你的SDP中的IP和PORT改成公網IP和PORT。

-----------------------------------------------------------------------------------------------------------------------------------------------------------

stun協議的作用

STUN協議的全稱是Simple Traversal of User Datagram Protocol Through Network Address Translators,主要功能是檢測是否位於NAT後面,如果位於NAT後面,經過NAT轉換後的地址和端口是什麼,另外可以檢測NAT的類型。

基本思想

在私網內部安裝一個STUN client,在公網上安裝一個STUN Server,STUN協議定義了一些消息格式,大體上分成Request/Response,client向server發送request,server發送response給client。如何檢測STUN client是否在NAT後面呢?原理很簡單,Server在收到client的UDP包以後,Server將接收到該包的地址和端口利用udp傳回來給client,client把這些地址和端口與本機的ip地址和端口進行比較,如果不同,說明在NAT後面,否則就位於NAT後面。爲了檢測不同類型的NAT,STUN協議定義了一些消息屬性,要求Server有不同的動作,比如發送響應的時候使用不同的IP地址和端口,或者改變端口等等。STUN協議對NAT可能有效,但是對防火牆就無能爲力了,因爲防火牆可能不會打開UDP端口。

NAT分類

STUN協議將NAT粗略分爲4種類型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。舉個實際例子來說明這四種NAT的區別:

A機器在私網(192.168.0.4)

NAT服務器(210.21.12.140)

B機器在公網(210.15.27.166)

C機器在公網(210.15.27.140)

現在,A機器連接過B機器,假設是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)。

同時A從來沒有和C通信過。

則對於不同類型的NAT,有下列不同的結果:

Full Cone NAT:C發數據到210.21.12.140:8000,NAT會將數據包送到A(192.168.0.4:5000)。因爲NAT上已經有了192.168.0.4:5000到210.21.12.140:8000的映射。

Restricted Cone:C無法和A通信,因爲A從來沒有和C通信過,NAT將拒絕C試圖與A連接的動作。但B可以通過210.21.12.140:8000與A的 192.168.0.4:5000通信,且這裏B可以使用任何端口與A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT會送到A的5000端口上。

Port Restricted Cone:C無法與A通信,因爲A從來沒有和C通信過。而B也只能用它的210.15.27.166:2000與A的192.168.0.4:5000通信,因爲A也從來沒有和B的其他端口通信過。該類型NAT是端口受限的。

Symmetric NAT:上面3種類型,統稱爲Cone NAT,有一個共同點:只要是從同一個內部地址和端口出來的包,NAT都將它轉換成同一個外部地址和端口。但是Symmetric有點不同,具體表現在:只要是從同一個內部地址和端口出來,且到同一個外部目標地址和端口,則NAT也都將它轉換成同一個外部地址和端口。但如果從同一個內部地址和端口出來,是到另一個外部目標地址和端口,則NAT將使用不同的映射,轉換成不同的端口(外部地址只有一個,故不變)。而且和Port Restricted Cone一樣,只有曾經收到過內部地址發來包的外部地址,才能通過NAT映射後的地址向該內部地址發包。

現針對Symmetric NAT舉例說明:

A機器連接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)

如果此時A機器(192.168.0.4:5000)還想連接C機器(210.15.27.140:2000),則NAT上產生一個新的映射,對應的轉換可能爲A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8001)-> C(210.15.27.140:2000)。此時,B只能用它的210.15.27.166:2000通過NAT的210.21.12.140: 8000與A的192.168.0.4:5000通信, C也只能用它的210.15.27.140:2000通過NAT的210.21.12.140:8001與A的192.168.0.4:5000通信,而 B或者C的其他端口則均不能和A的192.168.0.4:5000通信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章