在這條技巧中,我們看到了NAT是如何使一個網(wǎng)絡在為其內(nèi)部主機使用一塊私有網(wǎng)絡地址的同時,還能與整個因特網(wǎng)進行通信的。特別值得一提的是,對只有一個全局可達IP地址的小網(wǎng)絡來說,PAT非常有用。但是,由于PAT修改了輸出分組的源端口號,可能會給那些將與端口號有關的信息放在報文主體中傳輸?shù)姆菢藴蕝f(xié)議帶來一些問題。
在便宜且無處不在的因特網(wǎng)連接出現(xiàn)之前,一個組織為其網(wǎng)絡任意選擇一段IP地址的情形非常普遍。畢竟網(wǎng)絡沒有而且"永遠不會"連接到任何外部網(wǎng)絡上去,因此人們并不認為IP地址的選擇是什么問題。不過,世事難料,現(xiàn)在沒有因特網(wǎng)連接的網(wǎng)絡數(shù)量可能只占一小部分了。
人們不再需要為私有網(wǎng)絡去任選一塊IP地址了。RFC1918[Rekhter et al., 1996]指定了三塊永遠不會被分配的保留IP地址。這三個地址塊是:
10.0.0.0--10.255.255.255 (前綴10/8);
172.16.0.0--172.31.255.255(前綴172.16/12);
192.168.0.0--192.168.255.255(前綴192.168/16)。
網(wǎng)絡使用這三塊地址中的任意一塊時,網(wǎng)絡中的任意一臺主機都可以訪問此網(wǎng)絡中的所有其他主機,而無須擔心與全局分配的IP地址產(chǎn)生沖突。當然,只要與外部網(wǎng)絡沒有連接,分配什么樣的地址都是無所謂的,那就不妨使用上述某個私有地址塊了,這樣還可以預防以后需要連接到其他網(wǎng)絡的情況。
如果網(wǎng)絡真的和外部相連會發(fā)生什么情況呢?使用私有IP地址的主機如何跟因特網(wǎng)或其他外網(wǎng)上的主機進行通信呢?這個問題最常見的答案就是使用NAT(Network Address Translation,網(wǎng)絡地址翻譯)。支持NAT的設備類型包括路由器、防火墻和獨立的NAT產(chǎn)品。NAT負責在私有網(wǎng)絡地址和一個或多個全局分配的IP地址之間進行翻譯。我們來簡要地看看它的工作原理。大部分NAT設備都可以配置為支持以下三種模式。
。1)靜態(tài)--將私有網(wǎng)絡上的部分或所有主機的私有IP地址都映射為一個固定的、全局分配的地址。
。2)地址池--NAT設備有一組全局分配的IP地址可用,它會將其中之一動態(tài)地分配給需要與外部網(wǎng)絡中的對等實體進行通信的主機。
(3)PAT--也稱為PAT(Port Address Translation,端口地址轉(zhuǎn)換),只有一個全局分配地址時可以使用這種方法,比如圖2-12所示的情況。使用PAT時,所有私有地址都映射為同樣的外部地址,但輸出分組的源端口會被修改成唯一的值,通過它可以將輸入分組與私有網(wǎng)絡地址相關聯(lián)。
圖2-12顯示了一個帶有三臺主機的小型網(wǎng)絡,此網(wǎng)絡使用的是10/8地址塊。還有一臺標識為NAT的路由器,它擁有一個私有網(wǎng)絡地址和一個因特網(wǎng)地址。
這里只顯示了一個與NAT相關的全局地址,因此我們假設在后繼討論中,配置為使用PAT方式。靜態(tài)NAT和地址池情況與此類似,但更復雜一些,因為它們除了管理外部端口之外,還要管理外部地址。
假設主機H2要向204.71.200.69,www.yahoo.com的Web服務器之一,發(fā)送一個TCP SYN段,以便打開一個連接。在圖2-13A中可以看到這個段離開H2時目的地址為204.71.200.69.80,源地址為10.0.0.2.9600。
圖2-12 帶有NAT路由器的私有網(wǎng)絡 |
這里使用的是標準記法,IP地址以A.B.C.D.P的形式書寫,其中A.B.C.D是IP地址,P是端口號。
這里除了源地址是個私有網(wǎng)絡地址之外,沒什么特別的。這個段抵達路由器時,NAT必須將其源地址轉(zhuǎn)換成205.184.151.171,這樣Yahoo的Web服務器才會知道應該把它的SYN/ACK和其他應答送到哪里去。所有來自或發(fā)往私有網(wǎng)絡中其他主機的因特網(wǎng)流量也都會將其地址轉(zhuǎn)換成205.184.151.171,所以NAT也必須將源端口轉(zhuǎn)換成一個唯一的端口號,這樣它才能將那條連接上的輸入流量發(fā)送給正確的主機。我們看到,源端口9600被映射成了5555。因此傳送給Yahoo的段,目的地址為204.71.200.69.80,源地址為205.184.151.171.5555。
如圖2-13B所示,Yahoo的應答到達路由器時,會被發(fā)送給205.184.151.171.5555。NAT在其內(nèi)部狀態(tài)表中查找這個端口,并發(fā)現(xiàn)端口5555與地址10.0.0.2.9600相關,因此,會將應答從路由器傳送給H2,其源地址為204.71.200.69.80,目的地址為10.0.0.2.9600。
圖2-13 端口地址轉(zhuǎn)換 |
盡管從前面的討論來看PAT好像簡單易懂,但有很多細節(jié)問題使它比看起來要復雜一些。比如,修改源地址和端口號會改變IP的首部校驗和以及TCP段的校驗和,因此這些值都要進行調(diào)整。
FTP(File Transfer Protocol,文件傳輸協(xié)議)[Reynolds and Postel, 1985]是另外一個可以說明其復雜性的例子。一個FTP客戶端要向FTP服務器發(fā)送文件,或接收來自FTP服務器的文件時,會向服務器發(fā)送一條PORT命令,命令中包含了它監(jiān)聽服務器(數(shù)據(jù))連接的地址和端口號。這就意味著,首先,NAT要能夠識別出這個TCP段是一條FTP PORT命令,而且必須對地址和端口進行轉(zhuǎn)換。而且,PORT命令中的地址和端口號是作為ASCII字符串傳送的,對它們的修改可能會改變段的長度。這又意味著序列號(參見技巧1)的改變,NAT還要記錄這種變化,以便對ACK中的序列號進行調(diào)整,而且來自私有網(wǎng)絡主機的后續(xù)段也要依次對其序列號進行調(diào)整。
除了這些難點之外,NAT工作得很好,并被廣泛應用。尤其是在只有一條因特網(wǎng)連接可用時,用PAT將一個小網(wǎng)絡連接到因特網(wǎng)上去是種很自然的方式。