NAT原理以及在VxWorks上的實現(xiàn)
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://m.butianyuan.cn/article/201609/304687.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īng)過一個翻譯過程,這是一個認(rèn)證請求或把它與以前請求匹配的過程。
NAT包含在路由器中,通常也是防火墻的一部分。網(wǎng)絡(luò)管理員創(chuàng)建一個NAT表,用它來實現(xiàn)全局到本地和本地到全局地址的映射。NAT也可以和策略利用路由一起使用。NAT可以靜態(tài)定義,也可以根據(jù)IP地址池動態(tài)進行。
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ù)包進行修改,比如對于以太網(wǎng)接口,路由器除了將源MAC 地址換成自己的MAC 地址以外,路由器不會對轉(zhuǎn)發(fā)的數(shù)據(jù)包做任何修改。NAT(Network Address Translate,網(wǎng)絡(luò)地址翻譯)恰恰是出于某種特殊需要而對數(shù)據(jù)包的源IP地址、目的IP地址、源端口、目的端口進行改寫的操作。
從原理的角度可以將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來分別進行安裝。
而IpFilterHook提供對IP數(shù)據(jù)包的截獲,它只對應(yīng)一個鉤子函數(shù),用IpFilterHookAdd來進行安裝。當(dāng)收到一個IP數(shù)據(jù)包的時候,IpFilterHook會被自動調(diào)用,從而達到對IP數(shù)據(jù)包截獲的目的。
對比兩種接口,EtherInputHookAdd將調(diào)用MuxBind去添加一個MUX_PROTO_SNARF協(xié)議,這樣可以得到進入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包進行偽裝(NAT變換)。我們通過下面這個實例來進行講解(見圖3)。
在這個實例中,網(wǎng)關(guān)通過網(wǎng)絡(luò)接口If0連接到局域網(wǎng)中,并通過If1連接到Internet上,同時,網(wǎng)關(guān)啟用NAT功能。此時,位于局域網(wǎng)中的主機A如果想訪問Internet上10.2.4.0/24網(wǎng)段的主機B,最好的方法是通過網(wǎng)關(guān)上的NAT。
那么,具體哪些包需要進行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不進行任何處理,直接交給VxWorks網(wǎng)絡(luò)協(xié)議棧,由協(xié)議棧來做進一步的處理。
對于第4種情況,符合NAT變換的需求,NAT將改變原IP包的源地址為網(wǎng)關(guān)的外出口地址,同時選擇網(wǎng)關(guān)該接口未分配的端口來修改原IP包中的源端口,并添加該記錄到NAT映射表內(nèi)。最后把IP包送到If1接口,然后發(fā)送到目的主機。
對于第5種情況,我們將收到的IP數(shù)據(jù)包送到NAT處理。通過查找NAT映射表,決定是否將其目標(biāo)地址轉(zhuǎn)換為LAN中的某一個地址,還是不做任何處理,直接歸還給協(xié)議棧。對于第6種情況,我們這里也簡單地直接歸還給協(xié)議棧進行處理。
評論