NAT 概述 1.1 簡(jiǎn)介 NAT英文全稱是“Network Address Translation”,中文意思是“網(wǎng)絡(luò)地址轉(zhuǎn)換”,它是一個(gè)IETF(Internet Engineering Task Force, Internet工程任務(wù)組)標(biāo)準(zhǔn),允許一個(gè)整體機(jī)構(gòu)以一個(gè)公用IP(Internet Protocol)地址出現(xiàn)在Internet上。顧名思義,它是一種把內(nèi)部私有網(wǎng)絡(luò)地址(IP地址)翻譯成合法網(wǎng)絡(luò)IP地址的技術(shù)。因此我們可以認(rèn)為,NAT在一定程度上,能夠有效的解決公網(wǎng)地址不足的問(wèn)題。 1.2 分類 NAT有三種類型:靜態(tài)NAT(Static NAT)、動(dòng)態(tài)地址NAT(Pooled NAT)、網(wǎng)絡(luò)地址端口轉(zhuǎn)換NAPT(Port-Level NAT)。 其中,網(wǎng)絡(luò)地址端口轉(zhuǎn)換NAPT(Network Address Port Translation)則是把內(nèi)部地址映射到外部網(wǎng)絡(luò)的一個(gè)IP地址的不同端口上。它可以將中小型的網(wǎng)絡(luò)隱藏在一個(gè)合法的IP地址后面。NAPT與 動(dòng)態(tài)地址NAT不同,它將內(nèi)部連接映射到外部網(wǎng)絡(luò)中的一個(gè)單獨(dú)的IP地址上,同時(shí)在該地址上加上一個(gè)由NAT設(shè)備選定的端口號(hào)。 NAPT是使用最普遍的一種轉(zhuǎn)換方式,在HomeGW中也主要使用該方式。它又包含兩種轉(zhuǎn)換方式:SNAT和DNAT。 (1)源NAT(Source NAT,SNAT):修改數(shù)據(jù)包的源地址。源NAT改變第一個(gè)數(shù)據(jù)包的來(lái)源地址,它永遠(yuǎn)會(huì)在數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)之前完成,數(shù)據(jù)包偽裝就是一具SNAT的例子。 (2)目的NAT(Destination NAT,DNAT):修改數(shù)據(jù)包的目的地址。Destination NAT剛好與SNAT相反,它是改變第一個(gè)數(shù)據(jù)懈的目的地地址,如平衡負(fù)載、端口轉(zhuǎn)發(fā)和透明代理就是屬于DNAT。 1.3 應(yīng)用 NAT主要可以實(shí)現(xiàn)以下幾個(gè)功能:數(shù)據(jù)包偽裝、平衡負(fù)載、端口轉(zhuǎn)發(fā)和透明代理。 數(shù)據(jù)偽裝: 可以將內(nèi)網(wǎng)數(shù)據(jù)包中的地址信息更改成統(tǒng)一的對(duì)外地址信息,不讓內(nèi)網(wǎng)主機(jī)直接暴露在因特網(wǎng)上,保證內(nèi)網(wǎng)主機(jī)的安全。同時(shí),該功能也常用來(lái)實(shí)現(xiàn)共享上網(wǎng)。 端口轉(zhuǎn)發(fā): 當(dāng)內(nèi)網(wǎng)主機(jī)對(duì)外提供服務(wù)時(shí),由于使用的是內(nèi)部私有IP地址,外網(wǎng)無(wú)法直接訪問(wèn)。因此,需要在網(wǎng)關(guān)上進(jìn)行端口轉(zhuǎn)發(fā),將特定服務(wù)的數(shù)據(jù)包轉(zhuǎn)發(fā)給內(nèi)網(wǎng)主機(jī)。 負(fù)載平衡: 目的地址轉(zhuǎn)換NAT可以重定向一些服務(wù)器的連接到其他隨機(jī)選定的服務(wù)器。 失效終結(jié): 目的地址轉(zhuǎn)換NAT可以用來(lái)提供高可靠性的服務(wù)。如果一個(gè)系統(tǒng)有一臺(tái)通過(guò)路由器訪問(wèn)的關(guān)鍵服務(wù)器,一旦路由器檢測(cè)到該服務(wù)器當(dāng)機(jī),它可以使用目的地址轉(zhuǎn)換NAT透明的把連接轉(zhuǎn)移到一個(gè)備份服務(wù)器上。 透明代理: NAT可以把連接到因特網(wǎng)的HTTP連接重定向到一個(gè)指定的HTTP代理服務(wù)器以緩存數(shù)據(jù)和過(guò)濾請(qǐng)求。一些因特網(wǎng)服務(wù)提供商就使用這種技術(shù)來(lái)減少帶寬的使用而不用讓他們的客戶配置他們的瀏覽器支持代理連接。 2 原理 2.1 地址轉(zhuǎn)換 NAT的基本工作原理是,當(dāng)私有網(wǎng)主機(jī)和公共網(wǎng)主機(jī)通信的IP包經(jīng)過(guò)NAT網(wǎng)關(guān)時(shí),將IP包中的源IP或目的IP在私有IP和NAT的公共IP之間進(jìn)行轉(zhuǎn)換。 如下圖所示,NAT網(wǎng)關(guān)有2個(gè)網(wǎng)絡(luò)端口,其中公共網(wǎng)絡(luò)端口的IP地址是統(tǒng)一分配的公共 IP,為202.20.65.5;私有網(wǎng)絡(luò)端口的IP地址是保留地址,為192.168.1.1。私有網(wǎng)中的主機(jī)192.168.1.2向公共網(wǎng)中的主機(jī)202.20.65.4發(fā)送了1個(gè)IP包(Dst=202.20.65.4,Src=192.168.1.2)。 當(dāng)IP包經(jīng)過(guò)NAT網(wǎng)關(guān)時(shí),NAT Gateway會(huì)將IP包的源IP轉(zhuǎn)換為NAT Gateway的公共IP并轉(zhuǎn)發(fā)到公共網(wǎng),此時(shí)IP包(Dst=202.20.65.4,Src=202.20.65.5)中已經(jīng)不含任何私有網(wǎng)IP的信息。由于IP包的源IP已經(jīng)被轉(zhuǎn)換成NAT Gateway的公共IP,Web Server發(fā)出的響應(yīng)IP包(Dst= 202.20.65.5,Src=202.20.65.4)將被發(fā)送到NAT Gateway。 這時(shí),NAT Gateway會(huì)將IP包的目的IP轉(zhuǎn)換成私有網(wǎng)中主機(jī)的IP,然后將IP包(Des=192.168.1.2,Src=202.20.65.4)轉(zhuǎn)發(fā)到私有網(wǎng)。對(duì)于通信雙方而言,這種地址的轉(zhuǎn)換過(guò)程是完全透明的。轉(zhuǎn)換示意圖如下。 如果內(nèi)網(wǎng)主機(jī)發(fā)出的請(qǐng)求包未經(jīng)過(guò)NAT,那么當(dāng)Web Server收到請(qǐng)求包,回復(fù)的響應(yīng)包中的目的地址就是私網(wǎng)IP地址,在Internet上無(wú)法正確送達(dá),導(dǎo)致連接失敗。 2.2 連接跟蹤 在上述過(guò)程中,NAT Gateway在收到響應(yīng)包后,就需要判斷將數(shù)據(jù)包轉(zhuǎn)發(fā)給誰(shuí)。此時(shí)如果子網(wǎng)內(nèi)僅有少量客戶機(jī),可以用靜態(tài)NAT手工指定;但如果內(nèi)網(wǎng)有多臺(tái)客戶機(jī),并且各自訪問(wèn)不同網(wǎng)站,這時(shí)候就需要連接跟蹤(connection track)。如下圖所示: 在NAT Gateway收到客戶機(jī)發(fā)來(lái)的請(qǐng)求包后,做源地址轉(zhuǎn)換,并且將該連接記錄保存下來(lái),當(dāng)NAT Gateway收到服務(wù)器來(lái)的響應(yīng)包后,查找Track Table,確定轉(zhuǎn)發(fā)目標(biāo),做目的地址轉(zhuǎn)換,轉(zhuǎn)發(fā)給客戶機(jī)。 2.3 端口轉(zhuǎn)換 以上述客戶機(jī)訪問(wèn)服務(wù)器為例,當(dāng)僅有一臺(tái)客戶機(jī)訪問(wèn)服務(wù)器時(shí),NAT Gateway只須更改數(shù)據(jù)包的源IP或目的IP即可正常通訊。但是如果Client A和Client B同時(shí)訪問(wèn)Web Server,那么當(dāng)NAT Gateway收到響應(yīng)包的時(shí)候,就無(wú)法判斷將數(shù)據(jù)包轉(zhuǎn)發(fā)給哪臺(tái)客戶機(jī),如下圖所示。 此時(shí),NAT Gateway會(huì)在Connection Track中加入端口信息加以區(qū)分。如果兩客戶機(jī)訪問(wèn)同一服務(wù)器的源端口不同,那么在Track Table里加入端口信息即可區(qū)分,如果源端口正好相同,那么在時(shí)行SNAT和DNAT的同時(shí)對(duì)源端口也要做相應(yīng)的轉(zhuǎn)換,如下圖所示。 3 Linux下NAT實(shí)現(xiàn) 3.1 netfilter/iptables模塊 netfilter/iptables(IP信息包過(guò)濾系統(tǒng))是一種功能強(qiáng)大的工具,根據(jù)數(shù)據(jù)包過(guò)濾規(guī)則,對(duì)經(jīng)過(guò)的網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行丟棄、改造、轉(zhuǎn)發(fā)等處理。 netfilter組件也稱為內(nèi)核空間(kernelspace),是內(nèi)核的一部分,由一些數(shù)據(jù)包過(guò)濾表組成,這些表包含內(nèi)核用來(lái)控制信息包過(guò)濾處理的規(guī)則集。 iptables組件是一種工具,也稱為用戶空間(userspace),它主要用來(lái)向用戶提供添加、修改、刪除內(nèi)核中數(shù)據(jù)過(guò)濾表的接口。 3.2 基于netfilter/iptables的NAT netfilter/iptables中的數(shù)據(jù)包過(guò)濾表有三種:filter、nat和mangle。 filter 表用于一般的信息包過(guò)濾,它包含 INPUT 、 OUTPUT 和 FORWARD 鏈。 nat 表用于要轉(zhuǎn)發(fā)的信息包,它包含 PREROUTING 、 OUTPUT 和 POSTROUTING 鏈。 如果信息包及其頭內(nèi)進(jìn)行了任何更改,則使用 mangle 表。該表包含一些規(guī)則來(lái)標(biāo)記用于高級(jí)路由的信息包,該表包含 PREROUTING 和 OUTPUT 鏈。 filter 表用來(lái)過(guò)濾數(shù)據(jù)包,我們可以在任何時(shí)候匹配包并過(guò)濾它們。Mangle不經(jīng)常使用還在開(kāi)發(fā)當(dāng)中。我們下面主要介紹Nat表來(lái)實(shí)現(xiàn)NAT功能。 (1)用戶使用iptables命令在用戶空間設(shè)置NAT規(guī)則。通過(guò)使用用戶空間iptables命令,可以構(gòu)建用戶自己的定制NAT規(guī)則。所有規(guī)則存儲(chǔ)在內(nèi)核空間的nat表中。根據(jù)規(guī)則所處理的信息包類型,將規(guī)則分組在鏈中。要做SNAT的信息包被添加到POSTROUTING鏈中。要做DNAT的信息包被添加到PREROUTING鏈中。直接從本地出站的信息包的規(guī)則被添加到OUTPUT 鏈中。 (2)內(nèi)核空間接管NAT工作.做過(guò)NAT操作的數(shù)據(jù)包的地址就被改變了,當(dāng)然這種改變是根據(jù)我們的規(guī)則進(jìn)行的。屬于一個(gè)流的包只會(huì)經(jīng)過(guò)這個(gè)表一次。如果第一個(gè)包被允許做NAT或 Masqueraded,那么余下的包都會(huì)自動(dòng)地被做相同的操作。也就是說(shuō),余下的包不會(huì)再通過(guò)這個(gè)表,一個(gè)一個(gè)的被NAT,而是自動(dòng)地完成。這就是我們?yōu)槭裁床粦?yīng)該在這個(gè)表中做任何過(guò)濾的主要原因。PREROUTING 鏈的作用是在包剛剛到達(dá)防火墻時(shí)改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產(chǎn)生的包的目的地址。下圖是數(shù)據(jù)包穿越整個(gè)netfilter/iptables的流程圖。 (3)NAT工作步驟: DNAT:若包是被送往PREROUTING鏈的,并且匹配了規(guī)則,則執(zhí)行DNAT或REDIRECT目標(biāo)。為了使數(shù)據(jù)包得到正確路由,必須在路由之前進(jìn)行DNAT。 路由:內(nèi)核檢查信息包的頭信息,尤其是信息包的目的地。 處理本地進(jìn)程產(chǎn)生的包:對(duì)nat表OUTPUT鏈中的規(guī)則實(shí)施規(guī)則檢查,對(duì)匹配的包執(zhí)行目標(biāo)動(dòng)作。 SNAT:若包是被送往POSTROUTING鏈的,并且匹配了規(guī)則,則執(zhí)行SNAT或MASQUERADE目標(biāo)。系統(tǒng)在決定了數(shù)據(jù)包的路由之后才執(zhí)行該鏈中的規(guī)則。
|