P2P網路「自由」穿越NAT的「秘密」原理

2022-05-03 21:48:10 字數 2589 閱讀 3921

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分配的繫結位址。

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連線

P2P網路「自由」穿越NAT的「秘密」

穿越nat的意義 nat是為了節省ip位址而設計的,但它隱藏了內網機器的位址,意外 起到了安全的作用。對外不可見,不透明的內部網路也與網際網路的 公平 應用,相互共享 的思想所不容,尤其是p2p網路中 相互服務 的宗旨,所以穿越nat,讓眾多內部網路的機器也參與到p2p網路中的大集體中來,一直是p2...

P2P網路「自由」穿越NAT的「秘密」

p2p 網路 自由 穿越nat 的 秘密 jack zhai 穿越nat的意義 nat是為了節省ip位址而設計的,但它隱藏了內網機器的位址,意外 起到了安全的作用。對外不可見,不透明的內部網路也與網際網路的 公平 應用,相互共享 的思想所不容,尤其是p2p網路中 相互服務 的宗旨,所以穿越nat,讓...

P2P網路中UDP穿越NAT的原理

p2p網路中,udp穿越nat方式主要有 中轉方式 relay 反向連線 connection reversal udp打洞 udp hole punching 中轉方式是最簡單也是比較可靠的nat穿越方法,它將p2p通訊簡單地轉換為客戶端 伺服器通訊模式。假如有a和b兩個客戶端和乙個公共伺服器s,...