Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)摘 要隨著網(wǎng)絡(luò)的逐步普及,網(wǎng)絡(luò)的管理和控制的重要性已經(jīng)越來(lái)越突出,它關(guān)系著網(wǎng)絡(luò)的進(jìn)一步發(fā)展和普及,甚至關(guān)系著網(wǎng)絡(luò)的生存。為了促進(jìn)網(wǎng)絡(luò)的發(fā)展,在現(xiàn)有的技術(shù)條件下,可以開(kāi)發(fā)出成熟的網(wǎng)絡(luò)控制系統(tǒng)對(duì)網(wǎng)絡(luò)進(jìn)行管理和控制??梢酝ㄟ^(guò)對(duì)網(wǎng)絡(luò)的管理和控制為本地網(wǎng)絡(luò)和外部網(wǎng)絡(luò)之間建立一道屏障,從而控制和管理進(jìn)出網(wǎng)絡(luò)的數(shù)據(jù)。網(wǎng)絡(luò)管理控制系統(tǒng)的核心是制定一套完整的網(wǎng)絡(luò)控制指令集和設(shè)計(jì)控制管理的功能模塊。本系統(tǒng)在Linux-2.4.20-8內(nèi)核下完成網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì),使用控制管理命令實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)的管理??刂坪凸芾砟K的設(shè)計(jì)使用了netfilter數(shù)據(jù)控制過(guò)濾機(jī)制來(lái)實(shí)

2、現(xiàn)對(duì)網(wǎng)絡(luò)的管理。模塊可以實(shí)現(xiàn)對(duì)固定端口,網(wǎng)頁(yè)訪問(wèn)以及不同數(shù)據(jù)協(xié)議類型的數(shù)據(jù)進(jìn)行管理和控制。從實(shí)際應(yīng)用中可以得出結(jié)論在Linux-2.4.20-8的內(nèi)核下可以成功的使用netfilter網(wǎng)絡(luò)數(shù)據(jù)控制機(jī)制過(guò)濾和管理進(jìn)出系統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)。本文首先介紹網(wǎng)絡(luò)管理控制系統(tǒng)的一些基本概念以及一些在Linux下的C語(yǔ)言編譯環(huán)境,其次介紹Linux netfilter控制模塊在內(nèi)核中的實(shí)現(xiàn),在此著重介紹了netfilter在IPv4中的結(jié)構(gòu)以及在Linux 2.4.x內(nèi)核中實(shí)現(xiàn),最后介紹了網(wǎng)絡(luò)數(shù)據(jù)管理的策略、模塊編程以及如何設(shè)計(jì)網(wǎng)絡(luò)管理控制的功能模塊。在了解這些技術(shù)的基礎(chǔ)之上,成功的在Linux-2.4.20-8

3、內(nèi)核下開(kāi)發(fā)出一套簡(jiǎn)單的網(wǎng)絡(luò)管理控制模塊。這些模塊通過(guò)程序發(fā)出的控制指令進(jìn)行動(dòng)態(tài)的插入和卸載。這些模塊分別實(shí)現(xiàn)了對(duì)ICMP網(wǎng)絡(luò)數(shù)據(jù),HTTP站點(diǎn),F(xiàn)TP服務(wù)器的管理控制。關(guān)鍵詞:內(nèi)核模塊;數(shù)據(jù)包;netfilterDesign and Development of Simple Internet Management and Controlling System under LinuxAbstractWith the permeation of Internet,the importance of Internet management and controlling becomes more

4、prominent, It is related to the further development and permeation even the existence of Internet. To promote the development of Internet, it is possible to develop a mature Internet controlling system which can be managed and controlled under the current technical conditions. It can build a natural

5、 defense between internal and external network through managing and controlling the data of Internet. It is the core of this system that builds an overall Internet controlling agreement and realizes the model function of controlling and management. This system realizes the management and controlling

6、 of Internet data successfully by doing its design whose modules mainly based on the data controlling and filtering mechanism of Netfilter, under Linux. The modules have success in realizing the data managements. From practice, it concludes that data controlling mechanism of Netfilter can succeed in

7、 managing and filtering the whole data under Linux. This thesis introduces some basic concepts of MCS and edition environment of C language under Linux, firstly. Then it introduced realization of controlling module of Linux, Netfilter in Kernel, which highlight the structure of Netfilter in IPv4 and

8、 realization of Linux. Lastly it mentioned the strategy of MCS modules edition and how to design the function modules of MCS. So one simple modules of MCS of which doing dynamic insertion and suddenly unloading through controlling agreement sent by programs is designed successfully under Linux, foll

9、owing these skills. These modules also realize the management and controlling of ICMP data, HTTP websites and FTP Servers, respectively.Key words: Kernel Module;Packet;Netfilter目 錄論文總頁(yè)數(shù):29頁(yè)1引言11.1課題背景11.2國(guó)內(nèi)外研究現(xiàn)狀11.3課題意義11.4本課題研究方法12Linux開(kāi)發(fā)環(huán)境介紹22.1Linux簡(jiǎn)介22.2Linux下的C語(yǔ)言開(kāi)發(fā)環(huán)境22.3常用的網(wǎng)絡(luò)數(shù)據(jù)控制工具介紹33Linux網(wǎng)絡(luò)管理

10、控制核心技術(shù)53.1SOCKET網(wǎng)絡(luò)編程53.1.1 Linux網(wǎng)絡(luò)編程53.1.2基本套接字函數(shù)53.2基于TCP協(xié)議的通訊73.2.1 TCP傳輸協(xié)議簡(jiǎn)介73.2.2控制字符的制定74NETFILTER-網(wǎng)絡(luò)控制模塊設(shè)計(jì)基礎(chǔ)84.1netfilter介紹84.2netfilter中的重要返回值84.3netfilter在IPv4中的框架94.4netfilter核心模塊104.5netfilter可以實(shí)現(xiàn)的基本控制功能115測(cè)試Linux網(wǎng)絡(luò)管理系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)135.1系統(tǒng)設(shè)計(jì)整體框架135.2用SOCKET實(shí)現(xiàn)控制端和管理端的通訊145.2.1管理端的設(shè)計(jì)與實(shí)現(xiàn)155.2.2控制端的設(shè)計(jì)

11、與實(shí)現(xiàn)165.3用netfilter設(shè)計(jì)控制功能模塊185.3.1設(shè)計(jì)控制ICMP數(shù)據(jù)報(bào)的模塊185.3.2用netflter設(shè)計(jì)管理控制FTP服務(wù)器的模塊205.3.3設(shè)計(jì)控制HTTP網(wǎng)站訪問(wèn)的模塊225.4用GCC編譯生成模塊235.5管理控制系統(tǒng)測(cè)試235.6程序設(shè)計(jì)中遇到的問(wèn)題和解決方法245.6.1解決模塊編譯的環(huán)境問(wèn)題245.6.2解決程序異常退出問(wèn)題255.6.3解決模塊自動(dòng)加載問(wèn)題26結(jié) 論26參考文獻(xiàn)27致 謝28聲 明291 引言1.1 課題背景Linux做為當(dāng)今使用最為廣泛的操作系統(tǒng),在各個(gè)領(lǐng)域都具有非常重要的用途,隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,網(wǎng)絡(luò)數(shù)據(jù)管理和控制系統(tǒng)方面設(shè)計(jì)人

12、才的需求不斷增加。特別是隨著我國(guó)經(jīng)濟(jì)的不斷發(fā)展,網(wǎng)絡(luò)管理控制系統(tǒng)開(kāi)發(fā)方面的人才的需求也越來(lái)越大。通過(guò)這個(gè)課題可以使我們熟悉Linux下的netfilter網(wǎng)絡(luò)數(shù)據(jù)控制過(guò)濾機(jī)制,可以使我們學(xué)會(huì)指定網(wǎng)絡(luò)控制協(xié)議和開(kāi)發(fā)網(wǎng)絡(luò)管理控制模塊的方法。通過(guò)Linux下的簡(jiǎn)單網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā),可以提高實(shí)際的編程能力,特別是網(wǎng)絡(luò)數(shù)據(jù)通訊管理這部分的編程能力。1.2 國(guó)內(nèi)外研究現(xiàn)狀Linux作為一種開(kāi)源的操作系統(tǒng),在國(guó)內(nèi)外享有較高的聲譽(yù),其重要地位是其他操作系統(tǒng)所不可取代的。正是由于Linux操作系統(tǒng)的開(kāi)源性,在國(guó)內(nèi)外各大研究機(jī)構(gòu)對(duì)其進(jìn)行了不斷的開(kāi)發(fā)和完善,逐步形成了今天的Linux操作系統(tǒng),其功能非常

13、強(qiáng)大,運(yùn)行非常穩(wěn)定。國(guó)內(nèi)外均成立了專門的研究機(jī)構(gòu)對(duì)其進(jìn)行開(kāi)發(fā)和研究。而近年來(lái)由于網(wǎng)絡(luò)技術(shù)的興起,Linux系統(tǒng)也發(fā)展為一種可以進(jìn)行資源共享和交互的網(wǎng)絡(luò)平臺(tái)。在資源共享的同時(shí),網(wǎng)絡(luò)的安全已經(jīng)成為科研機(jī)構(gòu)研究的重點(diǎn),并且推出了一系列的網(wǎng)絡(luò)管理控制系統(tǒng),特別是實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)的管理和控制。其中以網(wǎng)絡(luò)數(shù)據(jù)管理和控制過(guò)濾器IPTABLES最為出名??梢哉f(shuō)就目前國(guó)內(nèi)外研究的情況來(lái)看Liunx方面的網(wǎng)絡(luò)管理控制系統(tǒng)的開(kāi)發(fā)技術(shù)已經(jīng)相當(dāng)成熟,并且正在不斷的進(jìn)行完善。1.3 課題意義隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,在越來(lái)越多的領(lǐng)域要用到網(wǎng)絡(luò)控制管理。Linux操作系統(tǒng)是一個(gè)開(kāi)源操作系統(tǒng),對(duì)網(wǎng)絡(luò)管理控制程序的設(shè)計(jì)提供了良好的

14、實(shí)驗(yàn)開(kāi)發(fā)平臺(tái),同時(shí)市場(chǎng)對(duì)Linux下的研發(fā)人員需求也很大。通過(guò)對(duì)Linux網(wǎng)絡(luò)通訊管理控制系統(tǒng)的開(kāi)發(fā),可以提高學(xué)生對(duì)網(wǎng)絡(luò)通訊知識(shí)的了解和實(shí)際網(wǎng)絡(luò)編程的能力,同時(shí)通過(guò)網(wǎng)絡(luò)管理控制模塊功能的設(shè)計(jì),可以熟悉Linux下的網(wǎng)絡(luò)數(shù)據(jù)的過(guò)濾機(jī)制,學(xué)會(huì)運(yùn)用netfilter實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)的管理和控制。因此,該課題具有較好的實(shí)用價(jià)值。1.4 本課題研究方法在Linux-2.4.20-8操作系統(tǒng)平臺(tái)下使用C語(yǔ)言開(kāi)發(fā)環(huán)境。通過(guò)使用netfilter網(wǎng)絡(luò)數(shù)據(jù)包管理控制機(jī)制進(jìn)行網(wǎng)絡(luò)控制模塊功能的開(kāi)發(fā)和編譯,并且運(yùn)用C語(yǔ)言編程開(kāi)發(fā)出可以發(fā)出控制協(xié)議的管理控制平臺(tái)進(jìn)行相應(yīng)的管理和控制模塊的運(yùn)行。其次研究網(wǎng)絡(luò)通訊中的傳輸協(xié)

15、議,以及數(shù)據(jù)報(bào)的傳輸過(guò)程,以及一些可以控制和管理網(wǎng)絡(luò)數(shù)據(jù)的傳輸端口,制定出一套網(wǎng)絡(luò)管理控制協(xié)議,即一套完整的控制字節(jié)。最終在Linux操作系統(tǒng)環(huán)境下實(shí)現(xiàn)完成該網(wǎng)絡(luò)管理控制程序,并且用netfilter實(shí)現(xiàn)控制功能模塊的設(shè)計(jì)。2 Linux開(kāi)發(fā)環(huán)境介紹2.1 Linux簡(jiǎn)介L(zhǎng)inux是開(kāi)源的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。它主要用于基于Intel x86系列CPU的計(jì)算

16、機(jī)上。這個(gè)系統(tǒng)是由全世界各地的成千上萬(wàn)的程序員設(shè)計(jì)和實(shí)現(xiàn)的。其目的是建立不受任何商品化軟件的版權(quán)制約的、全世界都能自由使用的Unix兼容產(chǎn)品。同時(shí)Linux以高效性和靈活性著稱。Linux模塊化的設(shè)計(jì)結(jié)構(gòu),使得它既能在價(jià)格昂貴的工作站上運(yùn)行,也能夠在廉價(jià)的PC機(jī)上實(shí)現(xiàn)全部的Unix特性,具有多任務(wù)、多用戶的能力。Linux是在GNU公共許可權(quán)限下免費(fèi)獲得的,是一個(gè)符合POSIX標(biāo)準(zhǔn)的操作系統(tǒng)。Linux操作系統(tǒng)軟件包不僅包括完整的Linux操作系統(tǒng),而且還包括了文本編輯器、高級(jí)語(yǔ)言編譯器等應(yīng)用軟件。它還包括帶有多個(gè)窗口管理器的X-Windows圖形用戶界面,如同使用Windows NT一樣,允

17、許使用窗口、圖標(biāo)和菜單對(duì)系統(tǒng)進(jìn)行操作。Linux具有:穩(wěn)定、可靠、安全的優(yōu)點(diǎn),并且有強(qiáng)大的網(wǎng)絡(luò)功能。在相關(guān)軟件的支持下,可實(shí)現(xiàn)WWW、FTP、DNS、DHCP、E-mail等服務(wù),還可作為路由器使用,利用IPCHAINS/IPTABLE網(wǎng)絡(luò)管理工具可構(gòu)建NAT及功能全面的防火墻。2.2 Linux下的C語(yǔ)言開(kāi)發(fā)環(huán)境C語(yǔ)言是一種成功的系統(tǒng)描述語(yǔ)言,同時(shí)C語(yǔ)言又是一種通用的程序設(shè)計(jì)語(yǔ)言,在國(guó)際上廣泛流行。它主要有以下一些特點(diǎn):(1)語(yǔ)言表達(dá)能力強(qiáng)。C語(yǔ)言是面向數(shù)據(jù)結(jié)構(gòu)的程序設(shè)計(jì)語(yǔ)言,通用性好。它可以直接處理字符、數(shù)字、地址,可以完成通常由硬件實(shí)現(xiàn)的算術(shù)、邏輯運(yùn)算。它能有效地取代匯編語(yǔ)言來(lái)編寫各種系

18、統(tǒng)軟件和應(yīng)用軟件。最明顯的就是UNIX操作系統(tǒng)。在UNIX操作系統(tǒng)中除了核心內(nèi)部的1000行左右用匯編語(yǔ)言書寫之外,其余的都是用C語(yǔ)言描述的。C語(yǔ)言同樣可以表達(dá)數(shù)值處理、字處理功能,所以它又是一種通用語(yǔ)言。(2)語(yǔ)言簡(jiǎn)潔、緊湊,使用靈活,易于學(xué)習(xí)和使用。C語(yǔ)言共有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,程序書寫形式自由,主要用小寫字母,在表示上力求簡(jiǎn)潔易行,如用一對(duì)來(lái)代替復(fù)合語(yǔ)句begin、end,用賦值運(yùn)算符(如+=,-=,*=等)對(duì)運(yùn)算和賦值的形式進(jìn)行精簡(jiǎn)。(3)數(shù)據(jù)類型豐富,具有很強(qiáng)的結(jié)構(gòu)化控制語(yǔ)句。C語(yǔ)言有簡(jiǎn)單數(shù)據(jù)類型(如整型、浮點(diǎn)型、字符型),在此基礎(chǔ)上產(chǎn)生各種構(gòu)造類型(如數(shù)組、結(jié)構(gòu)體、共用體等

19、),因而C的數(shù)據(jù)類型很豐富。同時(shí),它有各種控制流語(yǔ)句,如if-else、while、for、switch、break等,功能很強(qiáng),能夠描述結(jié)構(gòu)化的程序。(4)語(yǔ)言生成的代碼質(zhì)量高。高級(jí)語(yǔ)言能否用來(lái)描述系統(tǒng)軟件,特別是象操作系統(tǒng)、編譯程序等,除要求語(yǔ)言表達(dá)能力強(qiáng)之外,很重要的一個(gè)因素是語(yǔ)言生成的代碼質(zhì)量如何。如果代碼質(zhì)量低,則系統(tǒng)開(kāi)銷就大,無(wú)實(shí)用價(jià)值。試驗(yàn)表明,針對(duì)同一問(wèn)題用C語(yǔ)言編寫程序,其生成代碼的效率僅比用匯編語(yǔ)言寫的代碼效率低10%20%。由于用高級(jí)語(yǔ)言比用匯編語(yǔ)言描述問(wèn)題編程迅速、工作量小、可讀性好,易于調(diào)試、修改和移植,因此C 語(yǔ)言就成了人們描述系統(tǒng)軟件和應(yīng)用軟件比較理想的工具。(5

20、)語(yǔ)法限制不嚴(yán)格,程序設(shè)計(jì)自由度大。例如,對(duì)數(shù)組下標(biāo)越界不作檢查,由程序編寫者自己保證程序正確。一般的高級(jí)語(yǔ)言語(yǔ)法檢查非常嚴(yán)格,能檢查出幾乎所有的語(yǔ)法錯(cuò)誤。而C語(yǔ)言允許程序編寫者有較大的自由度,放寬了語(yǔ)法檢查。限制與靈活是一對(duì)矛盾,限制嚴(yán)格,就失去靈活性;而強(qiáng)調(diào)靈活,就必然放松限制。程序編寫者要仔細(xì)檢查程序,保證其正確,而不要過(guò)分依賴C編譯程序去查錯(cuò)。(6)可移植性好。用C語(yǔ)言編寫的程序基本上不作修改就能用于各種型號(hào)的計(jì)算機(jī)和各種操作系統(tǒng)。2.3 常用的網(wǎng)絡(luò)數(shù)據(jù)控制工具介紹在Linux系統(tǒng)中經(jīng)常使用的網(wǎng)絡(luò)管理工具是IPTABLES。管理工具iptables是Linux 2.4內(nèi)核用來(lái)安裝、維護(hù)

21、、檢查數(shù)據(jù)包規(guī)則的管理程序。在Linux 2.4網(wǎng)絡(luò)管理控制體系結(jié)構(gòu)中,數(shù)據(jù)處理的規(guī)則可以分為四類:IP輸入鏈(IP input chain)、IP輸出鏈(IP output chain)、IP轉(zhuǎn)發(fā)鏈(IP forward chain)、用戶自定義鏈(user defined chain)。網(wǎng)絡(luò)數(shù)據(jù)控制管理的規(guī)則指定包的格式和目標(biāo)。當(dāng)一個(gè)包進(jìn)來(lái)時(shí),內(nèi)核使用輸入鏈來(lái)決定數(shù)據(jù)包的命運(yùn)。數(shù)據(jù)包沿著輸入鏈一條規(guī)則一條規(guī)則匹配,如果它通過(guò)了輸入鏈的檢查,內(nèi)核將決定包下一步該發(fā)往何處(這一步叫路由)。假如該數(shù)據(jù)包是送往另一臺(tái)機(jī)器的,內(nèi)核就將調(diào)用轉(zhuǎn)發(fā)鏈。數(shù)據(jù)包再沿著轉(zhuǎn)發(fā)鏈一條規(guī)則一條規(guī)則檢查,如果不匹配,就

22、進(jìn)入目標(biāo)值所指定的下一條鏈。這條規(guī)則鏈有可能是用戶自己定義的規(guī)則鏈,或者是一個(gè)特定值:接受(ACCEPT)、否定(DENY)、拒絕(REJECT)、偽裝(MASQ)、重定向(REDIRECT)、返回(RETURN)。 基本的iptables命令一個(gè)iptables命令基本上包含如下五個(gè)部分: 希望工作在哪個(gè)表上 希望使用該表的哪個(gè)鏈 進(jìn)行操作(插入、添加、刪除、修改) 對(duì)特定規(guī)則的目標(biāo)動(dòng)作 匹配數(shù)據(jù)報(bào)條件 iptables基本語(yǔ)法iptables基本語(yǔ)法如下:iptables -t table -Operation chain -j target match(es)例如希望添加一個(gè)規(guī)則,允許所

23、有從任何地方到本地SMTP端口的連接:iptables -t filter -A INPUT -j ACCEPT -p tcp -dport smtp。還有其他的對(duì)規(guī)則進(jìn)行操作的命令如:清空鏈表、設(shè)置鏈缺省策略、添加一個(gè)用戶自定義的鏈。 iptables的一些基本的操作-A 在鏈尾添加一條規(guī)則-I 插入規(guī)則-D 刪除規(guī)則-R 替代一條規(guī)則-L 列出規(guī)則 iptables的一些基本目標(biāo)動(dòng)作,適用于所有的鏈ACCEPT 接收該數(shù)據(jù)報(bào)DROP 丟棄該數(shù)據(jù)報(bào)QUEUE 排隊(duì)該數(shù)據(jù)報(bào)到用戶空間RETURN 返回到前面調(diào)用的鏈Foobar 用戶自定義的鏈 iptables的一些基本匹配條件, 適用于所有的

24、鏈-p 指定協(xié)議(tcp/udp/icmp/)-s 源地址(ip address/masklen)-d 目的地址(ip address/masllen)-I 數(shù)據(jù)報(bào)輸入接口-o 數(shù)據(jù)報(bào)輸出接口除了基本的操作,匹配和目標(biāo)還具有各種擴(kuò)展。這里只對(duì)iptables進(jìn)行簡(jiǎn)單的討論,關(guān)于iptables的詳細(xì)使用,可以參考man iptables的手冊(cè),也可以參考netfilter的核心開(kāi)發(fā)者Paul Russell寫的Packet Filtering HOW-TO 和NAT HOW-TO.3 Linux網(wǎng)絡(luò)管理控制核心技術(shù)3.1 SOCKET網(wǎng)絡(luò)編程3.1.1 Linux網(wǎng)絡(luò)編程Socket(套接字)

25、是通過(guò)標(biāo)準(zhǔn)的UNIX文件描述符和其它程序通訊的一個(gè)方法。每一個(gè)套接字都用一個(gè)半相關(guān)描述:協(xié)議,本地地址、本地端口來(lái)表示;一個(gè)完整的套接字則用一個(gè)相關(guān)描述:協(xié)議,本地地址、本地端口、遠(yuǎn)程地址、遠(yuǎn)程端口,每一個(gè)套接字都有一個(gè)本地的由操作系統(tǒng)分配的唯一的套接字號(hào)。3.1.2 基本套接字函數(shù)函數(shù)socket():這個(gè)函數(shù)定義為int socket(int domain,int type,int protocol),參數(shù)domain指定要?jiǎng)?chuàng)建的套接字的協(xié)議族,可以是如下值:AF_UNIX /UNIX域協(xié)議族,本機(jī)的進(jìn)程間通訊時(shí)使用AF_INET /Internet協(xié)議族(TCP/IP)參數(shù)type指定套

26、接字類型,可以是如下值:SOCK_STREAM /流套接字,面向連接的和可靠的通信類型SOCK_DGRAM /數(shù)據(jù)報(bào)套接字,非面向連接的和不可靠的通信類型SOCK_RAW /原始套接字,只對(duì)Internet協(xié)議有效,可以用來(lái)直接訪問(wèn)IP協(xié)議參數(shù)protocol通常設(shè)置成0,表示使用默認(rèn)協(xié)議,如Internet協(xié)議族的流套接字使用TCP協(xié)議,而數(shù)據(jù)報(bào)套接字使用UDP協(xié)議。當(dāng)套接字是原始套接字類型時(shí),需要指定參數(shù)protocol,因?yàn)樵继捉幼謱?duì)多種協(xié)議有效,如ICMP和IGMP等。Linux系統(tǒng)中創(chuàng)建一個(gè)套接字的操作主要是:在內(nèi)核中創(chuàng)建一個(gè)套接字?jǐn)?shù)據(jù)結(jié)構(gòu),然后返回一個(gè)套接字描述符標(biāo)識(shí)這個(gè)套接字?jǐn)?shù)

27、據(jù)結(jié)構(gòu)。這個(gè)套接字?jǐn)?shù)據(jù)結(jié)構(gòu)包含連接的各種信息,如對(duì)方地址、TCP狀態(tài)以及發(fā)送和接收緩沖區(qū)等等,TCP協(xié)議根據(jù)這個(gè)套接字?jǐn)?shù)據(jù)結(jié)構(gòu)的內(nèi)容來(lái)控制這條連接。函數(shù)connect():這個(gè)函數(shù)定義為int connect(int sockfd,struct sockaddr * servaddr,int addrlen);參數(shù)sockfd是函數(shù)socket返回的套接字描述符;參數(shù)servaddr指定遠(yuǎn)程服務(wù)器的套接字地址,包括服務(wù)器的IP地址和端口號(hào);參數(shù)addrlen指定這個(gè)套接字地址的長(zhǎng)度。成功時(shí)返回0,否則返回-1,并設(shè)置全局變量為以下任何一種錯(cuò)誤類型:ETIMEOUT、ECONNREFUSED、E

28、HOSTUNREACH或ENETUNREACH。在調(diào)用函數(shù)connect之前,客戶機(jī)需要指定服務(wù)器進(jìn)程的套接字地址。客戶機(jī)一般不需要指定自己的套接字地址(IP地址和端口號(hào)),系統(tǒng)會(huì)自動(dòng)從1024至5000的端口號(hào)范圍內(nèi)為它選擇一個(gè)未用的端口號(hào),然后以這個(gè)端口號(hào)和本機(jī)的IP地址填充這個(gè)套接字地址??蛻魴C(jī)調(diào)用函數(shù)connect來(lái)主動(dòng)建立連接。這個(gè)函數(shù)將啟動(dòng)TCP協(xié)議的3次握手過(guò)程。在建立連接之后或發(fā)生錯(cuò)誤時(shí)函數(shù)返回。函數(shù)bind():這個(gè)函數(shù)將本地地址與套接字綁定在一起,其定義為:int bind(int sockfd,struct sockaddr * myaddr,int addrlen);參

29、數(shù)sockfd是函數(shù)sockt返回的套接字描述符;參數(shù)myaddr是本地地址;參數(shù)addrlen是套接字地址結(jié)構(gòu)的長(zhǎng)度。執(zhí)行成功時(shí)返回0,否則,返回-1,并設(shè)置全局變量errno為錯(cuò)誤類型EADDRINUSER。服務(wù)器和客戶機(jī)都可以調(diào)用函數(shù)bind來(lái)綁定套接字地址,但一般是服務(wù)器調(diào)用函數(shù)bind來(lái)綁定自己的公認(rèn)端口號(hào)函數(shù)listen():函數(shù)listen將一個(gè)套接字轉(zhuǎn)換為征聽(tīng)套接字,定義為:int listen(int sockfd,int backlog)參數(shù)sockfd指定要轉(zhuǎn)換的套接字描述符;參數(shù)backlog設(shè)置請(qǐng)求隊(duì)列的最大長(zhǎng)度;執(zhí)行成功時(shí)返回0, 否則返回-1。函數(shù)listen功能

30、有兩個(gè):(1)將一個(gè)尚未連接的主動(dòng)套接字(函數(shù)socket創(chuàng)建的可以用來(lái)進(jìn)行主動(dòng)連接但不能接受連接請(qǐng)求的套接字)轉(zhuǎn)換成一個(gè)被動(dòng)連接套接字。執(zhí)行l(wèi)isten之后,服務(wù)器的TCP狀態(tài)由CLOSED轉(zhuǎn)為L(zhǎng)ISTEN狀態(tài);(2)TCP協(xié)議將到達(dá)的連接請(qǐng)求隊(duì)列,函數(shù)listen的第二個(gè)參數(shù)指定這個(gè)隊(duì)列的最大長(zhǎng)度。函數(shù)accept():函數(shù)accept從征聽(tīng)套接字的完成隊(duì)列中接收一個(gè)已經(jīng)建立起來(lái)的TCP連接。如果完成連接隊(duì)列為空,那么這個(gè)進(jìn)程睡眠。int accept(int sockfd,struct sockaddr * addr,int * addrlen)參數(shù)sockfd指定征聽(tīng)套接字描述符;參數(shù)

31、addr為指向一個(gè)Internet套接字地址結(jié)構(gòu)的指針;參數(shù)addrlen為指向一個(gè)整型變量的指針。執(zhí)行成功時(shí),返回3個(gè)結(jié)果:函數(shù)返回值為一個(gè)新的套接字描述符,標(biāo)識(shí)這個(gè)接收的連接;參數(shù)addr指向的結(jié)構(gòu)變量中存儲(chǔ)客戶機(jī)地址;參數(shù)addrlen指向的整型變量中存儲(chǔ)客戶機(jī)地址的長(zhǎng)度。失敗時(shí)返回-1。當(dāng)函數(shù)accept阻塞等待已經(jīng)建立的連接時(shí),如果進(jìn)程捕獲到信號(hào),函數(shù)將以錯(cuò)誤返回,錯(cuò)誤類型為EINTR。對(duì)于這種錯(cuò)誤,一般重新調(diào)用函數(shù)accept來(lái)接收連接。函數(shù)close():函數(shù)close關(guān)閉一個(gè)套接字描述符。定義如為:int close(int sockfd);執(zhí)行成功時(shí)返回0,否則返回-1。與操

32、作文件描述符的close一樣,函數(shù)close將套接字描述符的引用計(jì)數(shù)器減1,如果描述符的引用計(jì)數(shù)大于0,則表示還有進(jìn)程引用這個(gè)描述符,函數(shù)close正常返回;如果為0,則啟動(dòng)清除套接字描述符的操作,函數(shù)close立即正常返回。調(diào)用close之后,進(jìn)程將不再能夠訪問(wèn)這個(gè)套接字,但TCP協(xié)議將繼續(xù)使用這個(gè)套接字,將尚未發(fā)送的數(shù)據(jù)傳遞到對(duì)方,然后發(fā)送FIN數(shù)據(jù)段,執(zhí)行關(guān)閉操作,一直等到這個(gè)TCP連接完全關(guān)閉之后,TCP協(xié)議才刪除該套接字。3.2 基于TCP協(xié)議的通訊3.2.1 TCP傳輸協(xié)議簡(jiǎn)介在Linux網(wǎng)絡(luò)管理控制系統(tǒng)的設(shè)計(jì)中,為了使系統(tǒng)制定的控制管理字符能夠順利的傳輸?shù)街鳈C(jī)進(jìn)行相關(guān)的操作,系統(tǒng)

33、采用了TCP協(xié)議為傳輸控制指令的載體。TCP是一套可靠的傳輸協(xié)議,其采用三次握手的方式建立連接:1.請(qǐng)求端發(fā)送一個(gè)SYN段指明客戶打算連接的服務(wù)器的端口,以及初始序列號(hào)ISN。2.服務(wù)器發(fā)回包含服務(wù)器的初始序列號(hào)的SYN報(bào)文段作為應(yīng)答。同時(shí),將確認(rèn)序號(hào)設(shè)置為客戶的ISN加1以客戶的SYN報(bào)文段進(jìn)行確認(rèn)。一個(gè)SYN將占用一個(gè)序號(hào)。3.客戶必須將確認(rèn)序號(hào)設(shè)置為服務(wù)器的ISN加1以對(duì)服務(wù)器的SYN報(bào)文段進(jìn)行確認(rèn)。TCP這三個(gè)報(bào)文段完成連接的建立,也就是三次握手。3.2.2 控制字符的制定當(dāng)TCP連接建立成功后,控制字節(jié)就包含在TCP報(bào)文的數(shù)據(jù)部分發(fā)送出去,接收端通過(guò)對(duì)TCP數(shù)據(jù)報(bào)的解析,取出數(shù)據(jù)部分

34、的控制字節(jié)進(jìn)行相關(guān)的操作。系統(tǒng)制定的通過(guò)TCP協(xié)議傳輸?shù)目刂谱止?jié)可以完成以下網(wǎng)絡(luò)控制功能:當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符a時(shí),系統(tǒng)編譯加載所有的網(wǎng)絡(luò)控制模塊;當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符f時(shí),系統(tǒng)丟棄所有進(jìn)出網(wǎng)絡(luò)的ICMP數(shù)據(jù)包;當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符i時(shí),系統(tǒng)接收所有進(jìn)出網(wǎng)絡(luò)的ICMP數(shù)據(jù)包;當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符t時(shí),系統(tǒng)禁止訪問(wèn)FTP服務(wù)器;當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符p時(shí),系統(tǒng)允許訪問(wèn)FTP服務(wù)器;當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符c時(shí),系統(tǒng)禁止瀏覽HTTP網(wǎng)頁(yè);當(dāng)收到TCP報(bào)文段中的數(shù)據(jù)部分為字符o時(shí),系統(tǒng)允許瀏覽HTTP網(wǎng)頁(yè);當(dāng)收

35、到TCP報(bào)文段中的數(shù)據(jù)部分為字符r時(shí),系統(tǒng)卸載所有功能模塊。攜帶控制信息的完整TCP協(xié)議報(bào)文結(jié)構(gòu)圖如下:圖1 采用TCP協(xié)議傳輸控制字節(jié)數(shù)據(jù)報(bào)TCP報(bào)文段攜帶控制字符通過(guò)socket傳輸?shù)牧鞒虉D如下:控制字符TCP頭 數(shù)據(jù)部分TCP頭 控制數(shù)據(jù)TCP 頭TCP 數(shù)據(jù)部分控制字符控制數(shù)據(jù)Socket建立連接圖2 采用TCP協(xié)議傳輸控制字節(jié)數(shù)據(jù)報(bào)4 NETFILTER-網(wǎng)絡(luò)控制模塊設(shè)計(jì)基礎(chǔ)4.1 netfilter介紹Netfilter比以前任何一版Linux內(nèi)核的網(wǎng)絡(luò)管理控制子系統(tǒng)都要完善強(qiáng)大。Netfilter提供了一個(gè)抽象、通用化的框架,該框架定義的一個(gè)子功能的實(shí)現(xiàn)就是包過(guò)濾控制子系統(tǒng)。Ne

36、tfilter框架包含以下三部分:1.給網(wǎng)絡(luò)協(xié)議(IPv4、IPv6等)定義一套鉤子函數(shù)(IPv4定義了5個(gè)鉤子函數(shù)),這些鉤子函數(shù)在數(shù)據(jù)報(bào)流過(guò)協(xié)議棧的幾個(gè)關(guān)鍵點(diǎn)被調(diào)用。在這幾個(gè)點(diǎn)中,協(xié)議棧將把數(shù)據(jù)報(bào)及鉤子函數(shù)標(biāo)號(hào)作為參數(shù)調(diào)用netfilter框架。2.內(nèi)核的任何模塊可以對(duì)每種協(xié)議的一個(gè)或多個(gè)鉤子進(jìn)行注冊(cè),實(shí)現(xiàn)掛接,這樣當(dāng)某個(gè)數(shù)據(jù)包被傳遞給netfilter框架時(shí),內(nèi)核能檢測(cè)是否有任何模塊對(duì)該協(xié)議和鉤子函數(shù)進(jìn)行了注冊(cè)。若注冊(cè)了,則調(diào)用該模塊的注冊(cè)時(shí)使用的回調(diào)函數(shù),這樣這些模塊就有機(jī)會(huì)檢查(可能還會(huì)修改)該數(shù)據(jù)包、丟棄該數(shù)據(jù)包及指示netfilter將該數(shù)據(jù)包傳入用戶空間的隊(duì)列。3.那些排隊(duì)的數(shù)

37、據(jù)包是被傳遞給用戶空間的異步地進(jìn)行處理。一個(gè)用戶進(jìn)程能檢查數(shù)據(jù)包,修改數(shù)據(jù)包,甚至可以重新將該數(shù)據(jù)包通過(guò)離開(kāi)內(nèi)核的同一個(gè)鉤子函數(shù)中注入到內(nèi)核中。 所有的包過(guò)濾/NAT等等都基于該框架。內(nèi)核網(wǎng)絡(luò)代碼中不再有到處都是的、混亂的修改數(shù)據(jù)包的代碼了。當(dāng)前netfilter框架在IPv4、IPv6及Decnet網(wǎng)絡(luò)棧中被實(shí)現(xiàn)4.2 netfilter中的重要返回值內(nèi)核模塊可以對(duì)一個(gè)或多個(gè)鉤子函數(shù)進(jìn)行注冊(cè)掛接,并且在數(shù)據(jù)報(bào)經(jīng)過(guò)這些鉤子函數(shù)時(shí)被調(diào)用,從而模塊可以修改這些數(shù)據(jù)報(bào),并向netfilter返回如下值: NF_ACCEPT 繼續(xù)正常傳輸數(shù)據(jù)報(bào)。 NF_DROP丟棄該數(shù)據(jù)報(bào),不再傳輸。 NF_STOL

38、EN 模塊接管該數(shù)據(jù)報(bào),不要繼續(xù)傳輸該數(shù)據(jù)報(bào)。 NF_QUEUE對(duì)該數(shù)據(jù)報(bào)進(jìn)行排隊(duì)(通常用于將數(shù)據(jù)報(bào)給用戶空間的進(jìn)程進(jìn)行處理) 。 NF_REPEAT 再次調(diào)用該鉤子函數(shù)。4.3 netfilter在IPv4中的框架一個(gè)數(shù)據(jù)在通過(guò)netfilter框架時(shí),它將經(jīng)過(guò)圖3所示的過(guò)程。圖3 netfilter框架示意圖從圖中可以看到netfilter框架共有五個(gè)鉤子函數(shù),分別為: NF_IP_PRE_ROUTING NF_IP_LOCAL_IN NF_IP_FORWARD NF_IP_POST_ROUTING NF_IP_LOCAL_OUT當(dāng)數(shù)據(jù)報(bào)經(jīng)過(guò)了完整性檢查后,數(shù)據(jù)報(bào)就從左邊進(jìn)入系統(tǒng),進(jìn)行IP

39、校驗(yàn)以后,數(shù)據(jù)報(bào)經(jīng)過(guò)第一個(gè)鉤子函數(shù)NF_IP_PRE_ROUTING1進(jìn)行處理;然后就進(jìn)入路由代碼,其決定該數(shù)據(jù)報(bào)是需要轉(zhuǎn)發(fā)還是發(fā)給本機(jī);若該數(shù)據(jù)報(bào)是發(fā)給本機(jī),則該數(shù)據(jù)報(bào)經(jīng)過(guò)鉤子函數(shù)NF_IP_LOCAL_IN2處理以后然后傳遞給上層協(xié)議;若該數(shù)據(jù)報(bào)應(yīng)該被轉(zhuǎn)發(fā)則它被NF_IP_FORWARD3處理;經(jīng)過(guò)轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)經(jīng)過(guò)最后一個(gè)鉤子函數(shù)NF_IP_POST_ROUTING4處理以后,再傳輸?shù)骄W(wǎng)絡(luò)上。本地產(chǎn)生的數(shù)據(jù)經(jīng)過(guò)鉤子函數(shù)NF_IP_LOCAL_OUT 5處理以后,進(jìn)行路由選擇處理,然后經(jīng)過(guò)NF_IP_POST_ROUTING4處理以后發(fā)送到網(wǎng)絡(luò)上。由此可見(jiàn),五個(gè)HOOK的位置,掌管了全部數(shù)據(jù)

40、包的可能出入口,我們只要在對(duì)應(yīng)的位置對(duì)數(shù)據(jù)報(bào)進(jìn)行操作,就能實(shí)現(xiàn)對(duì)數(shù)據(jù)報(bào)的各種處理。IPv4代碼中netfilter的接口。IPv4 協(xié)議棧為了實(shí)現(xiàn)對(duì) netfilter 架構(gòu)的支持,在數(shù)據(jù)報(bào)經(jīng)過(guò) IPv4 協(xié)議棧的過(guò)程中,仔細(xì)選擇了五個(gè)參考點(diǎn):NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT,分別對(duì)應(yīng)IP層五個(gè)不同的位置。在這五個(gè)參考點(diǎn)上,各引入了一行對(duì) NF_HOOK() 宏函數(shù)的一個(gè)相應(yīng)的調(diào)用。在netfilter.h定義了NF_HOOK() 宏函數(shù)。對(duì)于NF_HOOK宏的定義

41、提煉如下:#ifdef CONFIG_NETFILTER#define NF_HOOK(pf,hook,skb,indev,outdev,okfn)(list_empty(&nf_hooks(pf)(hook) ?(okfn)(skb):nf_hook_slow(pf),(hook),(skb),(indev),(outdev),(okfn)#else /* !CONFIG_NETFILTER */#define NF_HOOK(pf,hook,skb,indev,outdev,okfn) (okfn)(skb)#endif /* CONFIG_NETFILTER */當(dāng)CONFIG_NETF

42、ILTER被定義的時(shí)候,就轉(zhuǎn)去調(diào)用 nf_hook_slow() 函數(shù);如果CONFIG_NETFILTER沒(méi)有被定義,則從netfilter模塊轉(zhuǎn)回到IPv4協(xié)議棧繼續(xù)往下處理。這樣用戶在編譯kernel時(shí)可以通過(guò)定義 CONFIG_NETFILTER與否來(lái)決定是否把 netfilter 代碼編譯進(jìn)內(nèi)核。從函數(shù)的名稱來(lái)看,也可以把IPv4協(xié)議棧上的這五個(gè)參考點(diǎn),形象的看成是五個(gè)鉤子。當(dāng)數(shù)據(jù)報(bào)在IPv4協(xié)議棧上途經(jīng)這五個(gè)鉤子時(shí),就會(huì)被netfilter模塊釣上來(lái),進(jìn)行處理并根據(jù)返回值來(lái)決定數(shù)據(jù)報(bào)的下一步命運(yùn),繼續(xù)傳輸或者丟棄。4.4 netfilter核心模塊 鉤子函數(shù)和參考點(diǎn)如果netfil

43、ter的鉤子函數(shù)被調(diào)用,數(shù)據(jù)包就進(jìn)入nf_hook_slow()函數(shù)的處理。此函數(shù)主要是根據(jù)nf_hooks 數(shù)組開(kāi)始處理數(shù)據(jù)包。更準(zhǔn)確一點(diǎn)來(lái)說(shuō),上文所說(shuō)的IPv4協(xié)議棧上的五個(gè)參考點(diǎn),并不是防火墻鉤子函數(shù),而是在此點(diǎn)允許放置防火墻鉤子函數(shù)。在每一個(gè)參考點(diǎn),都可以讓netfilter放置一個(gè)或多個(gè)處理函數(shù),來(lái)處理經(jīng)過(guò)參考點(diǎn)的數(shù)據(jù)包,而netfilter的鉤子函數(shù)則放在了nf_hooks 數(shù)組里面。這些鉤子函數(shù)用struct nf_hook_ops給予描述,其聲明如下:struct nf_hook_opsstruct list_head list;nf_hookfn * hook;int pf;

44、int hooknum;int priority;在使用netfilter實(shí)現(xiàn)管理功能的模塊初始過(guò)程中,它會(huì)調(diào)用nf_register_hook()向netfilter的核心代碼注冊(cè)鉤子函數(shù)。在這個(gè)注冊(cè)的過(guò)程中,也就是將鉤子函數(shù)放在參考點(diǎn)的的過(guò)程。鉤子函數(shù)的具體位置,由nf_hooks數(shù)組的下標(biāo)具體說(shuō)明。 mymodules函數(shù)對(duì)于netfilter所提供的框架,這些鉤子函數(shù)都將會(huì)調(diào)用mymodules函數(shù)。該函數(shù)執(zhí)行完后,將返回通用的防火墻策略之一,如NF_ACCEPT等。該函數(shù)原型如下:unsigned int mymodules( struct sk_buff * *pskb,unsig

45、ned int hook,const struct net_device * in, const struct net_device * out,struct ipt_table * table,void * userdata)此函數(shù)的參數(shù)介紹如下: struct sk_buff * * pskb:傳入的待處理的網(wǎng)絡(luò)協(xié)議包。 unsigned int hook:在哪個(gè)鉤子點(diǎn)處理該數(shù)據(jù)包。 const struct net_device * in:網(wǎng)絡(luò)包傳入的網(wǎng)絡(luò)設(shè)備名。 const struct net_device * out:網(wǎng)絡(luò)包傳出的網(wǎng)絡(luò)設(shè)備名。 struct ipt_table *

46、table:用戶定義的規(guī)則表。用戶定義的規(guī)則表,經(jīng)過(guò)一些處理后送到核心空間,核心空間將用一些數(shù)據(jù)結(jié)構(gòu)進(jìn)行標(biāo)識(shí)。在netfiter框架中,一條規(guī)則分為三部分,由三個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)代表:struct ipt_entry:主要用來(lái)匹配IP頭。struct ip_match:額外的匹配(TCP頭、MAC地址等)。struct ip_target:除默認(rèn)的動(dòng)作外(如:NF_ACCEPT、NF_DROP),還可以增加新的動(dòng)作(如:NF_REJECT)。mymodules() 函數(shù)就是按照規(guī)則表中存儲(chǔ)的一條又一條的規(guī)則來(lái)處理數(shù)據(jù)包。但并不是所有的規(guī)則都一一來(lái)匹配數(shù)據(jù)包,數(shù)據(jù)包只與相應(yīng)的參考點(diǎn)的規(guī)則相匹配。這個(gè)機(jī)

47、制,就為每個(gè)規(guī)則表實(shí)現(xiàn)了多個(gè)規(guī)則鏈,而每個(gè)規(guī)則鏈上又有多個(gè)規(guī)則。 匹配和目標(biāo)匹配(match)是iptables命令的可選部分,它用于匹配數(shù)據(jù)包的源地址/源端口、目的地址/目的端口、協(xié)議等。匹配分為兩大類:通用匹配和特定于協(xié)議的匹配。目目標(biāo)是由規(guī)則指定的操作,對(duì)與那些規(guī)則匹配的數(shù)據(jù)包執(zhí)行這些操作。除了默認(rèn)的目標(biāo)之外,還增加新的目標(biāo)選項(xiàng)。4.5 netfilter可以實(shí)現(xiàn)的基本控制功能.包過(guò)濾包過(guò)濾的控制模塊不會(huì)對(duì)數(shù)據(jù)包進(jìn)行修改,只對(duì)數(shù)據(jù)包進(jìn)行過(guò)濾。它通過(guò)鉤子函數(shù)NF_IP_LOCAL_IN、NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架。對(duì)于任何一個(gè)數(shù)據(jù)報(bào)

48、只有一個(gè)地方對(duì)其進(jìn)行過(guò)濾。Iptables相對(duì)ipchains是一個(gè)巨大的改進(jìn),因?yàn)樵趇pchains中一個(gè)被轉(zhuǎn)發(fā)的數(shù)據(jù)報(bào)會(huì)遍歷三條鏈。包過(guò)濾框架示意圖如下:圖4 控制管理包過(guò)濾模塊框架示意圖.NAT網(wǎng)絡(luò)地址轉(zhuǎn)換通過(guò)NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT三個(gè)鉤子函數(shù)接入netfilter框架。網(wǎng)絡(luò)地址轉(zhuǎn)換只對(duì)新連接的第一個(gè)數(shù)據(jù)包進(jìn)行轉(zhuǎn)換,隨后的數(shù)據(jù)包將根據(jù)第一個(gè)數(shù)據(jù)包的結(jié)果進(jìn)行同樣的轉(zhuǎn)換處理,其分為源地址轉(zhuǎn)換和目的地址轉(zhuǎn)換。NF_IP_PRE_ROUTING實(shí)現(xiàn)對(duì)轉(zhuǎn)發(fā)的數(shù)據(jù)包的源地址進(jìn)行地址轉(zhuǎn)換,NF_IP_POST_ROUTI

49、NG對(duì)轉(zhuǎn)發(fā)的數(shù)據(jù)包的目的地址進(jìn)行地址轉(zhuǎn)換,對(duì)于本地?cái)?shù)據(jù)報(bào)的目的地址的轉(zhuǎn)換則由NF_IP_LOCAL_OUT來(lái)實(shí)現(xiàn)。地址轉(zhuǎn)換框架圖如下:圖5 地址轉(zhuǎn)換框架示意圖.數(shù)據(jù)包處理通過(guò)鉤子函數(shù)NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT接入netfilter框架。包處理可以實(shí)現(xiàn)對(duì)數(shù)據(jù)報(bào)的修改或給數(shù)據(jù)報(bào)附上一些帶外數(shù)據(jù)。在框架中的鉤子點(diǎn)一和鉤子點(diǎn)五進(jìn)行處理,即在下圖中的MANGLE處進(jìn)行處理。包過(guò)濾框架示意圖如下:圖6 包處理框架示意圖.連線跟蹤連線跟蹤(Connection Tracking)是包過(guò)濾、地址轉(zhuǎn)換的基礎(chǔ),但其又作為一個(gè)獨(dú)立的模塊在運(yùn)行,有了連線跟蹤,動(dòng)態(tài)包過(guò)濾及地址轉(zhuǎn)

50、換才能得以實(shí)現(xiàn)。連線跟蹤的工作原理是:檢測(cè)第一個(gè)有效連接的狀態(tài),并根據(jù)這些信息決定網(wǎng)絡(luò)數(shù)據(jù)包是否能夠通過(guò)netfilter功能模塊。連線跟蹤在netfilter框架中NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_POST_ROUTING、NF_IP_LOCAL_OUT的四個(gè)地方被采用,連線跟蹤的框架示意圖如下:圖7 連線跟蹤框架示意圖5 測(cè)試Linux網(wǎng)絡(luò)管理系統(tǒng)的設(shè)計(jì)實(shí)現(xiàn)5.1 系統(tǒng)設(shè)計(jì)整體框架Linux網(wǎng)絡(luò)控制管理框架主要分為兩個(gè)部分:管理部分,控制部分。首先管理部分通過(guò)在本機(jī)發(fā)送相應(yīng)的管理命令即管理控制口令對(duì)系統(tǒng)進(jìn)行管理和控制,這個(gè)部分擁有一套完整的控制指

51、令,控制指令是通過(guò)TCP數(shù)據(jù)報(bào)發(fā)送出去的。控制部分又分為三部分:接受控制字節(jié);解釋字節(jié)控制模塊;控制模塊的加載執(zhí)行;此系統(tǒng)具有一些比較常用的網(wǎng)絡(luò)管理控制功能。可以實(shí)現(xiàn)的管理控制功能包括對(duì)網(wǎng)絡(luò)上ICMP數(shù)據(jù)包的收發(fā),F(xiàn)TP服務(wù)器資源通訊,HTTP網(wǎng)頁(yè)的訪問(wèn)。Linux網(wǎng)絡(luò)管理控制系統(tǒng)的結(jié)構(gòu)圖8:管理端控制端ICMP的管理控制FTP的管理控制HTTP的管理控制ICMP數(shù)據(jù)報(bào)FTP服務(wù)器HTTP網(wǎng)頁(yè)訪問(wèn)通過(guò)TCP通訊圖8網(wǎng)絡(luò)管理系統(tǒng)結(jié)構(gòu)圖5.2 用SOCKET實(shí)現(xiàn)控制端和管理端的通訊整個(gè)管理控制系統(tǒng)的框架是用socket套接字編程開(kāi)發(fā)出來(lái)的,主要是通過(guò)TCP建立起管理端和控制端的通訊。管理端通過(guò)TC

52、P建立通訊發(fā)送控制字節(jié),而控制端在收到TCP數(shù)據(jù)報(bào)后根據(jù)接收到的控制指令去操作控制模塊執(zhí)行相關(guān)的網(wǎng)絡(luò)控制。在本系統(tǒng)的設(shè)計(jì)中主要是控制進(jìn)出網(wǎng)絡(luò)的ICMP數(shù)據(jù)報(bào),F(xiàn)TP服務(wù)器的訪問(wèn)控制,HTTP網(wǎng)頁(yè)的訪問(wèn)控制。在設(shè)計(jì)過(guò)程中網(wǎng)絡(luò)套接字的端口均是采用的TCP 4112端口,并且為了方便對(duì)設(shè)計(jì)效果的檢測(cè),控制端的IP地址設(shè)為本機(jī)的IP地址:99.Socket通訊的具體流程為:通訊建立的具體過(guò)程為:1.管理端輸入控制端的IP地址,向控制端請(qǐng)求建立連接。然后控制端開(kāi)始監(jiān)聽(tīng)。管理端把控制字符寫進(jìn)sendbuff 這個(gè)數(shù)組里面,通過(guò)send()函數(shù)發(fā)送出去。2.控制端通過(guò)recv()函數(shù)

53、接受管理端發(fā)來(lái)的控制字符,并且把字符寫進(jìn)recvbuff 里面。3.控制端再根據(jù)相應(yīng)的控制字符去執(zhí)行具體操作。4.通訊完后關(guān)閉套接字:close()Socket通訊的具體流程圖為:圖9 socket通訊流程圖5.2.1 管理端的設(shè)計(jì)與實(shí)現(xiàn)管理端一個(gè)用戶管理界面,管理端通過(guò)發(fā)送連接請(qǐng)求與控制端建立連接,從而可以通過(guò)TCP發(fā)送控制字節(jié)去控制相關(guān)的操作。其核心的代碼和注釋為:/建立一個(gè)基本的套接字,使用的是INET協(xié)議族,TCP套接字,0表示基本套接字sockfd=socket(AF_INET,SOCK_STREAM,0);/通過(guò)sizeof取地址長(zhǎng)度,并且調(diào)用bzero把地址結(jié)構(gòu)清零bzero(&

54、serveraddr,sizeof(serveraddr);/表示地址結(jié)構(gòu)類型是INET的地址結(jié)構(gòu)類型serveraddr.sin_family=AF_INET;/使用的端口是4114端口,并且用htons轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序serveraddr.sin_port=htons(4114);inet_pton(AF_INET,argv1,&serveraddr.sin_addr);/使用connect函數(shù)連接sockfd套接字connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr);/用recv接受管理界面中recvbuff發(fā)過(guò)來(lái)

55、的數(shù)據(jù)recv(sockfd,recvbuff,sizeof(recvbuff),0);scanf(%c,&w);while(w!=q)/把w的值寫進(jìn)sebuff數(shù)組的一個(gè)空間里面通過(guò)send發(fā)送給控制界面sebuff0=w;send(sockfd,sebuff,1,0);scanf(%c,&w);switch(w)./關(guān)閉套接字Close(); 5.2.2 控制端的設(shè)計(jì)與實(shí)現(xiàn)控制端為一個(gè)后臺(tái)執(zhí)行程序,控制端在和管理端建立連接后,接收來(lái)自控制端的TCP數(shù)據(jù)報(bào),并且根據(jù)數(shù)據(jù)報(bào)中的控制字節(jié)控制相應(yīng)的功能模塊執(zhí)行具體的網(wǎng)絡(luò)控制操作。其核心的代碼和注釋為:/定義一個(gè)接受緩沖區(qū)數(shù)組char resbuf

56、f5;/定義兩個(gè)套接字,一個(gè)為監(jiān)聽(tīng)套接字,一個(gè)為連接套接字int listensock,connsock;/定義一個(gè)sockaddr_in類型的變量serveraddr.struct sockaddr_in serveraddr;/定義一個(gè)buff存儲(chǔ)hello.const char buff=hellorn;/初始化listensock套接字listensock=socket(AF_INET,SOCK_STREAM,0);/地址結(jié)構(gòu)清零bzero(&serveraddr,sizeof(serveraddr);/使用INET結(jié)構(gòu)的地址的數(shù)據(jù)結(jié)構(gòu)serveraddr.sin_family=AF_INET;/允許任意地址進(jìn)行連接serveraddr.sin_addr.s_addr=htonl(INADD

溫馨提示

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

評(píng)論

0/150

提交評(píng)論