1. 程式人生 > >淺談網路地址轉換(NAT)技術與內網、外網

淺談網路地址轉換(NAT)技術與內網、外網

前言

 我們現在常使用的IP地址是IPv4地址,由四組0-255的十進位制數字組成,中間以小數點分隔。Internet上的每一臺主機或者路由器都至少有一個IP地址。IP地址(IPv4地址,下文IP地址預設指IPv4)的長度是32位,總數為2的32次方,大約43億個。


  43億這個數字是遠遠不夠地球上70億人的上網裝置來分配的。為了快速解決IP地址匱乏的這個問題,NAT技術誕生了。

------------------------------------------------------------------

  NAT(Network Address Translation),中文名喚作網路地址轉換,誕生於IP地址匱乏的時代。

  NAT的基本思想是ISP(Internet服務提供商)為每個家庭或者公司分配一個IP地址,這個IP地址用作Internet流量的傳輸,也就是大家常說的外網IP地址或者公網IP地址。在客戶網路的內部,每臺計算機有唯一一個IP地址,即內網IP地址,這些地址主要用於路由內部流量。當一個數據包離開客戶網路傳送至其他ISP時,需要進行地址轉換,把唯一的內網IP地址轉換成外網的IP地址。

  這種地址轉化使用IP地址的三個範圍,這些地址已被宣告私有化,任何內網中的裝置可以任意使用這些地址,但是在這三個範圍內的IP地址不允許出現在Internet(外網)上,這三個保留的地址範圍是:

    10.0.0.0~10.255.255.255/8

    172.16.0.0~172.31.255.255/12

    192.168.0.0~192.168.255.255/16

  他們分別可以容納16777216、1048576、65536臺主機。一般家裡用無線路由器,就用到了網路地址轉換技術,我們連上wifi後分配的IP地址一般是以172或192為開頭。學校或者大企業裡面的網路可能會用到10開頭的地址範圍。

  NAT將內網外網劃分好之後,是如何使內網的裝置訪問外網的呢?

  如下圖,當計算機A在內網(假設IP為10.0.0.1)想去訪問一個Internet上的網站S(假設IP地址為54.223.189.245)時,A的資料包需要先經過一個NAT盒子

(NAT box),這個盒子先將A的IP源地址轉換成外網的真實IP地址(假設IP為121.0.0.2),然後將轉換後的資料包傳送至Internet。


  於是問題來了,當網站S收到這個資料包後,會處理請求,併發送響應的資料包,然而這個資料包的目標地址是121.0.0.2(外網IP),資料包如何返回內網中的A呢?

  這裡要先介紹一下源埠(Source Port)和目標埠(Destination Port)的概念。當一個程序希望與另一個程序建立TCP連線時,它把自己繫結到一個本機尚未被佔用的TCP埠上,這個埠稱為源埠,該TCP連線中所有入境的資料包都要被髮送至這個埠。同時程序還需要提供一個目標埠,指明資料包到達遠端主機後送至哪一個埠處理。每一個出境的TCP資料包都包括一個源埠和目標埠。

  舉例來說,如下圖,網站伺服器S(IP地址為54.223.189.245)的HTTP服務執行在80埠上,公網上的計算機D(IP地址為121.141.56.23)想去訪問網站S,於是把自己繫結到本機的33121埠上,併發送請求的資料包,這個資料包中就包含了計算機D的源埠33121和目標埠80。網站S收到請求後,傳送響應的資料包,這個資料包中包含了伺服器S的源埠80和目標埠3312。


  上面的例子是外網中的一臺計算機訪問一個網站。在內網中計算機發送的資料包同樣存在著源埠和目標埠。NAT盒子做的事情就是對出入境資料包的埠進行修改。

  回到最初舉的例子,假設內網計算機A(IP地址為10.0.0.1)傳送的請求包的源埠是45421,目標埠是80,請求訪問網站伺服器S(IP地址為54.223.189.245)。

  當這個出境資料包經過NAT盒子時,其源地址被修改成公網的真實IP(121.0.0.2),源埠被修改一個索引值(假設為50002),這個索引值指向NAT盒子的地址轉化表中的某一項,這一表項儲存了計算機A的內網源地址和源埠。最後NAT盒子將重新生成的資料包傳送出去。

  當網站S響應的入境資料包到達NAT盒子時,資料包經過處理,目的地址由公網IP(121.0.0.2)還原為計算機A的內網IP(10.0.0.1),目標埠由索引值(50002)還原為計算機A的源埠(45421)。還原後資料包可以正常的在內網路由。

  這個過程基本如下圖所示。


  如此一來,NAT解決了資料包在內網公網之間的地址和埠的轉換問題,暫時緩解了IP地址的短缺,但是它卻有著不少的缺點。

  NAT違背了IP的結構模型(每個IP地址唯一標識世界上的一臺機器),採用NAT後可能有無數臺主機使用10.0.0.1這個IP地址。NAT還打破了Internet的端-端的連線模型。內網中的主機可以通過NAT與一臺公網上的服務建立連線,但是反過來卻不行,公網上的主機無法與某一內網中的主機建立連線。舉個簡單的例子來說,你在內網某臺計算機上搭建了一個網站,在外網是無法訪問的。而且使用NAT後,Internet變得如電路交換網路一樣脆弱。NAT盒子為每個經過它的連線維護必要的資訊(即對映關係),若NAT盒子崩潰,並且所有對映表被摧毀,所有TCP連線將被摧毀。

  目前的IP地址匱乏,歸根結底是IPv4設計者的鍋,NAT只是權宜之策。既然NAT這麼複雜,有人要問了,在IPv6普及後,NAT是否就會被取締了呢?答案是不會的。因為NAT已被廣泛使用,尤其是家庭和小型企業的網路,即使IPv6普及了,NAT在短時間內也很難被取代。

參考資料:《計算機網路》(第5版)