新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 詳解:NAT原理及在VxWorks上的實現(xiàn)

詳解:NAT原理及在VxWorks上的實現(xiàn)

作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

Internet的最初設(shè)計,并沒有考慮到需要支持目前這樣龐大的互聯(lián)網(wǎng),因此在IPv4的設(shè)計當(dāng)中,IP地址僅使用了32bit來標(biāo)識網(wǎng)絡(luò)中的一個節(jié)點設(shè)備,雖然這很好地解決了IP數(shù)據(jù)報的對齊問題,但隨著Internet的迅猛發(fā)展,加上一些不合理的地址分配方式,目前IP地址已嚴(yán)重缺乏,IP地址短缺已成為目前Internet所面臨的最大問題之一。

本文引用地址:http://www.butianyuan.cn/article/201609/304538.htm

為了節(jié)約IP地址資源,IETF拋棄了傳統(tǒng)的地址分類方式(把IP地址空間人為地劃分為A、B、C、D類地址的方式)。開始使用在RFC 1918中指定的CIDR(Classless Inter-Domain Routing)。同時為了解決IP地址耗損的問題,在RFC 1631中提出了使用NAT來解決共用IP地址訪問Internet的問題。

1 NAT 概況

NAT是把一個網(wǎng)絡(luò)中使用的IP地址翻譯成能被另一個網(wǎng)絡(luò)識別的IP地址。一個網(wǎng)絡(luò)被指定為內(nèi)部網(wǎng)絡(luò),另一個為外部網(wǎng)絡(luò)。通常,一個公司把自己的本地內(nèi)部網(wǎng)絡(luò)地址映射到一個或多個全局外部IP地址,并把收到的包中的全局IP地址解釋成本地IP地址。這也有助于安全,因為每個出去和進(jìn)來的請求都必須經(jīng)過一個翻譯過程,這是一個認(rèn)證請求或把它與以前請求匹配的過程。

NAT包含在路由器中,通常也是防火墻的一部分。網(wǎng)絡(luò)管理員創(chuàng)建一個NAT表,用它來實現(xiàn)全局到本地和本地到全局地址的映射。NAT也可以和策略利用路由一起使用。NAT可以靜態(tài)定義,也可以根據(jù)IP地址池動態(tài)進(jìn)行。

NAT的描述詳見RFC 1631。它討論了NAT與CIDR的關(guān)系,這是一個解決IP地址耗盡的方法。NAT通過區(qū)別公共IP地址和私有IP地址而減少了對公共IP地址的需求。CIDR把公共IP地址聚集在一起,減少了IP地址的浪費。

2 NAT 原理

在傳統(tǒng)的標(biāo)準(zhǔn)的TCP/IP通信過程中,所有的路由器僅僅是充當(dāng)一個中間人的角色,也就是通常所說的存儲轉(zhuǎn)發(fā),路由器并不會對轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行修改,比如對于以太網(wǎng)接口,路由器除了將源MAC 地址換成自己的MAC 地址以外,路由器不會對轉(zhuǎn)發(fā)的數(shù)據(jù)包做任何修改。NAT(Network Address Translate,網(wǎng)絡(luò)地址翻譯)恰恰是出于某種特殊需要而對數(shù)據(jù)包的源IP地址、目的IP地址、源端口、目的端口進(jìn)行改寫的操作。

從原理的角度可以將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的源地址,所謂DNAT就是改變轉(zhuǎn)發(fā)數(shù)據(jù)包的目的地址。

3 NAT 的VxWorks 實現(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ū)動程序。MUX接口層提供一套接口去完成協(xié)議和驅(qū)動注冊,協(xié)議和驅(qū)動之間數(shù)據(jù)接收、發(fā)送,Multicast地址訪問,MUX ioctl等工作。整個層次結(jié)構(gòu)如圖1所示。

3.1.2 VxWorks 中對IP數(shù)據(jù)包的截獲

要在VxWorks中實現(xiàn)NAT,必須實現(xiàn)兩個基本操作:IP數(shù)據(jù)包的截獲與IP數(shù)據(jù)包的偽裝處理。

對于VxWorks協(xié)議棧來講,NAT的存在是透明的。所以,要實現(xiàn)NAT的功能,必須在VxWorks網(wǎng)絡(luò)協(xié)議棧處理數(shù)據(jù)包之前截獲數(shù)據(jù)。要實現(xiàn)這一點,VxWorks為我們提供了兩類鉤子函數(shù),截獲以太幀的EtherHook和截獲IP數(shù)據(jù)包的IpFilterHook。

其中EtherHook又包括EtherInputHook和EtherOutputHook,分別用來截獲接收和發(fā)送的以太幀。用戶可以通過EtherInputHookAdd和EtherOutputHookAdd來分別進(jìn)行安裝。

而IpFilterHook提供對IP數(shù)據(jù)包的截獲,它只對應(yīng)一個鉤子函數(shù),用IpFilterHookAdd來進(jìn)行安裝。當(dāng)收到一個IP數(shù)據(jù)包的時候,IpFilterHook會被自動調(diào)用,從而達(dá)到對IP數(shù)據(jù)包截獲的目的。

對比兩種接口,EtherInputHookAdd將調(diào)用MuxBind去添加一個MUX_PROTO_SNARF協(xié)議,這樣可以得到進(jìn)入MUX接口層的所有數(shù)據(jù)包。而由IpFilterHookAdd安裝的IpFilterHook,不屬于MUX接口層,僅僅用來截獲IP數(shù)據(jù)包,而不會接收到非IP數(shù)據(jù)包。

鑒于以上的區(qū)別,我們使用IpFilterHookAdd函數(shù)安裝的IpFilterHook來截獲IP數(shù)據(jù)包比較合適,參見圖2。

3.2 NAT偽裝策略

3.2.1 網(wǎng)絡(luò)接口

網(wǎng)絡(luò)接口是VxWorks的一個內(nèi)核對象,它是由網(wǎng)絡(luò)驅(qū)動程序注冊的。它在內(nèi)核中用于標(biāo)識網(wǎng)絡(luò)設(shè)備的驅(qū)動程序,包含著該網(wǎng)絡(luò)設(shè)備特有的屬性、配置及操作接口等。而這個驅(qū)動程序可以驅(qū)動一個特定型號的網(wǎng)絡(luò)芯片,比如I82557,RTL 8139等,也可以驅(qū)動一些其他類型的設(shè)備,比如通過Serial Port、CompactPCI Bus、Loopback等。在VxWorks中,接收到的IP數(shù)據(jù)被保存在一個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地址映射時,我們需要判斷對哪些IP包進(jìn)行偽裝(NAT變換)。我們通過下面這個實例來進(jìn)行講解(見圖3)。

在這個實例中,網(wǎng)關(guān)通過網(wǎng)絡(luò)接口If0連接到局域網(wǎng)中,并通過If1連接到Internet上,同時,網(wǎng)關(guān)啟用NAT功能。此時,位于局域網(wǎng)中的主機(jī)A如果想訪問Internet上10.2.4.0/24網(wǎng)段的主機(jī)B,最好的方法是通過網(wǎng)關(guān)上的NAT。

那么,具體哪些包需要進(jìn)行NAT變換呢?我們先根據(jù)源地址和目的地址來劃分網(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地址。

對于前面3種情況,NAT不進(jìn)行任何處理,直接交給VxWorks網(wǎng)絡(luò)協(xié)議棧,由協(xié)議棧來做進(jìn)一步的處理。

對于第4種情況,符合NAT變換的需求,NAT將改變原IP包的源地址為網(wǎng)關(guān)的外出口地址,同時選擇網(wǎng)關(guān)該接口未分配的端口來修改原IP包中的源端口,并添加該記錄到NAT映射表內(nèi)。最后把IP包送到If1接口,然后發(fā)送到目的主機(jī)。

對于第5種情況,我們將收到的IP數(shù)據(jù)包送到NAT處理。通過查找NAT映射表,決定是否將其目標(biāo)地址轉(zhuǎn)換為LAN中的某一個地址,還是不做任何處理,直接歸還給協(xié)議棧。對于第6種情況,我們這里也簡單地直接歸還給協(xié)議棧進(jìn)行處理。


上一頁 1 2 3 下一頁

關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉