網絡地址轉換NAT原理及應用

NAT 概述
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。

nat1.gif

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)。

nat2.gif

當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)轉發到私有網。對於通信雙方而言,這種地址的轉換過程是完全透明的。轉換示意圖如下。

nat3.gif

如果內網主機發出的請求包未經過NAT,那麼當Web Server收到請求包,回覆的響應包中的目的地址就是私網IP地址,在Internet上無法正確送達,導致連接失敗。
2.2 連接跟蹤
在上述過程中,NAT Gateway在收到響應包後,就需要判斷將數據包轉發給誰。此時如果子網內僅有少量客戶機,可以用靜態NAT手工指定;但如果內網有多臺客戶機,並且各自訪問不同網站,這時候就需要連接跟蹤(connection track)。如下圖所示:

nat4.gif

在NAT Gateway收到客戶機發來的請求包後,做源地址轉換,並且將該連接記錄保存下來,當NAT Gateway收到服務器來的響應包後,查找Track Table,確定轉發目標,做目的地址轉換,轉發給客戶機。
2.3 端口轉換
以上述客戶機訪問服務器爲例,當僅有一臺客戶機訪問服務器時,NAT Gateway只須更改數據包的源IP或目的IP即可正常通訊。但是如果Client A和Client B同時訪問Web Server,那麼當NAT Gateway收到響應包的時候,就無法判斷將數據包轉發給哪臺客戶機,如下圖所示。

nat5.gif

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

nat6.gif

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的流程圖。

nat7.gif

(3)NAT工作步驟:
DNAT:若包是被送往PREROUTING鏈的,並且匹配了規則,則執行DNAT或REDIRECT目標。爲了使數據包得到正確路由,必須在路由之前進行DNAT。
路由:內核檢查信息包的頭信息,尤其是信息包的目的地。
處理本地進程產生的包:對nat表OUTPUT鏈中的規則實施規則檢查,對匹配的包執行目標動作。
SNAT:若包是被送往POSTROUTING鏈的,並且匹配了規則,則執行SNAT或MASQUERADE目標。系統在決定了數據包的路由之後才執行該鏈中的規則。

轉載自:http://www.softbar.com/blog/post/128.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章