Tcp and Udp NAT 穿越穿透打洞

2021-06-18 11:36:17 字數 1599 閱讀 3024

所用屬於和代號。

a : 私網中的主機,設私網ip為192.168.1.2

b : 另一私網中的主機,設私網ip為192.168.245.10

s : 公網中的主機,在此做中間伺服器,設ip為223.11.11.11

nat: net address transmission,在此可以理解為路由器

nat-a:a所在的私網路由器,假設公網ip為188.11.11.11

nat-b:b所在的私網路由器,假設公網ip為199.11.11.11

打洞需要突破幾個關鍵的壁壘,

1. a,b互相無法知道對方公網ip,a,b也不知道自己公網ip。

解決辦法:借助公網伺服器s牽線搭橋。

2. nat會阻擋不明**的資訊貨連線。就是說,即使a知道b的公網位址(包括ip和埠)也無法給b連線請求或資訊,因為nat-b會阻擋不明**的    資訊或連線,此舉是nat過去阻擋syn攻擊的有效手段。

a-->nat-a-->nat-b-->b就會被nat-b放行。於是連線成功。

3. 還有很多nat不支援hairpin,即不支援曲線路由,即假設c,d處於同一內網的主機,那麼他們不可通過nat通訊。即:    c-->(nat-c-->nat-d)--d是不行的。所以這種情況只能直接用私網位址通訊c--->d。

假設a(192.168.1.2::1000)第一次經由nat-a時隱射到位址(188.11.11.11::1111)到達s,那麼以後從a(192.168.1.2::1000)出來的資訊或連線都會到nat-a (188.11.11.11::1111)後,再到公網。也就是說,(188.11.11.11::1111)總是a(192.168.1.2::1000)的公網位址,這一對映會在nat-a上保留一段時間(大於20秒),這使得穿越成為可能,不管是tcp還是udp,原理一樣。

udp穿越步驟:

3) s將a的公網位址和私網位址告訴b, 將b的公網位址和私網位址告訴a

4) a,b分別向對方的公網和私網位址傳送資訊,並等待接受對方發過來的資訊。最早返回回來的資訊的源位址,將被採納為對方的有效位址,不管是公網的還是私網的位址,此後就直接與這一有效位址通訊。需要說明的是:假設a先於b發出了第乙個訊息,那麼a的第乙個訊息會被nat-b阻擋而失敗,這一發出的訊息會在nat-a上留下印記,標明b的公網位址為可信的,然後b的任何訊息就可以順利到達a,同時b第一訊息會在nat-b上留下印記,標明a為可信位址,此後a的訊息就可以到達b。

這樣,ab就可以正常通訊。即使ab除以同一私網。

tcp穿越步驟:

原理基本和udp穿越類似,不同的是tcp在使用私網ip發起連線(connect and recv)的同時,要在此私網位址上啟動偵聽:listen and accept. 但是自xp service pack 2之後的windows系統和所有unix或linux系統的 socket都有屬性so_reuseaddr,這就可以實現。對於不支援socketso_reuseaddr屬性的系統,可以採用順序連線來打洞的方式。即a與s連線通訊之後,斷開連線,然後嘗試與b連線,失敗後listen and accpetb的連線。

希望是對你有意義的一段文字。

這裡有demo**,可看看是怎麼實現的。

**演示了udp打洞技術的實現;

Tcp and Udp NAT 穿越穿透打洞

所用屬於和代號。a 私網中的主機,設私網ip為192.168.1.2 b 另一私網中的主機,設私網ip為192.168.245.10 s 公網中的主機,在此做中間伺服器,設ip為223.11.11.11 nat net address transmission,在此可以理解為路由器 nat a a所...

bit 穿越沙漠

參考 無上陽光13的部落格 穿越沙漠 acm.bit.edu.cn 1005 智力題 時間限制 1秒 記憶體限制 64m problem description 一輛吉普車來到 x 公里寬的沙漠邊沿 a 點,吉普車的耗油量為 1 公升 公里,油量為 500 公升。通常,吉普車必須用自身油箱中的油在沙...

穿越人海2

沒什麼好在乎的,走自己原本走得路。面對過去,面對極差的結果。不要再悲觀 不要再往壞處想,也不要再糊塗 做事要講究方法。以現在的觀點對待現在。以現在的態度面對現在。放得開,又有什麼大不了。不懂,又有什麼大不了。一切又有什麼大不了。保持理智。好好考慮別人的需求。好好做好自己。放得開,有智慧型樂的來。有智...