nat是為了節省ip位址而設計的,但它隱藏了內網機器的位址,「意外」起到了安全的作用,由於客戶端是主動登入p2p網路才可穿越,所以p2p的方式也沒有違背企業的內部管理原則……
穿越nat的意義:
nat是為了節省ip位址而設計的,但它隱藏了內網機器的位址,「意外」起到了安全的作用。對外不可見,不透明的內部網路也與網際網路的「公平」應用,「相互共享」的思想所不容,尤其是p2p網路中「相互服務」的宗旨,所以穿越nat,讓眾多內部網路的機器也參與到p2p網路中的大集體中來,一直是p2p開發者的所希望的。穿越nat需要借助外部的支援,說白了就是「內外勾結」,騙過nat。很多p2p網路成功地實現了這一目標,但還是有一些「遺憾」---並非所有的情況下都可以。由於客戶端是主動登入p2p網路才可穿越,所以p2p的方式也沒有違背企業的內部管理原則,畢竟「自由世界」的加入都是自覺自願的。
nat原理:
nat(network address translation)網路位址轉換/網路位址翻譯。
nat給p2p帶來的問題是:nat只允許單方面發起連線,通訊的雙方不是平等的,p2p網路的基礎有了問題,具體的表現為:
內網主機ip是私有的,外部主機看不到,也無法主動發起連線
即使知道了內網ip,但nat會丟棄沒有在影射表的資料報
內網主機可以作為客戶端訪問外網,但不能作為伺服器提供服務
當兩個主機都位於各自的nat之後,要實現p2p的連線,就不僅是誰主動的問題,而是如何解決在兩個nat上同時有對方對映表項的問題。
stun協議(ietf rfc 3489):
stun協議是一種通道協議,可以作為正式通訊前的通路建立,它採用的是使用者終端干預的一種方法,可以解決應用協議內部傳遞ip位址給nat帶來的麻煩。使用者通過其他方法得到其位址對應在nat出口上的對外位址,然後在報文負載中所描述的位址資訊就直接填寫nat上對外位址,而不是內網的私有ip,這樣報文的內容在經過nat時就按普通的nat流程轉換報文頭部的ip位址即可,負載內的ip位址資訊無需再修改。利用stun的思路可以穿越nat。stun協議是客戶端/伺服器協議,分兩種請求方式:一是udp傳送的繫結請求(binding requests),二是tcp傳送的秘密請求(shared secret requests)。繫結請求用於確定nat分配的繫結位址。
stun標準中,根據內部終端的位址(p:p)到nat出口的公網位址(a:b)的影射方式,把nat分為四種型別:
1. full cone:來自相同的內部位址的請求訊息對映為相同的外部位址,與外部位址(目的位址)無關。對映關係為p:p↔a:b,任何外部主機可通過(a:b)傳送到資料到(p:p)上。
2. restricted cone:來自相同的內部位址的請求訊息對映為相同的外部位址,返回的資料只接受該內部節點曾發資料的那個目的計算機位址x。對映關係為p:p↔a:b↔x,只有來自x的資料報才可通過(a:b)傳送到資料到(p:p)上。
3. port restricted cone:來自相同的內部位址的請求訊息對映為相同的外部位址,返回的資料只接受該內部節點曾發資料的那個目的位址x:x。對映關係為p:p↔a:b↔x:x,只有來自x:x的資料報才可通過(a:b)傳送到資料到(p:p)上。
4. symmetric(對稱) nat:只有來自相同的內部位址(p:p),並且傳送到同乙個位址(x:x) 的請求訊息,才被對映為相同的外部位址(a:b),返回的資料只接受該內部節點曾發資料的那個目的位址x:x。對映關係為p:p↔a:b↔x:x,當(p:p)訪問(y:y)時,對映為p:p↔b:c↔y:y。
p2p利用stun穿越nat:
位於nat後面終端a與b要穿越nat直接通訊,可以借助在公網上的第三者server來幫助。
例項:udp穿越nat:
a登入server,nat a分配埠11000,server得到a的位址為100.10.10.10:11000
b登入server,nat b分配埠22000,server得到b的位址為200.20.20.20:22000
此時b會把直接來自a的包丟棄,所以要在nat b上打乙個方向為a的洞,那麼a就可以向200.20.20.20:22000傳送資料了
打洞的指令來自server。b向a的位址100.10.10.10:11000發乙個udp報文,被nat a丟棄,但在nat b上建立對映記錄,nat b不在丟棄來自a的報文。
server通知a可以通訊,a發起資料udp包給b,nat b放行,b收到a的包,雙方開始通訊
注:若是對稱nat,當b向a打洞的埠要重新分配(nat a不會再分配11000埠),b無法獲取這個埠,所以不適用本方法。
例項:tcp穿越nat:
a登入server,nat a分配埠11000,server得到a的位址為100.10.10.10:11000
b登入server,nat b分配埠22000,server得到b的位址為200.20.20.20:22000
a向b傳送tcp資料報syn:192.168.10.11:1234=>200.20.20.20:22000,在nat a上打洞
b向a傳送tcp資料報syn:192.168.20.22:1234=>100.10.10.10:11000,在nat b上打洞
通道建立,a與b三次握手建立tcp連線
NAT 原理與NAT穿越
最近在看負載均衡方面的東西中很多都提到了nat穿越,特意在此總結一下 先做乙個約定 內網a中有 a1 192.168.30.112 a2 192.168.30.114 兩個使用者 閘道器x1 乙個nat裝置 有公網ip222.225.80.51 內網b中有 b1 192.168.40.112 b2 ...
NAT 原理與NAT穿越
最近在看負載均衡方面的東西中很多都提到了nat穿越,特意在此總結一下 先做乙個約定 內網a中有 a1 192.168.30.112 a2 192.168.30.114 兩個使用者 閘道器x1 乙個nat裝置 有公網ip222.225.80.51 內網b中有 b1 192.168.40.112 b2 ...
NAT穿越(一) NAT型別
nat分為四種型別 1 完全透明nat full cone nat 從內部主機 in ip ipa 埠 in port porta 傳送的資料對映為 ip out ip ipa 和埠 out port porta 傳送到外網 從伺服器直連到對映的 ip out ip ipa 和埠 out port ...