1. 程式人生 > >網路地址轉換NAT原理及應用【轉】

網路地址轉換NAT原理及應用【轉】

 

(轉自:https://blog.csdn.net/xiaofei0859/article/details/6630467

這是做路由器的時候,學習網路地址轉換Network Address Translation後的一些理解整理,主要通過例項和圖表的方式展示了NAT的工作原理和每個階段的狀態。本文的NAT是基本於Linux下的iptables命令實現。

1 概述

1.1 簡介

NAT英文全稱是“Network Address Translation”,中文意思是“網路地址轉換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務組)標準,允許一個整體機構以一個公用IP(Internet Protocol)地址出現在Internet上。顧名思義,它是一種把內部私有網路地址(IP地址)翻譯成合法網路IP地址的技術。因此我們可以認為,NAT在一定程度上,能夠有效的解決公網地址不足的問題。

1.2 分類

NAT有三種類型:靜態NAT(Static NAT)、動態地址NAT(Pooled NAT)、網路地址埠轉換NAPT(Port-Level NAT)。

其中,網路地址埠轉換NAPT(Network Address Port Translation)則是把內部地址對映到外部網路的一個IP地址的不同埠上。它可以將中小型的網路隱藏在一個合法的IP地址後面。NAPT與 動態地址NAT不同,它將內部連線對映到外部網路中的一個單獨的IP地址上,同時在該地址上加上一個由NAT裝置選定的埠號。

NAPT是使用最普遍的一種轉換方式,在HomeGW中也主要使用該方式。它又包含兩種轉換方式:SNAT和DNAT。

(1)源NAT(Source NAT,SNAT):修改資料包的源地址。源NAT改變第一個資料包的來源地址,它永遠會在資料包傳送到網路之前完成,資料包偽裝就是一具SNAT的例子。

(2)目的NAT(Destination NAT,DNAT):修改資料包的目的地址。Destination NAT剛好與SNAT相反,它是改變第一個資料懈的目的地地址,如平衡負載、埠轉發和透明代理就是屬於DNAT。

1.3 應用

NAT主要可以實現以下幾個功能:資料包偽裝、平衡負載、埠轉發和透明代理。

資料偽裝: 可以將內網資料包中的地址資訊更改成統一的對外地址資訊,不讓內網主機直接暴露在因特網上,保證內網主機的安全。同時,該功能也常用來實現共享上網。

埠轉發: 當內網主機對外提供服務時,由於使用的是內部私有IP地址,外網無法直接訪問。因此,需要在閘道器上進行埠轉發,將特定服務的資料包轉發給內網主機。

負載平衡: 目的地址轉換NAT可以重定向一些伺服器的連線到其他隨機選定的伺服器。

失效終結: 目的地址轉換NAT可以用來提供高可靠性的服務。如果一個系統有一臺通過路由器訪問的關鍵伺服器,一旦路由器檢測到該伺服器當機,它可以使用目的地址轉換NAT透明的把連線轉移到一個備份伺服器上。

透明代理: NAT可以把連線到因特網的HTTP連線重定向到一個指定的HTTP代理伺服器以快取資料和過濾請求。一些因特網服務提供商就使用這種技術來減少頻寬的使用而不用讓他們的客戶配置他們的瀏覽器支援代理連線。

2 原理

2.1 地址轉換

NAT的基本工作原理是,當私有網主機和公共網主機通訊的IP包經過NAT閘道器時,將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進行轉換。

如下圖所示,NAT閘道器有2個網路埠,其中公共網路埠的IP地址是統一分配的公共 IP,為202.20.65.5;私有網路埠的IP地址是保留地址,為192.168.1.1。私有網中的主機192.168.1.2向公共網中的主機202.20.65.4傳送了1個IP包(Dst=202.20.65.4,Src=192.168.1.2)。

當IP包經過NAT閘道器時,NAT Gateway會將IP包的源IP轉換為NAT Gateway的公共IP並轉發到公共網,此時IP包(Dst=202.20.65.4,Src=202.20.65.5)中已經不含任何私有網IP的資訊。由於IP包的源IP已經被轉換成NAT Gateway的公共IP,Web Server發出的響應IP包(Dst= 202.20.65.5,Src=202.20.65.4)將被髮送到NAT Gateway。

這時,NAT Gateway會將IP包的目的IP轉換成私有網中主機的IP,然後將IP包(Des=192.168.1.2,Src=202.20.65.4)轉發到私有網。對於通訊雙方而言,這種地址的轉換過程是完全透明的。轉換示意圖如下。

如果內網主機發出的請求包未經過NAT,那麼當Web Server收到請求包,回覆的響應包中的目的地址就是私網IP地址,在Internet上無法正確送達,導致連線失敗。

2.2 連線跟蹤

在上述過程中,NAT Gateway在收到響應包後,就需要判斷將資料包轉發給誰。此時如果子網內僅有少量客戶機,可以用靜態NAT手工指定;但如果內網有多臺客戶機,並且各自訪問不同網站,這時候就需要連線跟蹤(connection track)。如下圖所示:

在NAT Gateway收到客戶機發來的請求包後,做源地址轉換,並且將該連線記錄儲存下來,當NAT Gateway收到伺服器來的響應包後,查詢Track Table,確定轉發目標,做目的地址轉換,轉發給客戶機。

2.3 埠轉換

以上述客戶機訪問伺服器為例,當僅有一臺客戶機訪問伺服器時,NAT Gateway只須更改資料包的源IP或目的IP即可正常通訊。但是如果Client A和Client B同時訪問Web Server,那麼當NAT Gateway收到響應包的時候,就無法判斷將資料包轉發給哪臺客戶機,如下圖所示。

此時,NAT Gateway會在Connection Track中加入埠資訊加以區分。如果兩客戶機訪問同一伺服器的源埠不同,那麼在Track Table里加入埠資訊即可區分,如果源埠正好相同,那麼在時行SNAT和DNAT的同時對源埠也要做相應的轉換,如下圖所示。

3 Linux下NAT實現

3.1 netfilter/iptables模組

netfilter/iptables(IP資訊包過濾系統)是一種功能強大的工具,根據資料包過濾規則,對經過的網路資料包進行丟棄、改造、轉發等處理。

netfilter元件也稱為核心空間(kernelspace),是核心的一部分,由一些資料包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。

iptables元件是一種工具,也稱為使用者空間(userspace),它主要用來向用戶提供新增、修改、刪除核心中資料過濾表的介面。

3.2 基於netfilter/iptables的NAT

netfilter/iptables中的資料包過濾表有三種:filter、nat和mangle。

filter 表用於一般的資訊包過濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。

nat 表用於要轉發的資訊包,它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 鏈。

如果資訊包及其頭內進行了任何更改,則使用 mangle 表。該表包含一些規則來標記用於高階路由的資訊包,該表包含 PREROUTING 和 OUTPUT 鏈。

filter 表用來過濾資料包,我們可以在任何時候匹配包並過濾它們。Mangle不經常使用還在開發當中。我們下面主要介紹Nat表來實現NAT功能。

(1)使用者使用iptables命令在使用者空間設定NAT規則。通過使用使用者空間iptables命令,可以構建使用者自己的定製NAT規則。所有規則儲存在核心空間的nat表中。根據規則所處理的資訊包型別,將規則分組在鏈中。要做SNAT的資訊包被新增到POSTROUTING鏈中。要做DNAT的資訊包被新增到PREROUTING鏈中。直接從本地出站的資訊包的規則被新增到OUTPUT 鏈中。

(2)核心空間接管NAT工作.做過NAT操作的資料包的地址就被改變了,當然這種改變是根據我們的規則進行的。屬於一個流的包只會經過這個表一次。如果第一個包被允許做NAT或 Masqueraded,那麼餘下的包都會自動地被做相同的操作。也就是說,餘下的包不會再通過這個表,一個一個的被NAT,而是自動地完成。這就是我們為什麼不應該在這個表中做任何過濾的主要原因。PREROUTING 鏈的作用是在包剛剛到達防火牆時改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產生的包的目的地址。下圖是資料包穿越整個netfilter/iptables的流程圖。

(3)NAT工作步驟:

DNAT:若包是被送往PREROUTING鏈的,並且匹配了規則,則執行DNAT或REDIRECT目標。為了使資料包得到正確路由,必須在路由之前進行DNAT。

路由:核心檢查資訊包的頭資訊,尤其是資訊包的目的地。

處理本地程序產生的包:對nat表OUTPUT鏈中的規則實施規則檢查,對匹配的包執行目標動作。

SNAT:若包是被送往POSTROUTING鏈的,並且匹配了規則,則執行SNAT或MASQUERADE目標。系統在決定了資料包的路由之後才執行該鏈中的規則。

4 NAT的缺陷

NAT在最開始的時候是非常完美的,但隨著網路的發展,各種新的應用層出不窮,此時NAT也暴露出了缺點。NAT的缺陷主要表現在以下幾方面:

(1) 不能處理嵌入式IP地址或埠

NAT裝置不能翻譯那些嵌入到應用資料部分的IP地址或埠資訊,它只能翻譯那種正常位於IP首部中的地址資訊和位於TCP/UDP首部中的埠資訊,如下圖,由於對方會使用接收到的資料包中嵌入的地址和埠進行通訊,這樣就可能產生連線故障,如果通訊雙方都是使用的公網IP,這不會造成什麼問題,但如果那個嵌入式地址和埠是內網的,顯然連線就不可能成攻,原因就如開篇所說的一樣。MSN Messenger的部分功能就使用了這種方式來傳遞IP和埠資訊,這樣就導致了NAT裝置後的客戶端網路應用程式出現連線故障。

clip_image020

(2) 不能從公網訪問內部網路服務

由於內網是私有IP,所以不能直接從公網訪問內部網路服務,比如WEB服務,對於這個問題,我們可以採用建立靜態對映的方法來解決。比如有一條靜態對映,是把218.70.201.185:80與192.168.0.88:80對映起的,當公網使用者要訪問內部WEB伺服器時,它就首先連線到218.70.201.185:80,然後NAT裝置把請求傳給192.168.0.88:80,192.168.0.88把響應返回NAT裝置,再由NAT裝置傳給公網訪問使用者。

(3) 有一些應用程式雖然是用A埠傳送資料的,但卻要用B埠進行接收,不過NAT裝置翻譯時卻不知道這一點,它仍然建立一條針對A埠的對映,結果對方響應的資料要傳給B埠時,NAT裝置卻找不到相關對映條目而會丟棄資料包。
(4) 一些P2P應用在NAT後無法進行
對於那些沒有中間伺服器的純P2P應用(如電視會議,娛樂等)來說,如果大家都位於NAT裝置之後,雙方是無法建立連線的。因為沒有中間伺服器的中轉,NAT裝置後的P2P程式在NAT裝置上是不會有對映條目的,也就是說對方是不能向你發起一個連線的。現在已經有一種叫做P2P NAT穿越的技術來解決這個問題。

5 結語

NAT技術無可否認是在ipv4地址資源的短缺時候起到了緩解作用;在減少使用者申請ISP服務的花費和提供比較完善的負載平衡功能等方面帶來了不少好處。但是在ipv4地址在以後幾年將會枯竭,NAT技術不能改變ip地址空間不足的本質。然而在安全機制上也潛在著威脅,在配置和管理上也是一個挑戰。如果要從根本上解決ip地址資源的問題,ipv6才是最根本之路。在ipv4轉換到ipv6的過程中,NAT技術確實是一個不錯的選擇,相對其他的方案優勢也非常明顯。