畢業(yè)設(shè)計(jì)(論文)-基于Linux的NAT服務(wù)器設(shè)計(jì)_第1頁
畢業(yè)設(shè)計(jì)(論文)-基于Linux的NAT服務(wù)器設(shè)計(jì)_第2頁
畢業(yè)設(shè)計(jì)(論文)-基于Linux的NAT服務(wù)器設(shè)計(jì)_第3頁
畢業(yè)設(shè)計(jì)(論文)-基于Linux的NAT服務(wù)器設(shè)計(jì)_第4頁
畢業(yè)設(shè)計(jì)(論文)-基于Linux的NAT服務(wù)器設(shè)計(jì)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE17PAGE1 本科生畢業(yè)論文題目基于Linux的NAT服務(wù)器設(shè)計(jì)系別計(jì)算機(jī)與信息工程學(xué)院班級計(jì)算機(jī)科學(xué)與技術(shù)082姓名學(xué)號答辯時(shí)間2012年5月新疆農(nóng)業(yè)大學(xué)計(jì)算機(jī)與信息工程學(xué)院目錄TOC\o"1-3"\h\u2655摘要 114661NAT服務(wù)器的基本原理 384641.1NAT轉(zhuǎn)換地址的基本原理 3267371.2NAT實(shí)現(xiàn)技術(shù)的分類 4253651.3NAT技術(shù)的應(yīng)用 5271362Linux下的NAT服務(wù)器功能介紹 6299952.1硬件實(shí)現(xiàn)Linux下的NAT 698762.2Linux下iptable實(shí)現(xiàn)NAT 7167823基于Linux的NAT模塊設(shè)計(jì)和實(shí)現(xiàn)分析 7110593.1基于Linux的NAT服務(wù)器功能模塊設(shè)計(jì) 797223.2基于Linux的NAT地址轉(zhuǎn)換的基本流程 861933.3NAT服務(wù)器實(shí)現(xiàn)采用的技術(shù)方案 9155753.3.1netfilter 9133623.3.2NAT實(shí)現(xiàn)的三條規(guī)則鏈 11227023.3.3基于Linux的NAT實(shí)現(xiàn)對操作系統(tǒng)的要求 11236184基于Linux的NAT服務(wù)器功能模塊實(shí)現(xiàn) 1131584.1獲取數(shù)據(jù)模塊的實(shí)現(xiàn) 11250514.2檢測NAT表模塊的實(shí)現(xiàn) 12116434.3決定映射模塊的實(shí)現(xiàn) 13117144.4修改地址模塊的實(shí)現(xiàn) 14277544.5轉(zhuǎn)發(fā)數(shù)據(jù)模塊的實(shí)現(xiàn) 16305004.6測試 16131395結(jié)論 166242參考文獻(xiàn) 1720559謝辭 18基于Linux的NAT服務(wù)器設(shè)計(jì)指導(dǎo)教師摘要:本文首先介紹了NAT服務(wù)器實(shí)現(xiàn)的基本原理,列出了NAT服務(wù)器實(shí)現(xiàn)的三種技術(shù)分類,即靜態(tài)地址轉(zhuǎn)換、動(dòng)態(tài)地址轉(zhuǎn)換和端口復(fù)用動(dòng)態(tài)地址轉(zhuǎn)換。而后舉例說明NAT在地址轉(zhuǎn)換、負(fù)荷均衡、節(jié)約資源等方面的應(yīng)用,第二章節(jié)介紹了Linux下實(shí)現(xiàn)NAT的功能,引出本課題研究的主題,基于Linux的NAT服務(wù)器設(shè)計(jì),介紹了本課題需要完成的任務(wù)是實(shí)現(xiàn)Linux下簡單的NAT功能,第三章節(jié)就詳細(xì)設(shè)計(jì)了系統(tǒng)實(shí)現(xiàn)的具體模塊,以及各模塊之間的關(guān)系。第四章節(jié)是本文重點(diǎn)研究的內(nèi)容,文中介紹了設(shè)計(jì)的詳細(xì)完成方法,以達(dá)到地址轉(zhuǎn)換的功能。關(guān)鍵詞:網(wǎng)絡(luò)地址轉(zhuǎn)換;IP地址;私有地址;數(shù)據(jù)報(bào)NATServerDesignBasedonLinuxLiuMingmingTutor:DaXinMinAbstract:ThispaperfirstintroducesthebasicprincipleoftherealizationoftheNATserver,liststheNATserveroftherealizationofthethreekindsoftechnicalclassification,staticaddresstranslation,dynamicaddresstranslationandportreusedynamicaddresstranslation.AndthenforexampleNATinaddresstranslation,loadbalance,conservationofresources,andotheraspectsoftheapplication,thesecondchapterintroducestheLinuxunderthefunctionoftherealizationoftheNAT,arousethethemeofsubjectresearch,basedonLinuxNATserverdesign,introducedthistopicneedtocompletethetaskistorealizethesimpleNATfunctionLinux,thethirdchapterisdetailedthesystemdesignofthespecificmodule,andtherelationshipbetweenthevariousmodules.Thefourthchaptertothisisthekeyresearchcontent,thispaperintroducesthemethodtofinishthedetaileddesign,inordertoachievethefunctionoftheaddresstranslation.Keywords:NAT;IPaddress;PrivateAddress;Datagram隨著互聯(lián)網(wǎng)時(shí)代技術(shù)的突飛猛進(jìn),世界的網(wǎng)民也越來越多,隨之帶來的問題便可想而知。最直接的一個(gè)問題,IPv4下的IP地址面臨耗盡,雖然IPv6的提出讓人們又看到了“希望”,但是從IPv4到IPv6的全面替換,還有些不太現(xiàn)實(shí)。這個(gè)時(shí)候恰恰促進(jìn)了網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT,NetworkAddressTranslation)技術(shù)的產(chǎn)生,NAT屬接入廣域網(wǎng)(WAN)技術(shù),是一種將私有(保留)地址轉(zhuǎn)化為合法IP地址的轉(zhuǎn)換技術(shù),它被廣泛應(yīng)用于各種類型Internet接入方式和各種類型的網(wǎng)絡(luò)中。原因很簡單,NAT不僅完美地解決了IP地址不足的問題,而且還能夠有效地避免來自網(wǎng)絡(luò)外部的攻擊,隱藏并保護(hù)網(wǎng)絡(luò)內(nèi)部的計(jì)算機(jī)。[1]在本論文中將會(huì)詳細(xì)的講述NAT的基本原理及其應(yīng)用,并且給出論文設(shè)計(jì)的具體過程。1NAT服務(wù)器的基本原理1.1NAT轉(zhuǎn)換地址的基本原理NAT服務(wù)器主要完成的是地址轉(zhuǎn)換的功能,當(dāng)局域網(wǎng)內(nèi)部的終端要訪問外網(wǎng)時(shí),該終端的內(nèi)部IP地址(私有地址)經(jīng)過NAT服務(wù)器時(shí),服務(wù)器會(huì)將私有地址轉(zhuǎn)換成一個(gè)可以進(jìn)入互聯(lián)網(wǎng)的合法IP地址,在這時(shí),系統(tǒng)中會(huì)形成一張映射表,來記錄私有地址與轉(zhuǎn)換之后的合法地址的關(guān)系。當(dāng)外部網(wǎng)絡(luò)發(fā)送消息到這個(gè)終端,它只需要將剛才與它通信的合法IP地址作為發(fā)送目的地址發(fā)送消息,當(dāng)此消息到達(dá)NAT服務(wù)器時(shí),服務(wù)器會(huì)根據(jù)之前產(chǎn)生的映射表,找到與該IP對應(yīng)的私有地址,再將信息發(fā)送到私有地址對應(yīng)的終端。1)NAT轉(zhuǎn)換地址的過程當(dāng)IP數(shù)據(jù)報(bào)從內(nèi)部的終端經(jīng)過NAT向Internet服務(wù)器傳送時(shí),NAT會(huì)將數(shù)據(jù)報(bào)的源地址轉(zhuǎn)換為一個(gè)可以在互聯(lián)網(wǎng)上路由的合法IP地址,并且把這個(gè)轉(zhuǎn)換前后的兩個(gè)IP都記錄到系統(tǒng)的一張映射表中。當(dāng)外部網(wǎng)絡(luò)發(fā)送數(shù)據(jù)報(bào)到這個(gè)終端,NAT會(huì)根據(jù)映射表中剛才記錄的映射關(guān)系找到數(shù)據(jù)報(bào)要到達(dá)的終端的內(nèi)部IP地址,然后修改接受來的數(shù)據(jù)報(bào)的首部的目的地址,最后將數(shù)據(jù)報(bào)發(fā)送給內(nèi)部地址對應(yīng)的終端。2)傳輸在網(wǎng)絡(luò)間的數(shù)據(jù)報(bào)頭的格式網(wǎng)絡(luò)間傳輸數(shù)據(jù)的基本單元是數(shù)據(jù)報(bào)(Datagram),每個(gè)數(shù)據(jù)報(bào)都包含一個(gè)報(bào)頭(header)和數(shù)據(jù)本身,其中報(bào)頭描述了數(shù)據(jù)的目的地以及和其它數(shù)據(jù)之間的關(guān)系。IP數(shù)據(jù)報(bào)是TCP/IP協(xié)議定義在因特網(wǎng)上傳輸?shù)囊环N數(shù)據(jù)報(bào),首部的前部分是固定長度,共20字節(jié),是所有IP數(shù)據(jù)報(bào)必須具有的,這里面有四位就是用來存放數(shù)據(jù)報(bào)源地址和目的地址的,源地址和目的地址都是IP地址,大概格式如圖1-1所示:圖1-1數(shù)據(jù)報(bào)格式NAT技術(shù)就是對IP數(shù)據(jù)報(bào)的這兩個(gè)部分進(jìn)行操作,以達(dá)到私有地址與公有地址的轉(zhuǎn)換。1.2NAT實(shí)現(xiàn)技術(shù)的分類1)靜態(tài)地址轉(zhuǎn)換靜態(tài)地址轉(zhuǎn)換(StaticAddressTranslation,SAT)是把內(nèi)部網(wǎng)絡(luò)私有IP地址轉(zhuǎn)換為公有IP地址,這種轉(zhuǎn)換是一對一的,這種轉(zhuǎn)換方式形成的是一張固定不變的映射表,某個(gè)私有IP地址只能轉(zhuǎn)換為某個(gè)公有IP地址。借助于靜態(tài)轉(zhuǎn)換,可以實(shí)現(xiàn)外部網(wǎng)絡(luò)對內(nèi)部網(wǎng)絡(luò)中某些特定設(shè)備的訪問。2)動(dòng)態(tài)地址轉(zhuǎn)換動(dòng)態(tài)地址轉(zhuǎn)換(DynamicAddressTranslation,DAT)是NAT轉(zhuǎn)換器具有一個(gè)公有地址池,在這個(gè)地址池中有多個(gè)公有地址,當(dāng)一個(gè)私有地址主機(jī)要與外部通信時(shí),動(dòng)態(tài)NAT轉(zhuǎn)換器從地址池中動(dòng)態(tài)分配一個(gè)未使用的公有地址,在公有地址與私有地址間形成一種暫時(shí)的映射關(guān)系,并保存這種映射關(guān)系,然后進(jìn)行地址轉(zhuǎn)換,當(dāng)通信結(jié)束時(shí),NAT轉(zhuǎn)換器將解除這種暫時(shí)的映射關(guān)系,釋放出公有地址,以供下一個(gè)轉(zhuǎn)換使用[3]。3)端口復(fù)用動(dòng)態(tài)地址轉(zhuǎn)換端口復(fù)用動(dòng)態(tài)地址轉(zhuǎn)換(PAT,PortAddressTranslation),用的是公有地址的一個(gè)端口對應(yīng)一個(gè)私有地址,建立公有地址端口與私有地址之間的映射關(guān)系[2],這時(shí)內(nèi)部網(wǎng)絡(luò)的所有主機(jī)均可共享一個(gè)合法外部IP地址,這個(gè)方法可以有效的節(jié)省IP地址資源,同時(shí)又可以隱藏網(wǎng)絡(luò)內(nèi)部的所有主機(jī)。所以這種NAT技術(shù)是現(xiàn)在最為常用的技術(shù)。1.3NAT技術(shù)的應(yīng)用1)NAT技術(shù)在地址轉(zhuǎn)換方面的應(yīng)用假如校園網(wǎng)中有兩間計(jì)算機(jī)課室,每間計(jì)算機(jī)課室配備60臺(tái)PC機(jī),一棟辦公樓,有幾十臺(tái)辦公PC機(jī),有1臺(tái)Web服務(wù)器和1臺(tái)E-mail服務(wù)器,計(jì)算機(jī)課室和辦公樓都要求能夠上互聯(lián)網(wǎng),兩臺(tái)服務(wù)器要求對內(nèi)外開放。學(xué)校現(xiàn)有8個(gè)C類的IP地址(IP地址是01至08,掩碼為),這顯然是不夠用,為了達(dá)到校園網(wǎng)的建設(shè)目標(biāo),采用了NAT技術(shù)的解決方案[2]。拓?fù)鋱D如圖1-2所示:圖1-2學(xué)校局域網(wǎng)拓?fù)鋱D2)NAT技術(shù)在負(fù)荷均衡方面的應(yīng)用NAT負(fù)載均衡將一個(gè)外部地址映射為多個(gè)內(nèi)部IP地址,對每次連接請求動(dòng)態(tài)地轉(zhuǎn)換為一個(gè)內(nèi)部服務(wù)器的地址,將外部連接請求引到轉(zhuǎn)換得到地址的那個(gè)服務(wù)器上,從而達(dá)到負(fù)載均衡的目的?NAT負(fù)載均衡可以通過軟硬件方式來實(shí)現(xiàn),通過軟件方式來實(shí)現(xiàn)NAT負(fù)載均衡的設(shè)備往往受到帶寬及系統(tǒng)本身處理能力的限制,由于NAT比較接近網(wǎng)絡(luò)的低層,因此就可以將它集成在硬件設(shè)備中,通常這樣的硬件設(shè)備是第四層交換機(jī)和專用負(fù)載均衡器,第四層交換機(jī)的一項(xiàng)重要功能就是NAT負(fù)載均衡?實(shí)例:現(xiàn)有一臺(tái)有一個(gè)串行接口和一個(gè)Ethernet接口的路由器,Ethernet口連接到內(nèi)部網(wǎng)絡(luò),內(nèi)部網(wǎng)絡(luò)上有三臺(tái)web服務(wù)器,但都只是低端配置,為了處理好來自Internet上大量的web連接請求,因此需要在此路由器上做NAT負(fù)載均衡配置,把發(fā)送到web服務(wù)器合法InternetIP地址的報(bào)文轉(zhuǎn)換成這三臺(tái)服務(wù)器的內(nèi)部本地地址?2Linux下的NAT服務(wù)器功能介紹2.1硬件實(shí)現(xiàn)Linux下的NAT在實(shí)際使用中,NAT服務(wù)器可以硬件實(shí)現(xiàn),例如新疆農(nóng)業(yè)大學(xué)的校園局域網(wǎng),就是用這種技術(shù)實(shí)現(xiàn)的,具體使用的是端口復(fù)用動(dòng)態(tài)地址轉(zhuǎn)換方式,原理如圖2-1所示:圖2.1硬件實(shí)現(xiàn)NAT原理圖2.2Linux下iptable實(shí)現(xiàn)NAT在Linux下使用iptables也可以實(shí)現(xiàn)NAT功能,包括靜態(tài)地址轉(zhuǎn)換、動(dòng)態(tài)地址轉(zhuǎn)換、端口復(fù)用動(dòng)態(tài)地址轉(zhuǎn)換,三種方式都可以實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換功能。而這個(gè)課題研究的是利用軟件程序來完成NAT的基本功能,是在Linux系統(tǒng)上實(shí)現(xiàn)的一個(gè)簡單的可以實(shí)現(xiàn)地址轉(zhuǎn)換的系統(tǒng),利用Linux內(nèi)核通用架構(gòu)netfilter的特點(diǎn)來實(shí)現(xiàn)該系統(tǒng)主要功能,基于Linux的NAT實(shí)現(xiàn)的主要功能有:對內(nèi)部終端發(fā)來的數(shù)據(jù)包進(jìn)行處理,修改數(shù)據(jù)包頭部的源IP地址,即是將私有地址轉(zhuǎn)化為合法的公有地址,外部發(fā)送數(shù)據(jù)到內(nèi)部終端,終端可以接收到數(shù)據(jù)。3基于Linux的NAT模塊設(shè)計(jì)和實(shí)現(xiàn)分析3.1基于Linux的NAT服務(wù)器功能模塊設(shè)計(jì)圖3-1NAT服務(wù)器功能模塊示意圖NAT服務(wù)器功能模塊設(shè)計(jì)如圖3-1所示,內(nèi)部主機(jī)發(fā)送數(shù)據(jù),到達(dá)NAT服務(wù)器,經(jīng)過第一模塊——獲取數(shù)據(jù),獲取數(shù)據(jù)模塊獲取到數(shù)據(jù)后,會(huì)將數(shù)據(jù)包的IP地址取出;結(jié)果會(huì)被數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),第二模塊——檢測NAT表模塊會(huì)在系統(tǒng)的IP映射表里查找,如果查到該內(nèi)部主機(jī)已經(jīng)映射過IP,則直接用這個(gè)映射IP地址,這時(shí)不會(huì)進(jìn)入決定映射這個(gè)模塊,如果沒有映射記錄,進(jìn)入決定映射模塊,系統(tǒng)為其決定映射地址;系統(tǒng)進(jìn)入第四模塊——修改地址模塊,該模塊會(huì)修改數(shù)據(jù)包的源地址IP;數(shù)據(jù)到達(dá)轉(zhuǎn)發(fā)數(shù)據(jù)模塊,經(jīng)該模塊轉(zhuǎn)發(fā)到Internet服務(wù)器。Internet服務(wù)器發(fā)送數(shù)據(jù)到內(nèi)部主機(jī)的過程則是,修改地址模塊修改數(shù)據(jù)包的目的地址即可,其他模塊工作與上面的相同。3.2基于Linux的NAT地址轉(zhuǎn)換的基本流程為了形象的說明流程,我用一個(gè)具體的例子來說明該系統(tǒng)設(shè)計(jì)的流程:當(dāng)這臺(tái)計(jì)算機(jī)向Internet上的服務(wù)器6發(fā)出請求,如圖3-2所示:圖3-2內(nèi)部主機(jī)發(fā)送數(shù)據(jù)NAT流程圖Internet服務(wù)器6接到該數(shù)據(jù)包,并以該包的源地址(3)作為數(shù)據(jù)包的目的地址,發(fā)送數(shù)據(jù),流程如圖3-3所示:圖3-3Internet發(fā)送數(shù)據(jù)到內(nèi)部主機(jī)流程分析圖3.3NAT服務(wù)器實(shí)現(xiàn)采用的技術(shù)方案系統(tǒng)開發(fā)使用的基礎(chǔ)環(huán)境是Linux-內(nèi)核,Linux作為服務(wù)器端,也就是NAT運(yùn)行端,編譯工具是Gcc工具4.6.3的版本。3.3.1netfilternetfilter是Linux核心中一個(gè)通用架構(gòu),它提供了一系列的"表"(tables),每個(gè)表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數(shù)條規(guī)則(rule)組成,在2.4/2.6內(nèi)核的Linux中的防火墻代碼netfilter中支持源NAT(SNAT)和目的NAT(DNAT)。netfilter的架構(gòu)就是在整個(gè)網(wǎng)絡(luò)流程的若干位置放置了一些檢測點(diǎn)(HOOK),而在每個(gè)檢測點(diǎn)上登記了一些處理函數(shù)進(jìn)行處理(如包過濾,NAT等,甚至可以是用戶自定義的功能)。NAT操作是以netfilter節(jié)點(diǎn)形式掛接在相應(yīng)的處理點(diǎn)上的函數(shù)為基礎(chǔ),DNAT掛接在NF_IP_PRE_ROUTING點(diǎn)上,優(yōu)先級高于FILTER低于MANGLE,表示在mangle表后處理,但在filter表前處理數(shù)據(jù)包;SNAT掛在NF_IP_POST_ROUTING點(diǎn)上,優(yōu)先級低于FILTER,表示在filter表后面處理數(shù)據(jù)包。目的NAT的hook節(jié)點(diǎn):/*Beforepacketfiltering,changedestination*/staticstructnf_hook_opsip_nat_in_ops={{NULL,NULL},ip_nat_fn,PF_INET,NF_IP_PRE_ROUTING,NF_IP_PRI_NAT_DST};源NAT的hook節(jié)點(diǎn):/*Afterpacketfiltering,changesource*/staticstructnf_hook_opsip_nat_out_ops={{NULL,NULL},ip_nat_out,PF_INET,NF_IP_POST_ROUTING,NF_IP_PRI_NAT_SRC};netfilter的架構(gòu)就是在整個(gè)網(wǎng)絡(luò)流程的若干位置放置了一些檢測點(diǎn)(HOOK),而在每個(gè)檢測點(diǎn)上登記了一些處理函數(shù)進(jìn)行處理[12]:IP層的五個(gè)HOOK點(diǎn)的位置如下:NF_IP_PRE_ROUTING:剛剛進(jìn)入網(wǎng)絡(luò)層的數(shù)據(jù)包通過此點(diǎn)(剛剛進(jìn)行完版本號,校驗(yàn)和等檢測),目的地址轉(zhuǎn)換在此點(diǎn)進(jìn)行;NF_IP_LOCAL_IN:經(jīng)路由查找后,送往本機(jī)的通過此檢查點(diǎn),INPUT包過濾在此點(diǎn)進(jìn)行;NF_IP_FORWARD:要轉(zhuǎn)發(fā)的包通過此檢測點(diǎn),FORWORD包過濾在此點(diǎn)進(jìn)行;NF_IP_POST_ROUTING:所有馬上要通過網(wǎng)絡(luò)設(shè)備出去的包通過此檢測點(diǎn),內(nèi)置的源地址轉(zhuǎn)換功能(包括地址偽裝)在此點(diǎn)進(jìn)行;NF_IP_LOCAL_OUT:本機(jī)進(jìn)程發(fā)出的包通過此檢測點(diǎn),OUTPUT包過濾在此點(diǎn)進(jìn)行。(6)netfilter的返回值有5種:返回值含義NF_DROP丟棄該數(shù)據(jù)包NF_ACCEPT保留該數(shù)據(jù)包NF_STOLEN忘掉該數(shù)據(jù)包NF_QUEUE將該數(shù)據(jù)包插入到用戶空間NF_REPEAT再次調(diào)用該hook函數(shù)3.3.2NAT實(shí)現(xiàn)的三條規(guī)則鏈nat表有三條缺省的"鏈"(chains),這三條鏈也是規(guī)則的容器,它們分別是:PREROUTING:可以在這里定義進(jìn)行目的NAT的規(guī)則,因?yàn)槁酚善鬟M(jìn)行路由時(shí)只檢查數(shù)據(jù)包的目的ip地址,所以為了使數(shù)據(jù)包得以正確路由,我們必須在路由之前就進(jìn)行目的NAT。POSTROUTING:可以在這里定義進(jìn)行源NAT的規(guī)則,系統(tǒng)在決定了數(shù)據(jù)包的路由以后在執(zhí)行該鏈中的規(guī)則。OUTPUT:定義對本地產(chǎn)生的數(shù)據(jù)包的目的NAT規(guī)則。3.3.3基于Linux的NAT實(shí)現(xiàn)對操作系統(tǒng)的要求要在Linux操作系統(tǒng)下完成簡單的NAT系統(tǒng),對Linux操作系統(tǒng)本身也有要求,其實(shí)Linux系統(tǒng)本身帶有NAT功能,利用netfilter中的iptable設(shè)置來實(shí)現(xiàn)了地址轉(zhuǎn)換功能,而這里是要自己來編寫內(nèi)核代碼來實(shí)現(xiàn)NAT功能,代替掉Linux本身的。要實(shí)現(xiàn)自己的NAT功能,首先考慮直接用iptables是否可以配置出來,然后考慮通過開發(fā)應(yīng)用程序來設(shè)置netfilter模塊完成該功能;都不能實(shí)現(xiàn)的情況下再考慮修改Linux內(nèi)核的netfilter模塊以達(dá)成目標(biāo)。我的設(shè)計(jì)主要是利用Linux下的netfilter通用架構(gòu),利用netfilter提供給的檢測點(diǎn),自己編寫代碼,編譯到內(nèi)核當(dāng)中去,替代原來的NAT實(shí)現(xiàn),netfilter架構(gòu)包含的檢測點(diǎn)可以實(shí)現(xiàn)對數(shù)據(jù)到來的檢測和獲取,綜合運(yùn)用NAT的三條規(guī)則鏈以實(shí)現(xiàn)功能。4基于Linux的NAT服務(wù)器功能模塊實(shí)現(xiàn)在第三章中已經(jīng)簡單介紹了系統(tǒng)的五個(gè)功能模塊和幾個(gè)模塊的關(guān)系,這一章中就要對每個(gè)模塊是如何實(shí)現(xiàn)的做簡單的介紹。4.1獲取數(shù)據(jù)模塊的實(shí)現(xiàn)當(dāng)一個(gè)數(shù)據(jù)包經(jīng)過Linux內(nèi)核的網(wǎng)絡(luò)堆棧時(shí),它穿過了幾個(gè)hook點(diǎn),在這里,數(shù)據(jù)包可以被分析并且選擇是保留還是丟棄,這些hook點(diǎn)就是netfilterfilter有五個(gè)鉤子函數(shù),其中就有可以截取數(shù)據(jù)的鉤子函數(shù)。如果要注冊一個(gè)鉤子函數(shù),就要先申明一個(gè)nf_hook_ops結(jié)構(gòu)體,然后對其結(jié)構(gòu)體里面的各個(gè)屬性進(jìn)行相應(yīng)的賦值structnf_hook_ops

{structlist_headlist;//鏈表頭,用來把各個(gè)處理函數(shù)組織成一個(gè)表,初始化為{NULL,NULL};nf_hookfn*hook;//我們定義的處理函數(shù)的指針,它的返回值必須為前面所說的幾個(gè)常量之一;intpf;//協(xié)議族,表示這個(gè)HOOK屬于哪個(gè)協(xié)議族;inthooknum;//我們想要注冊的鉤子,取值為五個(gè)鉤子之一;intpriority;//優(yōu)先級

};用于注冊我們的函數(shù)的數(shù)據(jù)結(jié)構(gòu):staticstructnf_hook_opsnfho;注冊的hook函數(shù)的實(shí)現(xiàn)注意細(xì)節(jié):

nfho.priority=NF_IP_PRI_FIRST;/*讓我們的函數(shù)首先執(zhí)行*/

nf_register_hook(&nfho);//將用戶自己定義的鉤子注冊到內(nèi)核中4.2檢測NAT表模塊的實(shí)現(xiàn)對于非初始化連接的數(shù)據(jù)包,即后續(xù)的數(shù)據(jù)包,一旦確定它屬于某個(gè)連接,則可以直接利用連接狀態(tài)里的nat信息來進(jìn)行地址轉(zhuǎn)換;而對于初始數(shù)據(jù)包,必須在nat表里查找相應(yīng)的規(guī)則,確定了地址轉(zhuǎn)換的內(nèi)容后,將這些信息放到連接跟蹤結(jié)構(gòu)的nat參量里面,供后續(xù)的數(shù)據(jù)包使用。所以在NAT獲得數(shù)據(jù)包之后,要進(jìn)行檢測NAT表模塊的檢測。/*循環(huán),嘗試mr參數(shù)所指定的地址/端口范圍,直到能滿足其tuple是唯一的*/while((rptr=find_best_ips_proto_fast(tuple,mr,conntrack,hooknum))!=NULL)(1)當(dāng)內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包經(jīng)過NAT時(shí),該模塊檢測的是這個(gè)內(nèi)部主機(jī)之前有沒有映射記錄,如果有記錄,數(shù)據(jù)包會(huì)直接進(jìn)入修改地址模塊,修改地址模塊修改數(shù)據(jù)包的源地址IP,再將數(shù)據(jù)轉(zhuǎn)發(fā)到Internet服務(wù)器:returndo_bindings(ct,ctinfo,info,hooknum,pskb);這句把數(shù)據(jù)包要做的修改信息返回給系統(tǒng)。當(dāng)Internet服務(wù)器發(fā)送數(shù)據(jù)包經(jīng)過NAT到內(nèi)部主機(jī),檢測NAT表模塊會(huì)在IP映射表中是否有與數(shù)據(jù)包目的IP地址相映射的內(nèi)部主機(jī)IP,沒有找到,系統(tǒng)會(huì)丟棄數(shù)據(jù)包://返回值不是接受就直接返回,數(shù)據(jù)包將被丟棄if(ret!=NF_ACCEPT){WRITE_UNLOCK(&ip_nat_lock);returnret;}如果找到了映射,NAT會(huì)將數(shù)據(jù)包的目的地址IP修改掉,然后把數(shù)據(jù)包信息返回給修改地址模塊://根據(jù)NATinfo信息對數(shù)據(jù)包的相應(yīng)部分進(jìn)行修改returndo_bindings(ct,ctinfo,info,hooknum,pskb);4.3決定映射模塊的實(shí)現(xiàn)決定映射模塊會(huì)自動(dòng)為內(nèi)部主機(jī)分配其可以映射的IP地址,在將數(shù)據(jù)包發(fā)送給下一個(gè)模塊之前將映射關(guān)系記錄到映射表中。/*將所做的地址轉(zhuǎn)換的數(shù)據(jù)結(jié)構(gòu)加入到全局hash表bysource和byipsproto中,如果該地址轉(zhuǎn)換是某地址轉(zhuǎn)換基礎(chǔ)上的再次轉(zhuǎn)換,則用replace_in_hashes替換,反之則用place_in_hashes*/if(in_hashes){ IP_NF_ASSERT(info->bysource.conntrack); replace_in_hashes(conntrack,info);}else{ place_in_hashes(conntrack,info);}4.4修改地址模塊的實(shí)現(xiàn)檢測NAT表模塊會(huì)將數(shù)據(jù)包信息傳給該模塊,信息中包含著是否修改數(shù)據(jù)包的源、目的地址,存放在ip_nat_info結(jié)構(gòu)中。/*根據(jù)所在的hook點(diǎn)判斷轉(zhuǎn)換類型是源地址轉(zhuǎn)換還是目的地址轉(zhuǎn)換,為0(IP_NAT_MANIP_SRC)表示源地址轉(zhuǎn)換,為1(IP_NAT_MANIP_DST)表示目的地址轉(zhuǎn)換*/ enumip_nat_manip_typemaniptype=HOOK2MANIP(hooknum); /*因?yàn)榈刂忿D(zhuǎn)換會(huì)修改數(shù)據(jù)包,所以這里先初始化將其設(shè)置為“未修改”標(biāo)志,后面進(jìn)行數(shù)據(jù)包修改時(shí)再來重置這個(gè)標(biāo)志*/ (*pskb)->nfcache|=NFC_UNKNOWN;修改地址函數(shù):unsignedintip_nat_setup_info(structip_conntrack*conntrack,/*數(shù)據(jù)包的連接狀態(tài)*/conststructip_nat_multi_range*mr,/*轉(zhuǎn)換后的地址池*/unsignedinthooknum)/*hook點(diǎn)*/函數(shù)中進(jìn)行地址轉(zhuǎn)換的部分:do{ /*進(jìn)行地址轉(zhuǎn)換,new_tuple為轉(zhuǎn)換后的地址的tuple*/if(!get_unique_tuple(&new_tuple,&orig_tp,mr,conntrack,hooknum)){ DEBUGP("ip_nat_setup_info:Can'tgetuniquefor%p.\n",conntrack); returnNF_DROP;} /*對new_tuple取反,得到經(jīng)過轉(zhuǎn)換后的應(yīng)答方向的tuple*/ invert_tuplepr(&reply,&new_tuple); /*修改conntrack中的應(yīng)答方向的replytuple,在這之前還要檢查如果該replytuple已經(jīng)在hash表里存在,即被其它連接占用(存在初始方向tuple不同,應(yīng)答方向tuple相同的連接),則還要回頭繼續(xù)修改*/}while(!ip_conntrack_alter_reply(conntrack,&reply)); /*對orig_tp取反,實(shí)際上又得到了原conntrack的reply_tuple*/ invert_tuplepr(&inv_tuple,&orig_tp); /*將所作轉(zhuǎn)換的相關(guān)信息保存到連接狀態(tài)conntrack里,這樣該連接的后續(xù)數(shù)據(jù)包就可以直接利用這些信息進(jìn)行地址轉(zhuǎn)換,不用重新查找nat表了*//*如果是源地址改變(SNAT)*/ if(!ip_ct_tuple_src_equal(&new_tuple,&orig_tp)){ /*Inthisdirection,asourcemanip.*/ info->manips[info->num_manips++]= ((structip_nat_info_manip) {IP_CT_DIR_ORIGINAL,hooknum, IP_NAT_MANIP_SRC,new_tuple.src}); IP_NF_ASSERT(info->num_manips<IP_NAT_MAX_MANIPS); /*在相對的hook點(diǎn)上必然有對應(yīng)的目的地址改變(DNAT)*/ info->manips[info->num_manips++]=((structip_nat_info_manip) {IP_CT_DIR_REPLY,opposite_hook[hooknum],IP_NAT_MANIP_DST,orig_tp.src});/*opposite_hook是求當(dāng)前hook點(diǎn)的對應(yīng)hook點(diǎn)*/ IP_NF_ASSERT(info->num_manips<=IP_NAT_MAX_MANIPS); }/*如果是目的地址改變(DNAT)*/if(!ip_ct_tuple_dst_equal(&new_tuple,&orig_tp)){info->manips[info->num_manips++]=((structip_nat_info_manip){IP_CT_DIR_ORIGINAL,hooknum,IP_NAT_MANIP_DST,reply.src});IP_NF_ASSERT(info->num_manips<IP_NAT_MAX_MANIPS);info->manips[info->num_manips++]=((structip_nat_info_manip){IP_CT_DIR_REPLY,opposite_hook[hooknum],IP_NAT_MANIP_SRC,inv_tuple.src});IP_NF_ASSERT(info->num_manips<=IP_NAT_MAX_MANIPS);}轉(zhuǎn)換后,標(biāo)記一下: info->initialized|=(1<<HOOK2MANIP(hooknum));4.5轉(zhuǎn)發(fā)數(shù)據(jù)模塊的實(shí)現(xiàn)一個(gè)系統(tǒng)只有一個(gè)網(wǎng)卡的時(shí)候,要么它完成接收數(shù)據(jù)功能,要么實(shí)現(xiàn)發(fā)送數(shù)據(jù)功能,而完成一個(gè)數(shù)據(jù)轉(zhuǎn)發(fā),需要雙網(wǎng)卡才能實(shí)現(xiàn),所以我在設(shè)計(jì)的時(shí)候,開啟兩個(gè)虛擬機(jī)來模擬雙網(wǎng)卡的服務(wù)器,一個(gè)用于接收,一個(gè)用于發(fā)送,這個(gè)思想也體現(xiàn)在系統(tǒng)測試中。具體使用的技術(shù),還是netfilter架構(gòu)的檢測點(diǎn)NF_IP_LOCAL_OUT,在該檢測點(diǎn)處可以注冊自己的鉤子函數(shù),也可以使用它本身提供給我們的函數(shù)。4.6測試使用Fedora系統(tǒng)做為服務(wù)器端,本機(jī)Windows可以做為局域網(wǎng)內(nèi)部的一個(gè)終端(也可以稱為客戶端),當(dāng)內(nèi)部終端有上網(wǎng)需求時(shí),數(shù)據(jù)包通過NAT服務(wù)器后,源地址發(fā)生改變,當(dāng)外界網(wǎng)絡(luò)發(fā)送數(shù)據(jù)到內(nèi)部終端時(shí),NAT服務(wù)器會(huì)根據(jù)IP映射表找到數(shù)據(jù)包要去的地方的真正的IP地址。驗(yàn)證數(shù)據(jù)是通過NAT服務(wù)器到達(dá)外網(wǎng)的方法——抓包??梢允褂米グぞ?,也可以手動(dòng)抓包。5結(jié)論設(shè)計(jì)主要完成了簡單的基于Linux的NAT服務(wù)器,系統(tǒng)基本可以實(shí)現(xiàn)私有地址和公有地址(即合法地址的轉(zhuǎn)換)。NAT服務(wù)器可以解決IP地址匱乏問題、負(fù)載均衡問題、偽IP問題、隱藏內(nèi)部終端等。但是使用NAT也會(huì)帶來一些負(fù)面影響,例如使得很多主機(jī)使用同一個(gè)IP地址、使internet變的脆弱、對高層協(xié)議和安全性造成了影響等等。所以在使用NAT技術(shù)的同時(shí)應(yīng)該適當(dāng)采用恰當(dāng)?shù)姆绞絹肀苊馑谋锥?,在最合適的環(huán)境和需求下使用NAT,會(huì)使NAT的功能充分的被利用。

參考文獻(xiàn):[1]nat_百度百科[EB/OL]./view/16102.htm,2012-04-12.[2]謝志強(qiáng).基于NAT技術(shù)在校園網(wǎng)中的應(yīng)用研究[J].電腦知識(shí)與技術(shù),2010,(8):24-27.[3]吳祖民等.Linux下網(wǎng)絡(luò)Socket編程技術(shù)[J].通信與廣播電視,2005,(2):12-16.[4]高翼飛,黃海軍.一種基于linux環(huán)境下NAT技術(shù)的實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2007,(4):43-45.[5]林

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論