標籤:style blog http color 使用 os 檔案 資料
http://blog.csdn.net/mazidao2008/article/details/4934257
————————————————————————————————————————————————————
STUN簡介
STUN(Simple Traversal of UDP over NATs,NAT 的UDP簡單穿越)是一種網路通訊協定,它允許位於NAT(或多重NAT)後的用戶端找出自己的公網地址,查出自己位於哪種類型的NAT之後以及NAT為某一個本地連接埠所綁定的Internet端連接埠。這些資訊被用來在兩個同時處於NAT 路由器之後的主機之間建立UDP通訊。該協議由RFC 3489定義。
一旦用戶端得知了Internet端的UDP連接埠,通訊就可以開始了。如果NAT是完全圓錐型的,那麼雙方中的任何一方都可以發起通訊。如果NAT是受限圓錐型或連接埠受限圓錐型,雙方必須一起開始傳輸。
需要注意的是,要使用STUN RFC中描述的技術並不一定需要使用STUN協議——還可以另外設計一個協議並把相同的功能整合到運行該協議的伺服器上。
SIP之類的協議是使用UDP分組在Internet上傳輸音頻和/或視頻資料的。不幸的是,由於通訊的兩個末端往往位於NAT之後,因此用傳統的方法是無法建立串連的。這也就是STUN發揮作用的地方。
STUN是一個客戶機-伺服器協議。一個VoIP電話或軟體包可能會包括一個STUN用戶端。這個用戶端會向STUN伺服器發送請求,之後,伺服器就會向STUN用戶端報告NAT路由器的公網IP地址以及NAT為允許傳入流量傳回內網而開通的連接埠。
以上的響應同時還使得STUN用戶端能夠確定正在使用的NAT類型——因為不同的NAT類型處理傳入的UDP分組的方式是不同的。四種主要類型中有三種是可以使用的:完全圓錐型NAT、受限圓錐型NAT和連接埠受限圓錐型NAT——但大型公司網路中經常採用的對稱型NAT(又稱為雙向NAT)則不能使用。
Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)
STUN,是為了實現透明的穿透NAT,而定義的一套協議。它使本地的內網的機器,具有取得,能夠得知它的NAT Gateway的IP,NAT類型的能力。
為什麼需要STUN:
因為NAT雖然解決了IP地址稀少的問題,但是也帶來了很多的問題。比如所有P2P應用,像檔案SHARE,多媒體,和線上遊戲等等.
要想穿透NAT,首Crowdsourced Security Testing道NAT的一些特性:
NAT分為4種(加上防火牆的話,多幾種情況):
1.完全透明NAT(Full Cone NAT):
從相同內部主機(IN IPX) +連接埠(IN PORTX)發送的資料MAPING為相同的IP(OUT IP X)和連接埠(OUT PORT X)發送帶外網.並且從另一個伺服器(Y),如果直連到MAPING的IP(OUT IP X)和連接埠(OUT PORT X )上,資料將會被轉寄到內部主機上. (IN IPX), (IN PORTX).
也就是說進內部網的資料包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
從相同內部主機(IN IPX) +連接埠(IN PORTX)發送的資料MAPING為相同的IP(X)和連接埠發送帶外網.和完全NAT不同的是,只有當為X時,外部機器的的請求就被轉寄到主機(IN IPX) +連接埠(IN PORTX)。也就是說進內部網的資料包的,SPORT不受限制,SIP受限制,只能為NAT MAP資料的IP
3,連接埠受限NAT(Port Restricted Cone)
和受限NAT不同的是,只有當外部主動請求的的源IP和連接埠,等於內部網發送的請求的目的IP和連接埠。
4.對稱NAT
如果發送的包的目的IP AND PORT,那麼MAPPING IP AND PORT,將相同。內部網同一台機器,同一個連接埠如果目的地址不同,那麼MAPPING的連接埠也不同,所以只有他主動連的伺服器才可能知道他的 MAPPING後連接埠,別的伺服器如果想連他只能靠猜測連接埠。
總結:前面3重NAT,MAPING PORT 和 IP,是根據發送包的的內部網的IP和連接埠決定的。如果資料的內網IP和連接埠相同,那麼MAPPING後的連接埠和地址是固定。這個功能為我們的穿越提供了很好條件。
第4種NAT,打洞後的MAPPING 地址和連接埠將變地不可靠。很難穿越。注意SERVERA,和SERVERB是兩個公網地址,而不是兩台機器.
STUN協議(淺析例子分析)
主要功能是檢測是否位於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通訊。
STUN 的簡單操作過程:
發送請求。請求分為兩種
1.Binding Requests, sent over UDP,
用來發現NAT的公網地址,和MAPPING後的連接埠
2. Binding Response,
伺服器產生Binding Response,並把得到的MAPPINGIP 和連接埠,返回到用戶端, 用戶端比較MAPPING地址是否和本機地址相同,如果是說明是本機也是公網,否則判斷NAT的類型(判斷方法:client uses additional STUN Binding Requests)
3.Binding Error,
4.Shared Secret Requests, sent over TLS [2] over TCP.
這個請求要求伺服器返回一臨時使用者名稱和密碼,用來下一步的Binding Requests/ Response,用來驗證資訊的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
STUN 資訊結構
STUN 由以後資料結構構成:STUN頭+STUN有效載荷
STUN頭結構如下: 儲存的值都是以網路順序存放
欄位 類型
STUN message type Short int 訊息類型
Length Short int 有效載荷長度,不包含頭長度
transaction ID octet[16] 串連的ID值,檢查Request,和Response
STUN的有效載荷
SHUN的有效載荷是一些STUN的屬性構成,屬性的類型由資訊的類型來決定。
STUN的屬性是定義好了的,屬性列表(attribute)如下:
MAPPED-ADDRESS 必選 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS 可選 用在Binding Request,指定Response,發送到哪裡
如果沒有指定,Response發送到MAPING IP 和 PORT
CHANGE-REQUEST 可選 用在Binding Request。用來決定,CLIENT的NAT類型是
制NAT,還是連接埠限制NAT,(命令伺服器從不同的源連接埠/IP,Response請求)
CHANGED-ADDRESS 可選 用在Binding Responses告訴Client改變的連接埠和IP
SOURCE-ADDRESS 必選 只用在Binding Responses,標記資訊的源PORT HE IP
USERNAME 可選 Shared Secret Response/ Binding Requests
PASSWORD, 必選 SharedSecret Response
ESSAGEINTEGRITY 可選 用在Binding Responses, Binding Request記錄資訊的完整性
ERROR-CODE Binding Error Response and Shared Secret Error Response.
UNKNOWN-ATTRIBUTES
REFLECTED-FROM Binding Responses.用於追溯和防止DDOS
穿透的方法和過程