不同種類的NAT,穿透效果的不同[轉]


結論1:只要單側NAT屬於Full Cone NAT,即可實現雙向通信。 
結論2:只要兩側NAT都不屬於Symmetric NAT,也可雙向通信。換種說法,只要兩側NAT都屬於Cone NAT,即可雙向通信
結論3:一側NAT屬於Symmetric NAT,另一側NAT屬於Restricted Cone,也可雙向通信。
結論4,兩個都是Symmetric NAT或者一個是Symmetric NAT、另一個是Port Restricted Cone,則不能雙向通信。

STUNU協議(Rfc3489、詳見http://www.ietf.org/rfc/rfc3489.txt) 提出了4種NAT類型的定義及其分類,並給出了如何檢測
在用的NAT究竟屬於哪種分類的標准。但是,具體到P2P程序如何應用Stun協議及其分類法穿越NAT,則是仁者見仁、智者見智。
(因為STUN協議並沒有給出也沒有必要給出如何穿越NAT的標准) 
在拙作“iptables與stun”一文中,筆者花大幅精力闡述了iptables理論上屬於Symmetric NAT而非Port Restricted Cone。
對此,很多人(包括筆者最初學習Stun協議時)心中都有一個疑惑,即僅就Stun協議本身來說,Port Restricted Cone和
Symmetric NAT的區別似乎不大,雖然兩者的映射機制是有點不同,但他們都具有端口受限的屬性。初看起來,這兩者在
穿越NAT方面的特性也差不多,尤其是對於外部地址欲往NAT內部地址發包的情況。既然如此,又為何有必要把iptables分得
這么清呢,本文順帶解決了讀者在這一方面的疑惑。 
網站http://midcom-p2p.sourceforge.net/給出了P2P程序具體如何穿越NAT的一個思路,並提供了一個P2P協議穿越NAT兼容性的
測試工具natcheck。讓我們仍舊用實例(例1)來說明這一思路吧! 
A機器在私網(192.168.0.4) 
A側NAT服務器(210.21.12.140) 
B機器在另一個私網(192.168.0.5) 
B側NAT服務器(210.15.27.140) 
C機器在公網(210.15.27.166)作為A和B之間的中介 
A機器連接過C機器,假使是 A(192.168.0.4:5000)-> A側NAT(轉換后210.21.12.140:8000)-> C(210.15.27.166:2000) 
B機器也連接過C機器,假使是 B(192.168.0.5:5000)-> B側NAT(轉換后210.15.27.140:8000)-> C(210.15.27.166:2000) 
A機器連接過C機器后,A向C報告了自己的內部地址(192.168.0.4:5000),此時C不僅知道了A的外部地址
(C通過自己看到的210.21.12.140:8000)、也知道了A的內部地址。同理C也知道了B的外部地址(210.15.27.140:8000)和
內部地址(192.168.0.5:5000)。之后,C作為中介,把A的兩個地址告訴了B,同時也把B的兩個地址告訴了A。 
假設A先知道了B的兩個地址,則A從192.168.0.4:5000處同時向B的兩個地址192.168.0.5:5000和210.15.27.140:8000發包
,由於A和B在兩個不同的NAT后面,故從A(192.168.0.4:5000)到B(192.168.0.5:5000)的包肯定不通,現在看
A(192.168.0.4:5000)到B(210.15.27.140:8000)的包,分如下兩種情況: 
1、B側NAT屬於Full Cone NAT 
則無論A側NAT屬於Cone NAT還是Symmetric NAT,包都能順利到達B。如果P2P程序設計得好,使得B主動到A的包也能借用
A主動發起建立的通道的話,則即使A側NAT屬於Symmetric NAT,B發出的包也能順利到達A。 
結論1:只要單側NAT屬於Full Cone NAT,即可實現雙向通信。 

2、B側NAT屬於Restricted Cone或Port Restricted Cone 
則包不能到達B。再細分兩種情況 
(1)、A側NAT屬於Restricted Cone或Port Restricted Cone 
雖然先前那個初始包不曾到達B,但該發包過程已經在A側NAT上留下了足夠的記錄:
A(192.168.0.4:5000)->(210.21.12.140:8000)->B(210.15.27.140:8000)。如果在這個記錄沒有超時之前,
B也重復和A一樣的動作,即向A(210.21.12.140:8000)發包,雖然A側NAT屬於Restricted Cone或Port Restricted Cone,
但先前A側NAT已經認為A已經向B(210.15.27.140:8000)發過包,故B向A(210.21.12.140:8000)發包能夠順利到達A。
同理,此后A到B的包,也能順利到達。 
結論2:只要兩側NAT都不屬於Symmetric NAT,也可雙向通信。換種說法,只要兩側NAT都屬於Cone NAT,即可雙向通信。 

(2)、A側NAT屬於Symmetric NAT 
因為A側NAT屬於Symmetric NAT,且最初A到C發包的過程在A側NAT留下了如下記錄:
A(192.168.0.4:5000)->(210.21.12.140:8000)-> C(210.15.27.166:2000),故A到B發包過程在A側NAT上留下的記錄為:
A(192.168.0.4:5000)->(210.21.12.140:8001)->B(210.15.27.140:8000)(注意,轉換后端口產生了變化)。
而B向A的發包,只能根據C給他的關於A的信息,發往A(210.21.12.140:8000),因為A端口受限,故此路不通。
再來看B側NAT,由於B也向A發過了包,且B側NAT屬於Restricted Cone或Port Restricted Cone,故在B側NAT上留下的記錄為:
B(192.168.0.5:5000)->(210.15.27.140:8000)->A(210.21.12.140:8000),此后,如果A還繼續向B發包的話
(因為同一目標,故仍然使用前面的映射),如果B側NAT屬於Restricted Cone,則從A(210.21.12.140:8001)來的包能夠順利到達B;
如果B側NAT屬於Port Restricted Cone,則包永遠無法到達B。 
結論3:一側NAT屬於Symmetric NAT,另一側NAT屬於Restricted Cone,也可雙向通信。 

顯然,還可得出另一個不幸的結論4,兩個都是Symmetric NAT或者一個是Symmetric NAT、另一個是Port Restricted Cone,
則不能雙向通信。 
上面的例子雖然只是分析了最初發包是從A到B的情況,但是,鑒於兩者的對稱性,並且如果P2P程序設計得足夠科學,
則前面得出的幾條結論都是沒有方向性,雙向都適用的。 
通過上述分析,我們得知,在穿越NAT方面,Symmetric NAT和Port Restricted Cone是有本質區別的,盡管他們表面上看起來相似。
我們上面得出了四條結論,而natcheck網站則把他歸結為一條:只要兩側NAT都屬於Cone NAT
(含Full Cone、Restricted Cone和Port Restricted Cone三者),即可雙向通信。
而且natcheck網站還建議盡量使用Port Restricted Cone,以充分利用其端口受限的屬性確保安全性。




It is assumed that the reader is familiar with NATs. It has been
observed that NAT treatment of UDP varies among implementations. The
four treatments observed in implementations are:

Full Cone: A full cone NAT is one where all requests from the
same internal IP address and port are mapped to the same external
IP address and port. Furthermore, any external host can send a
packet to the internal host, by sending a packet to the mapped
external address.

Restricted Cone: A restricted cone NAT is one where all requests
from the same internal IP address and port are mapped to the same
external IP address and port. Unlike a full cone NAT, an external
host (with IP address X) can send a packet to the internal host
only if the internal host had previously sent a packet to IP
address X.

Port Restricted Cone: A port restricted cone NAT is like a
restricted cone NAT, but the restriction includes port numbers.
Specifically, an external host can send a packet, with source IP
address X and source port P, to the internal host only if the
internal host had previously sent a packet to IP address X and
port P.

Symmetric: A symmetric NAT is one where all requests from the
same internal IP address and port, to a specific destination IP
address and port, are mapped to the same external IP address and
port. If the same host sends a packet with the same source
address and port, but to a different destination, a different
mapping is used. Furthermore, only the external host that
receives a packet can send a UDP packet back to the internal host.

Determining the type of NAT is important in many cases. Depending on
what the application wants to do, it may need to take the particular
behavior into account.

NAT的區別

本文假定讀者對NAT很熟悉。目前已知各種NAT實現對UDP的處理是有差異的,共有四種不同的處理方式:

FULL CONE方式:所有從同一個內部IP地址和端口的請求都被映射到同一個外部IP地址和端口上。而且,任何外部主機可以通過向被映射到的外部地址發送數據包(packet)的方式向此內部主機發送數據包。

Restricted Cone方式:所有從同一個內部IP地址和端口的請求都被映射到同一個外部IP地址和端口上。與FULL CONE方式不同的是,一個外部主機(IP地址為X)僅能向先前已經向IP地址X發送了數據包的內部地址發送數據包。

Port Restricted Cone方式:此方式類似Restricted Cone方式,但限制范圍還包括了端口號。
即是,一個外部主機僅能向先前已經向IP地址X的端口P發送了數據包的內部主機發送指定源IP為X和源端口為P的數據包。

Symmetric方式:所有從同一個內部IP地址和端口到指定目標IP和端口的請求都被映射到同一個外部IP地址和端口上。同一個主機使用相同的源IP地址和端口但發送到不同目標的話,將使用不同的映射。而且,只有接收方外部主機才能發送UDP數據包到內部主機。

確定NAT的類型在很多情況下是十分重要的。需要根據應用程序所要達到的效果選擇特定的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM