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類型定義
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類型檢測
?
第一步:檢測客戶端是否有能力進行UDP通信以及客戶端是否位于NAT后?
?
?
第二步:檢測客戶端NAT是否是Full Cone NAT?
?
第三步:檢測客戶端NAT是否是Symmetric NAT?
?
用同樣的方法用一個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-P2P的打洞通信,具體怎么通信一般要借助于Rendezvous Server。另外對于Symmetric NAT不是說完全不能進行UDP-P2P達洞通信,可以進行端口預測打洞,不過不能保證成功。