詳解:NAT原理及在VxWorks上的實(shí)現(xiàn)
Internet的最初設(shè)計(jì),并沒(méi)有考慮到需要支持目前這樣龐大的互聯(lián)網(wǎng),因此在IPv4的設(shè)計(jì)當(dāng)中,IP地址僅使用了32bit來(lái)標(biāo)識(shí)網(wǎng)絡(luò)中的一個(gè)節(jié)點(diǎn)設(shè)備,雖然這很好地解決了IP數(shù)據(jù)報(bào)的對(duì)齊問(wèn)題,但隨著Internet的迅猛發(fā)展,加上一些不合理的地址分配方式,目前IP地址已嚴(yán)重缺乏,IP地址短缺已成為目前Internet所面臨的最大問(wèn)題之一。
本文引用地址:http://m.butianyuan.cn/article/201609/304538.htm為了節(jié)約IP地址資源,IETF拋棄了傳統(tǒng)的地址分類方式(把IP地址空間人為地劃分為A、B、C、D類地址的方式)。開(kāi)始使用在RFC 1918中指定的CIDR(Classless Inter-Domain Routing)。同時(shí)為了解決IP地址耗損的問(wèn)題,在RFC 1631中提出了使用NAT來(lái)解決共用IP地址訪問(wèn)Internet的問(wèn)題。
1 NAT 概況
NAT是把一個(gè)網(wǎng)絡(luò)中使用的IP地址翻譯成能被另一個(gè)網(wǎng)絡(luò)識(shí)別的IP地址。一個(gè)網(wǎng)絡(luò)被指定為內(nèi)部網(wǎng)絡(luò),另一個(gè)為外部網(wǎng)絡(luò)。通常,一個(gè)公司把自己的本地內(nèi)部網(wǎng)絡(luò)地址映射到一個(gè)或多個(gè)全局外部IP地址,并把收到的包中的全局IP地址解釋成本地IP地址。這也有助于安全,因?yàn)槊總€(gè)出去和進(jìn)來(lái)的請(qǐng)求都必須經(jīng)過(guò)一個(gè)翻譯過(guò)程,這是一個(gè)認(rèn)證請(qǐng)求或把它與以前請(qǐng)求匹配的過(guò)程。
NAT包含在路由器中,通常也是防火墻的一部分。網(wǎng)絡(luò)管理員創(chuàng)建一個(gè)NAT表,用它來(lái)實(shí)現(xiàn)全局到本地和本地到全局地址的映射。NAT也可以和策略利用路由一起使用。NAT可以靜態(tài)定義,也可以根據(jù)IP地址池動(dòng)態(tài)進(jìn)行。
NAT的描述詳見(jiàn)RFC 1631。它討論了NAT與CIDR的關(guān)系,這是一個(gè)解決IP地址耗盡的方法。NAT通過(guò)區(qū)別公共IP地址和私有IP地址而減少了對(duì)公共IP地址的需求。CIDR把公共IP地址聚集在一起,減少了IP地址的浪費(fèi)。
2 NAT 原理
在傳統(tǒng)的標(biāo)準(zhǔn)的TCP/IP通信過(guò)程中,所有的路由器僅僅是充當(dāng)一個(gè)中間人的角色,也就是通常所說(shuō)的存儲(chǔ)轉(zhuǎn)發(fā),路由器并不會(huì)對(duì)轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行修改,比如對(duì)于以太網(wǎng)接口,路由器除了將源MAC 地址換成自己的MAC 地址以外,路由器不會(huì)對(duì)轉(zhuǎn)發(fā)的數(shù)據(jù)包做任何修改。NAT(Network Address Translate,網(wǎng)絡(luò)地址翻譯)恰恰是出于某種特殊需要而對(duì)數(shù)據(jù)包的源IP地址、目的IP地址、源端口、目的端口進(jìn)行改寫(xiě)的操作。
從原理的角度可以將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的源地址,所謂DNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的目的地址。
3 NAT 的VxWorks 實(shí)現(xiàn)
3.1 VxWorks的底層接口概況
3.1.1 VxWorks MUX 接口層
在VxWorks中,TCP/IP協(xié)議棧使用MUX接口去和數(shù)據(jù)鏈路層通信,MUX接口的目的是隔離數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層。MUX接口之上是網(wǎng)絡(luò)協(xié)議層,比如TCP/IP、 MUX_PROTO_OUTPUT、 MUX_PROTO_SNARF等協(xié)議,在MUX之下為網(wǎng)絡(luò)硬件的驅(qū)動(dòng)程序。MUX接口層提供一套接口去完成協(xié)議和驅(qū)動(dòng)注冊(cè),協(xié)議和驅(qū)動(dòng)之間數(shù)據(jù)接收、發(fā)送,Multicast地址訪問(wèn),MUX ioctl等工作。整個(gè)層次結(jié)構(gòu)如圖1所示。
3.1.2 VxWorks 中對(duì)IP數(shù)據(jù)包的截獲
要在VxWorks中實(shí)現(xiàn)NAT,必須實(shí)現(xiàn)兩個(gè)基本操作:IP數(shù)據(jù)包的截獲與IP數(shù)據(jù)包的偽裝處理。
對(duì)于VxWorks協(xié)議棧來(lái)講,NAT的存在是透明的。所以,要實(shí)現(xiàn)NAT的功能,必須在VxWorks網(wǎng)絡(luò)協(xié)議棧處理數(shù)據(jù)包之前截獲數(shù)據(jù)。要實(shí)現(xiàn)這一點(diǎn),VxWorks為我們提供了兩類鉤子函數(shù),截獲以太幀的EtherHook和截獲IP數(shù)據(jù)包的IpFilterHook。
其中EtherHook又包括EtherInputHook和EtherOutputHook,分別用來(lái)截獲接收和發(fā)送的以太幀。用戶可以通過(guò)EtherInputHookAdd和EtherOutputHookAdd來(lái)分別進(jìn)行安裝。
而IpFilterHook提供對(duì)IP數(shù)據(jù)包的截獲,它只對(duì)應(yīng)一個(gè)鉤子函數(shù),用IpFilterHookAdd來(lái)進(jìn)行安裝。當(dāng)收到一個(gè)IP數(shù)據(jù)包的時(shí)候,IpFilterHook會(huì)被自動(dòng)調(diào)用,從而達(dá)到對(duì)IP數(shù)據(jù)包截獲的目的。
對(duì)比兩種接口,EtherInputHookAdd將調(diào)用MuxBind去添加一個(gè)MUX_PROTO_SNARF協(xié)議,這樣可以得到進(jìn)入MUX接口層的所有數(shù)據(jù)包。而由IpFilterHookAdd安裝的IpFilterHook,不屬于MUX接口層,僅僅用來(lái)截獲IP數(shù)據(jù)包,而不會(huì)接收到非IP數(shù)據(jù)包。
鑒于以上的區(qū)別,我們使用IpFilterHookAdd函數(shù)安裝的IpFilterHook來(lái)截獲IP數(shù)據(jù)包比較合適,參見(jiàn)圖2。
3.2 NAT偽裝策略
3.2.1 網(wǎng)絡(luò)接口
網(wǎng)絡(luò)接口是VxWorks的一個(gè)內(nèi)核對(duì)象,它是由網(wǎng)絡(luò)驅(qū)動(dòng)程序注冊(cè)的。它在內(nèi)核中用于標(biāo)識(shí)網(wǎng)絡(luò)設(shè)備的驅(qū)動(dòng)程序,包含著該網(wǎng)絡(luò)設(shè)備特有的屬性、配置及操作接口等。而這個(gè)驅(qū)動(dòng)程序可以驅(qū)動(dòng)一個(gè)特定型號(hào)的網(wǎng)絡(luò)芯片,比如I82557,RTL 8139等,也可以驅(qū)動(dòng)一些其他類型的設(shè)備,比如通過(guò)Serial Port、CompactPCI Bus、Loopback等。在VxWorks中,接收到的IP數(shù)據(jù)被保存在一個(gè)mBlk的結(jié)構(gòu)當(dāng)中。該結(jié)構(gòu)除保存數(shù)據(jù)內(nèi)容外,還保存了管理數(shù)據(jù)內(nèi)容的信息結(jié)構(gòu)以及接口信息。
3.2.2 哪些IP數(shù)據(jù)包需要偽裝
在做NAT地址映射時(shí),我們需要判斷對(duì)哪些IP包進(jìn)行偽裝(NAT變換)。我們通過(guò)下面這個(gè)實(shí)例來(lái)進(jìn)行講解(見(jiàn)圖3)。
在這個(gè)實(shí)例中,網(wǎng)關(guān)通過(guò)網(wǎng)絡(luò)接口If0連接到局域網(wǎng)中,并通過(guò)If1連接到Internet上,同時(shí),網(wǎng)關(guān)啟用NAT功能。此時(shí),位于局域網(wǎng)中的主機(jī)A如果想訪問(wèn)Internet上10.2.4.0/24網(wǎng)段的主機(jī)B,最好的方法是通過(guò)網(wǎng)關(guān)上的NAT。
那么,具體哪些包需要進(jìn)行NAT變換呢?我們先根據(jù)源地址和目的地址來(lái)劃分網(wǎng)關(guān)可能收到的包的類型。
(1)接口If0收到的IP數(shù)據(jù)包,目的地址為網(wǎng)關(guān)If0接口的IP地址。
(2)接口If0收到的IP數(shù)據(jù)包,目的地址為網(wǎng)關(guān)If1接口的IP地址。
(3)接口If0收到的IP數(shù)據(jù)包,目的地址非網(wǎng)關(guān)任一接口的地址的私網(wǎng)IP地址。
(4)接口If0收到的IP數(shù)據(jù)包,目的地址非網(wǎng)關(guān)任一接口的地址的公網(wǎng)IP地址。
(5)接口If1收到的IP數(shù)據(jù)包,目的地址為If1接口的IP地址。
(6)接口If1收到的IP數(shù)據(jù)包,目的地址非If1接口的IP地址。
對(duì)于前面3種情況,NAT不進(jìn)行任何處理,直接交給VxWorks網(wǎng)絡(luò)協(xié)議棧,由協(xié)議棧來(lái)做進(jìn)一步的處理。
對(duì)于第4種情況,符合NAT變換的需求,NAT將改變?cè)璉P包的源地址為網(wǎng)關(guān)的外出口地址,同時(shí)選擇網(wǎng)關(guān)該接口未分配的端口來(lái)修改原IP包中的源端口,并添加該記錄到NAT映射表內(nèi)。最后把IP包送到If1接口,然后發(fā)送到目的主機(jī)。
對(duì)于第5種情況,我們將收到的IP數(shù)據(jù)包送到NAT處理。通過(guò)查找NAT映射表,決定是否將其目標(biāo)地址轉(zhuǎn)換為L(zhǎng)AN中的某一個(gè)地址,還是不做任何處理,直接歸還給協(xié)議棧。對(duì)于第6種情況,我們這里也簡(jiǎn)單地直接歸還給協(xié)議棧進(jìn)行處理。
評(píng)論