當前位置:首頁 » 操作系統 » nat穿透源碼

nat穿透源碼

發布時間: 2022-07-21 02:34:51

『壹』 TCP穿透NAT

談談我的理解:
首先,tcp不同於udp,tcp天生就是不對等的連接,因此穿透nat就顯得很困難。
最為簡單的一種方式:
客戶端:a,b
伺服器端(公網)c
a發送消息給c,同時c拿到a的ip埠等信息,將a提出的請求轉發給已與c連接的b,b表示同意後發送消息給c,c將消息反饋給a,同時為a和b的通信做准備(分配埠等等),整個過程是客戶端到伺服器再到客戶端,c起中轉作用,a與b建立連接實際是a與c,b與c建立的連接。
一般對於可靠性要求較低的應用會使用udp實現。
優點:適用於所有類型網路,簡單;
缺點:佔用帶寬,速度慢。
早期的msn就是這種方式。
第二種方式:TCP的p2p技術。
這種方式是目前最熱門的,我也正在看。
轉一下來自cmu(卡耐基梅隆)牛人們的研究:
××××××××××××××××
原文:http://www.andrew.cmu.e/user/ggw/WBFD.pdf

由於工作需要,在網上找了很長時間P2P的資料,好像只有《P2P 之 UDP穿透NAT的原理與實現(附源代碼)》比較有實際意義,可惜又是用UDP實現的,無奈只好找了份英文資料啃,發現很有參考價值,就根據理解翻譯了一部分,分享給大家,由於水平有限,有錯望多多包涵。如果有人能夠繼續翻譯下去別忘了通知我哦呵呵,[email protected],感謝。

摘要
防火牆和網路地址轉換(NAT)設備對於傳統的P2P協議存在一定的問題。一些中間設備抑制了來自外部網路到內部網路的TCP請求,這篇文章的目的就是尋找一個能夠在兩個NAT設備內部的主機間建立TCP連接的方法。我們已經在兩個普通的硬體條件下實現了這個功能。

1.入門
由於32位IP地址的減少,現在出現了很多通過一個internet地址代理內部網路上網的設備,這就是NAT技術。這些設備對於INTERNET已經越來越重要了,但是它們的獨立發展因為缺乏標准而對現在的internet協議造成危害。

2.技術
典型的NAT和防火牆設備都是不允許外部地址主動請求而進入內部網路的,如果用戶的程序需要在兩個內部網路間建立直接性的連接,那麼兩個內部設備之間必須是相互信任的。如果A和B兩個部分都初始化了TCP連接,NAT設備就會認為它們之間是相互信任的,也就允許它們之間的連接了。
圖1是一個例子,目標是能夠讓A和B(分別在NATA和NATB後)建立TCP連接。
我們討論了多種在特定的NAT設備環境下的TCP連接方案。
如果我們的情況如下:
1、可預測NA的埠,可預測NB的埠,可指定源IP的特定路由
2、可預測NA的埠,可預測NB的埠,不可指定源IP的特定路由
3、隨機的NA埠,可預測NB的埠,可指定源IP的特定路由
4、隨機的NA埠,可預測NB的埠,不可指定源IP的特定路由
5、隨機的NA埠,隨機的NB埠,可指定源IP的特定路由
6、隨機的NA埠,隨機的NB埠,不可指定源IP的特定路由

我們必須作出這4種假設:
1、 兩個主機都不受NAT設備所限制;
2、 我們可以配置網路設備使得主機看不到來自外部網路的ICMP包(TTL超過限制),因為這些ICMP數據包無論被任何一方接收到都是中斷TCP連接。我們討論的一些解決方案就依賴通過發送一個初始TTL很小的SYN包來建立TCP連接。一旦SYN包被路由器丟棄,ICMP TTL 超時包就會被傳送到NAT設備,我們不允許NAT設備將這個超時TTL的返回包傳送到內部網路,即使NAT會將這個包傳送到內部,也需要通過配置防火牆來限制這個包到達主機;
3、 即使NAT設備看到ICMP超時的數據包,設備本身的映射表將不會作任何改動;
4、 內部網路的其它主機不會佔用搶占這個埠,因為如果網路特別繁忙,這個埠可能會無效。

3.1第一種情況
我們可以通過圖2表示的順序解決問題:
1)A和B可以設定LSR(IP報頭中的一個選項)通過X路由發送SYN數據包.
2)X可以緩存它們的數據包並且發送欺騙的SYN+ACKS給NA和NB.
3)A和B可以通過由X發送來的數據進行應答.
4)X丟棄這兩個ACK包,因為它已經可以確定A和B相互應答成功.

圖2是假設A和B都事先彼此的NAT的通信埠,A知道B的通信埠是NB:5000,B知道A的是NA:4000,並且要求X不在任何NAT設備的後面.實際中這兩個埠是預測得到的,預測過程如圖3:

3.2第二種情況
第一種情況依賴與自由設定路由,但是現在很多路由器大多都限制這樣做,並且會丟棄這樣的服務請求包。因此在實際應用中,這種方案失敗的可能性很大。如果自由設定路由不可行,我們可以通過out-of-band通道(他們預先與X連接好的TCP連接)來傳送原本必須將數據包路由到X才能看到的包。注意在圖二的第二步X已經知道了TCP的序號Q和P,因為X已經收到了這兩個SYN包,但是如果數據包沒有路由經過X就不可能收到它們。為了初始化這個連接,兩個主機發送初始SYN包,並且他們都知道是不可能到達目標的,但是它們都可以記住自己的SYN號(個人看法,通過鉤子獲得發送的數據SYN包)並且可以發送給X,X得到了它們的SYN包,就可以欺騙它們發送ACK包了。有兩種方法可以發送無法到達目標的數據包。簡單的方法就是每個主機發送一個SYN給對方,要求應答包不會到達內部網路.如果NAT(防火牆)會將應答包傳回給內部網路,通常是發送TCP的reset包(RST),如果NAT生成RST包,A和B就不能簡單地發送一個向圖2中SYN給彼此,因為如果這樣NA和NB就無法打洞了呵呵,如果NAT不發送RST包,那麼這個TCP連接就不會被中斷。另外一個發送無法到達目標網路的SYN包的方法是減小TTL值,使它們無法彼此到達。如果用戶無法配置防火牆丟棄這個ICMP應答包,或者NAT不繼續傳送這個ICMP,這個TCP就不會立即關閉。這個解決方案不能使用一種簡單的欺騙,因為我們必須保證源地址的SYN包發送者不會沒有收到ICMP的RST包,否則會導致中間設備建立錯誤路由.僅僅依靠SYN包,NAT就可以建立從internet IP和埠到外部IP和埠的路由.由於欺騙的SYN包是錯誤的源IP(並非發出者X),這個路由將不會發送到X而是發送到NA或者NB。另外,這種方案都需要設置TTL到足夠小,以便於對方的NAT不會收到到各自發出的初始SYN包,否則就無法完成打洞。(圖4)

3.3第三種情況
比前兩種簡單,但是X將無法預見NA或者NB的埠。B將先給X發送一個SYN包告訴以便於X知道它所選用的埠號,然後X將這個信息發送到A,A就可以向這個確定的地址和埠發送SYN,圖5是第一種情況的變形::
1)X向圖3一樣預測埠,但是它不能預測到NA的下一個埠號,但是可以預測NB的下一個埠號是5000,並且可以通知A和B這個節點已經建立了連接;
2)A和B同步節點X;
3)X可以欺騙A和B;
4)A和B相互發送ACK;
5)X丟棄發給它的ACK,因為它已經可以確認它們已經建立連接。

××××××××××××××××
第三種:實現vpn,通過安全的虛擬連接實現,而這樣的話就不存在穿透問題,因為vpn是個虛擬網路,tcp在其中是被信任的。

『貳』 java如何實現穿透nat

java使不能實現的,這是網管的問題,要想使外網訪問內網,必須使你們的主機與你們要訪問的機子建立埠上的映射關系。
比如建立ftp伺服器,讓外網訪問。必須把內網被訪問的機器與主機的21埠綁定。當外網訪問你們主機的時間,主機就自動指向你的內網機器。
訪問主機:http://192.168.1.1(假如主機是);盡行路由設置,即網上說的nat設置,單價左邊菜單「nat」,在右邊會看到虛擬服務配置,名稱隨便填,填寫要開放的機器的ip地址,選擇下面的協議為「ftp」;埠自動填好了,最後單擊添加就填好了。

加入你們的主機ip是「202.102.224.13」外部訪問時就在瀏覽器輸入:
"ftp://202.102.224.13";就搞定了;
被訪問及其必須建立ftp伺服器,具體建立伺服器,可以下載軟體,比如「server-u」,設置根據提示看就好了。
主機ip可以在主機的「系統信息」裡面的默認網關看到;主機登錄賬號密碼一般是「guest」;

祝你好運!呵呵!
加油!

『叄』 廣域網實現p2p文件傳輸 如何實現nat穿透 求java或C++源代碼

假設有兩台分別處於各自的私有網路中的主機:A和B;N1和N2是兩個NAT設備;S是一個使用了一個眾所周知的、從全球任何地方都能訪問得到的IP地址的公共伺服器
步驟一:A和B分別和S建立UDP連接;NAT設備N1和N2創建UDP轉換狀態並分配臨時的外部埠號
步驟二:S將這些埠號傳回A和B
步驟三:A和B通過轉換好的埠直接聯繫到對方的NAT設備;NAT設備則利用先前創建的轉換狀態將分組發往A和B

源碼已發送請查收

『肆』 廣域網實現p2p文件傳輸 如何實現nat穿透 求C#或C++源代碼 郵箱:[email protected]

下載租李葉的OURMSG去研究吧

『伍』 誰能給我一個能夠穿透內網的vb遠程式控制制源碼。或者說說思路也行!

nat穿透

『陸』 C# TCP 打洞/穿透NAT

這個很簡單啊...沒有外網IP沒關系.如果你是通過路由上網.在路由上做個埠印射,你的機器就能當外網IP伺服器用了.

打洞通常是UDP協議.TCP協議的打洞還真沒試過.

補充:你是沒伺服器,還是沒伺服器端代碼~~

『柒』 NAT C#,要用C#寫的、UDP穿越NAT的源碼、源碼

UDP穿越NAT的話,需要對端配合的,否則沒辦法穿越,只能對方先在子網後面對公網地址發起UDP呼叫,公網計算機才能在一定時間里回應,回應的UDP包可以穿越nat到達源機器。

如果兩邊都在子網後面,那就需要作一個狀態伺服器,維護兩方的NAT映射信息。

很簡單。我從前做過實驗。

你要是已經懂了原理,怎麼會做不出程序?

熱點內容
nss存儲 發布:2025-01-20 21:04:47 瀏覽:35
下載了怎麼解壓 發布:2025-01-20 20:55:22 瀏覽:180
c語言第八章答案 發布:2025-01-20 20:55:17 瀏覽:697
安卓主題壁紙怎麼換回來 發布:2025-01-20 20:54:03 瀏覽:627
免費雲存儲排行榜 發布:2025-01-20 20:48:39 瀏覽:232
訪問農信 發布:2025-01-20 20:47:06 瀏覽:3
用什麼循環編譯時間短 發布:2025-01-20 20:46:55 瀏覽:688
醫院his源碼 發布:2025-01-20 20:43:06 瀏覽:984
資料庫結構原理 發布:2025-01-20 20:35:39 瀏覽:10
mysql主從搭建伺服器配置 發布:2025-01-20 20:33:06 瀏覽:12