網路地址轉換NAT原理及應用-連線跟蹤--埠轉換*******************

tycoon1988發表於2014-11-04

http://eqinping.blog.163.com/blog/static/28019142201331123427907/

這是做路由器的時候,學習網路地址轉換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。

nat1

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

當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

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

2.2 連線跟蹤

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

nat4

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

2.3 埠轉換

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

nat5

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

nat6

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

(3)NAT工作步驟:

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

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

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

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


相關文章