UDP打洞NAT大致分為下面四類 P2P


NAT大致分為下面四類
1) Full Cone
這種NAT內部的機器A連接過外網機器C后,NAT會打開一個端口.然后外網的任何發到這個打開的端口的UDP數據報都可以到達A.不管是不是C發過來的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

2) Restricted Cone
這種NAT內部的機器A連接過外網的機器C后,NAT打開一個端口.然后C可以用任何端口和A通信.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何從C發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

3) Port Restricted Cone
這種NAT內部的機器A連接過外網的機器C后,NAT打開一個端口.然后C可以用原來的端口和A通信.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)
以上三種NAT通稱Cone NAT.我們只能用這種NAT進行UDP打洞.

4) Symmetic
對于這種NAT.連接不同的外部目標.原來NAT打開的端口會變化.而Cone NAT不會.雖然可以用端口猜測.但是成功的概率很小.因此放棄這種NAT的UDP打洞.

我們看看不同NAT之間的NAT打洞。NAT打洞需要Server配合,需要2種Server:
1. 類似WebRTC中的信令服務器,作用是幫助客戶機溝通IP和PORT信息;
2. STUN Server,用來讓客戶機判斷自己所在的NAT環境。
現在假設客戶端和Server的通訊都沒問題,客戶端知道自己所處環境,并且將自己的信息通過服務器發送給了另一方客戶端,它們可能的打洞情況如下:
1. Full Cone NAT 與 Full Cone NAT:通訊很容易,各自通過STUN Server獲取外部IP和Port后,通過信令服務器通知另一方,即可通訊。
2. Full Cone NAT 與 Restricted Cone NAT或Port Restricted Cone NAT在互相告知IP和Port后,如果由Full Cone NAT端先發送數據包,會失敗,必須由Restricted Cone NAT或Port Restricted Cone NAT端先發送數據包給Full Cone NAT,之后雙方即可互相通訊。
3. Full Cone NAT 與 Symmetric NAT通訊時,必須先由Symmetric NAT端發送數據包給Full Cone NAT端,Full Cone NAT端通過發來的數據包獲得目標的新端口號,之后通過這個新端口號完成互相通訊。
4. Restricted Cone NAT 與 Restricted Cone NAT、Restricted Cone NAT 與 Port Restricted Cone NAT、Port Restricted Cone NAT 與 Port Restricted Cone NAT之間通訊時,先發送數據包的一方會失敗,之后另一方發送數據包成功后,可互相通訊。
5. Restricted Cone NAT 與 Symmetric NAT通訊時,先由Restricted Cone NAT發送數據包給Symmetric NAT,發送數據會失敗,只是為了下次能接收從Symmetric NAT端發送過來的數據包。然后由Symmetric NAT發送數據包到Restricted Cone NAT端,Restricted Cone NAT端會收到數據包,并且將新的端口號記下,使用新的端口號可與Symmetric NAT端通訊。
6. Port Restricted Cone NAT 與 Symmetric NAT通訊時,由于Port Restricted Cone NAT會對IP:PORT對進行限制,所以當Symmetric NAT端使用新PORT發來數據包時,Port Restricted Cone NAT端收不到,它們之間無法通訊。
7. Symmetric NAT 與 Symmetric NAT也無法通訊 。

NAT類型定義
1. Full Cone NAT
:所有來自同一 個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,而不管這些請求是不是屬于同一個應用或者是多個應用的。除此之外,當X-Y的轉換關系建立之后,任意外部主機均可隨時將Y中的地址和端口作為目標地址 和目標端口,向內部主機發送UDP報文,由于對外部請求的來源無任何限制,因此這種方式雖然足夠簡單,但卻不那么安全

2. Restricted Cone NAT
: 它是Full Cone的受限版本:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,這與Full Cone相同,但不同的是,只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z)后,外部主機才能以Y中的信息作為目標地址和目標端口,向內部 主機發送UDP請求報文,這意味著,NAT設備只向內轉發(目標地址/端口轉換)那些來自于當前已知的外部主機的UDP報文,從而保障了外部請求來源的安 全性

3. Port Restricted Cone NAT
:它是Restricted Cone NAT的進一步受限版。只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z且端口為P)之后,外部主機才能以Y中的信息作為目標地址和目標端 口,向內部主機發送UDP報文,同時,其請求報文的源端口必須為P,這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性

4. Symmetric NAT
:這是一種比所有Cone NAT都要更為靈活的轉換方式:在Cone NAT中,內部主機的內部Tuple與外部Tuple的轉換映射關系是獨立于內部主機所發出的UDP報文中的目標地址及端口的,即與目標Tuple無關; 在Symmetric NAT中,目標Tuple則成為了NAT設備建立轉換關系的一個重要考量:只有來自于同一個內部Tuple 、且針對同一目標Tuple的請求才被NAT轉換至同一個外部Tuple,否則的話,NAT將為之分配一個新的外部Tuple;打個比方,當內部主機以相 同的內部Tuple對2個不同的目標Tuple發送UDP報文時,此時NAT將會為內部主機分配兩個不同的外部Tuple,并且建立起兩個不同的內、外部 Tuple轉換關系。與此同時,只有接收到了內部主機所發送的數據包的外部主機才能向內部主機返回UDP報文,這里對外部返回報文來源的限制是與Port Restricted Cone一致的。不難看出,如果說Full Cone是要求最寬松NAT UDP轉換方式,那么,Symmetric NAT則是要求最嚴格的NAT方式,其不僅體現在轉換關系的建立上,而且還體現在對外部報文來源的限制方面。

?

NAT類型檢測

????前提條件:有一個公網的Server并且綁定了兩個公網IP(IP-1,IP-2)。這個Server做UDP監聽(IP-1,Port-1),(IP-2,Port-2)并根據客戶端的要求進行應答。

第一步:檢測客戶端是否有能力進行UDP通信以及客戶端是否位于NAT后?

????客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port, 客戶端發送請求后立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重復這個過程若干次。如果每次都超時,無法接受到服務器的回應,則說明客戶端無法進行UDP通信,可能是防火墻或NAT阻止UDP通信,這樣的客戶端也就 不能P2P了(檢測停止)。?
????當客戶端能夠接收到服務器的回應時,需要把服務器返回的客戶端(IP,Port)和這個客戶端socket的 (LocalIP,LocalPort)比較。如果完全相同則客戶端不在NAT后,這樣的客戶端具有公網IP可以直接監聽UDP端口接收數據進行通信(檢 測停止)。否則客戶端在NAT后要做進一步的NAT類型檢測(繼續)。

第二步:檢測客戶端NAT是否是Full Cone NAT?

????客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用另一對(IP-2,Port-2)響應客戶端的請求往回 發一個數據包,客戶端發送請求后立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重復這個過程若干次。如果每次都超時,無法接受到服務器的回應,則說明客戶端的NAT不是一個Full Cone NAT,具體類型有待下一步檢測(繼續)。如果能夠接受到服務器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT,這樣的客戶端能夠進行UDP-P2P通信(檢測停止)。

第三步:檢測客戶端NAT是否是Symmetric NAT?

????客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port, 客戶端發送請求后立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重復這個過程直到收到回應(一定能夠收到,因為第一步保證了這個客戶端可以進行UDP通信)。?
用同樣的方法用一個socket向服務器的(IP-2,Port-2)發送數據包要求服務器返回客戶端的IP和Port。?
比 較上面兩個過程從服務器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端為Symmetric NAT,這樣的客戶端無法進行UDP-P2P通信(檢測停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續)。

第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?

????客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用IP-1和一個不同于Port-1的端口發送一個UDP 數據包響應客戶端, 客戶端發送請求后立即開始接受數據包,要設定socket Timeout(300ms),防止無限堵塞. 重復這個過程若干次。如果每次都超時,無法接受到服務器的回應,則說明客戶端是一個Port Restricted Cone NAT,如果能夠收到服務器的響應則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進行UDP-P2P通信。

:以上檢測過程中只說明了可否進行UDP-P2P的打洞通信,具體怎么通信一般要借助于Rendezvous Server。另外對于Symmetric NAT不是說完全不能進行UDP-P2P達洞通信,可以進行端口預測打洞,不過不能保證成功。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387765.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讓內核突破512字節的限制

轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/10124237.html

高頻算法面試題(字符串) 242. 有效的字母異位詞

leetcode 242. 有效的字母異位詞 給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是否是 s 的一個字母異位詞。示例 1: 輸入: s "anagram", t "nagaram" 輸出: true 復制代碼示例 2: 輸入: s "rat", t "car" 輸出: fals…

struts2的漏洞

文章前半部分來自團隊小伙伴阿德馬的總結,后半部分的Poc和Exp是小編匆忙之際借鑒而來,感謝寫Poc和Exp的伙伴~ 安恒給官方上報的,然后官方選擇了1個對國內來說比較敏感的時期發了公告出來,好蛋疼。 該漏洞的CVE編號是CVE-2017-56…

Java Statement PK PrepareStatement

PreparedStatement是用來執行SQL查詢語句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三種方式來執行查詢語句,其中 Statement 用于通用查詢, PreparedStatement 用于執行參數化查詢,而 CallableStat…

mysql在linux 下安裝

安裝環境:系統是 centos6.5 1、下載 下載地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下載版本:我這里選擇的5.6.33,通用版,linux下64位 也可以直接復制64位的下載地址,通過命令下載&a…

Leetcode PHP題解--D47 868. Binary Gap

2019獨角獸企業重金招聘Python工程師標準>>> D47 868. Binary Gap 題目鏈接 868. Binary Gap 題目分析 給定一個數字,計算其二進制表示中,出現的兩個1最大距離。 思路 當然是先轉換成二進制了。再進行遍歷。 當只有一個1時,返回0。…

[洛谷P5048][Ynoi2019模擬賽]Yuno loves sqrt technology III

題目大意:有$n(n\leqslant5\times10^5)$個數,$m(m\leqslant5\times10^5)$個詢問,每個詢問問區間$[l,r]$中眾數的出現次數 題解:分塊,設塊大小為$S$,先可以預處理出兩兩塊之間的眾數出現次數,復雜…

C#接口實現多態

我比較喜歡對感興趣的理論進行反復的理解甚至理解背誦下來,接下來再復習一下什么叫多態(哈哈哈) 多態:在同一粒度視圖下對相同類型的事物不做區別的統一處理 接下來看一下接口和引擎類是如何實現多態的: 一、 1、創建了…

docker 網絡 不好用 docker: Error response from daemon: failed to create endpoint jovial_wing on network b

啟動容器時,有可能會遇到如下問題,比如啟動redis容器: sudo docker run -d -p 6379:6379 --name redis redis:latest Linux代碼docker: Error response from daemon: failed to create endpoint redis on network bridge: iptables failed: …

hadoop-hdfs-存儲模型-架構模型-角色介紹

轉載于:https://www.cnblogs.com/LXL616/p/10803978.html

docker 鏡像 導入導出

很喜歡玩docker,但最新遇到一個問題,公司給的新機器的dns有問題,導致pull不下來鏡像。 沒辦法了,沒有鏡像什么神馬都干不了,又不能花很多時間去搭建私有的鏡像庫,只有另尋辦法了。 廢話少說,經…

使用Nginx+uWSGI部署Django項目

1.linux安裝python3環境 參考鏈接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安裝uwsgi pip3 install uwsgiln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi #建立軟鏈接uwsgi --version #檢查安裝成功 3.基于uwsgidjango項目部署 django項目目…

Nagios使用check_mysql_health插件監控Mysql主機

基本信息 Nagios:Nagios core 4.4.3Nagios Plugins:check_mysql_health 2.2.2Mysql-server: 192.168.0.91db user:db操作流程:下載插件->安裝插件->配置command->添加主機->添加服務安裝插件 下載 wget https://labs.…

lsof使用

簡介 lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等&#xf…

解題:2017清華集訓 無限之環

題面 費用流 把每種水管再拆出來四個方向的接頭,然后根據水管的形狀連出旋轉時的代價。最后黑白染色成二分圖,然后白點對應的接頭向黑點對應的接頭連邊,源點向白點自己連邊,黑點自己向匯點連邊。 怎么連邊?我是大力討論…

Node.js學習之(第二章:exports和module.exports)

前言 Node中,每個模塊都有一個exports接口對象,我們需要把公共的方法或者字符串掛載在這個接口對象中,其他的模塊才可以使用。 Node.js中只有模塊作用域,默認兩個模塊之間的變量,方法互不沖突,互不影響&…

docker命令及掛載

常用命令所有鏡像:docker images當前執行:docker ps提交保存docker容器: docker commit進入到對應服務:docker attach <container id>已經執行帶容器:docker ps -l根據名稱啟動通過8081端口察看docker容器里的8080:docker run -i -t -d -p 8081:8080 -p23:22 ubuntu:ubun…

列表,元組,字典類的常見簡單方法

一.列表&#xff08;list類&#xff09; 1.append&#xff08;&#xff09;&#xff1a;追加一個參數&#xff0c;參數可以為字符串&#xff0c;數字或列表等&#xff0c;將參數視為一個整體 2.clear&#xff08;&#xff09;&#xff1a;直接清空列表里的所有 3.count&#xf…

與圖論的邂逅05:最近公共祖先LCA

什么是LCA&#xff1f; 祖先鏈 對于一棵樹T&#xff0c;若它的根節點是r&#xff0c;對于任意一個樹上的節點x&#xff0c;從r走到x的路徑是唯一的(顯然)&#xff0c;那么這條路徑上的點都是并且只有這些點是x的祖先。這些點組成的鏈(或者說路徑)就是x的祖先鏈。 LCA 根據名字來…

MAC地址進行驗證的方法

需要對對應的MAC地址進行驗證的方法&#xff0c;以為很簡單就能過&#xff0c;鼓搗了半天以后才發現&#xff0c;我的機器是window7&#xff0c;查詢出來是亂碼&#xff0c;居然不給支持。沒辦法在網上繼續找資料。終于找到了&#xff0c;貼上來&#xff0c;以備不時之需。 東西…