版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第17章 netfilter框架內(nèi)報(bào)文處理17.1 netfilter17.2 iptables和netfilter17.3 內(nèi)核模塊編程17.4 5個(gè)鉤子點(diǎn)17.5 注冊(cè)/注銷(xiāo)鉤子17.6 鉤子的簡(jiǎn)單處理例子17.7 一點(diǎn)多個(gè)鉤子的優(yōu)先級(jí)17.8 校驗(yàn)和問(wèn)題教學(xué)要求掌握:內(nèi)核模塊編程、 5個(gè)鉤子點(diǎn)、注冊(cè)/注銷(xiāo)鉤子、鉤子的簡(jiǎn)單處理例子了解: Netfilter、iptables第17章 netfilter框架內(nèi)報(bào)文處理17.1 ne17.1 netfilter17.1.1 netfilter簡(jiǎn)介17.1.2 netfilter框架17.1.3 netfilter檢查時(shí)的表格17.1.4 net
2、filter的規(guī)則17.1 netfilter17.1.1 netfilt 接收網(wǎng)絡(luò)數(shù)據(jù)recv()網(wǎng)絡(luò)數(shù)據(jù)接收依次經(jīng)過(guò)網(wǎng)卡驅(qū)動(dòng)和協(xié)議棧程序,以DM9000A網(wǎng)卡為例進(jìn)行介紹接收數(shù)據(jù)的過(guò)程。 接收網(wǎng)絡(luò)數(shù)據(jù)recv()網(wǎng)絡(luò)數(shù)據(jù)接收依次經(jīng)過(guò)網(wǎng)卡驅(qū)動(dòng)和協(xié) 發(fā)送網(wǎng)絡(luò)數(shù)據(jù)send()Linux對(duì)網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送過(guò)程的處理與接收過(guò)程相反。在一端對(duì)socket進(jìn)行write()的過(guò)程中,首先會(huì)把要write的字符串緩沖區(qū)整理成msghdr的數(shù)據(jù)結(jié)構(gòu)形式,然后調(diào)用sock_sendmsg()把msghdr的數(shù)據(jù)傳送至inet層。對(duì)于msghdr結(jié)構(gòu)中數(shù)據(jù)區(qū)中的每個(gè)數(shù)據(jù)包,創(chuàng)建sk_buff結(jié)構(gòu),填充數(shù)據(jù),掛至發(fā)
3、送隊(duì)列。一層層往下層協(xié)議傳遞。 發(fā)送網(wǎng)絡(luò)數(shù)據(jù)send()Linux對(duì)網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送過(guò)程的處linux教程-第17章-netfilter框架內(nèi)報(bào)文處理17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 3.2的內(nèi)核中,netfilter中共有5個(gè)鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 系統(tǒng)提供修改網(wǎng)絡(luò)流程點(diǎn)Linux內(nèi)核中還提供了一種靈活修改網(wǎng)絡(luò)數(shù)據(jù)的
4、機(jī)制,用戶(hù)可以利用這種機(jī)制獲得和修改內(nèi)核層的網(wǎng)絡(luò)數(shù)據(jù)和屬性設(shè)置。白色的框?yàn)榫W(wǎng)絡(luò)數(shù)據(jù)的流向,協(xié)議棧按照正常的方式進(jìn)行處理和傳遞。Linux內(nèi)核在網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)的多個(gè)地點(diǎn)設(shè)置了檢查點(diǎn),當(dāng)?shù)竭_(dá)檢查點(diǎn)的時(shí)候,會(huì)檢查這些點(diǎn)上是否有用戶(hù)設(shè)置的處理方法,按照用戶(hù)的處理規(guī)則對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行處理后,數(shù)據(jù)會(huì)再次按照正常的網(wǎng)絡(luò)流程傳遞。 系統(tǒng)提供修改網(wǎng)絡(luò)流程點(diǎn)Linux內(nèi)核中還提供了一種靈活修改linux教程-第17章-netfilter框架內(nèi)報(bào)文處理17.4.1 netfilter的5個(gè)鉤子點(diǎn)17.4.1 netfilter的5個(gè)鉤子點(diǎn)17.1.1 netfilter簡(jiǎn)介L(zhǎng)inux環(huán)境下的防火墻技術(shù)從2.0的內(nèi)核版本
5、到目前的3.5版本經(jīng)歷了若干的技術(shù)革新,逐步發(fā)展起來(lái)。在Linux kernel 2.3系列的開(kāi)發(fā)過(guò)程中形成了目前netfilter的主要架構(gòu)。用戶(hù)空間的防火墻管理工具,也相應(yīng)地發(fā)展為iptables。netfilter/iptables的組合方式使用戶(hù)構(gòu)建防火墻更加簡(jiǎn)單,相對(duì)于2.2內(nèi)核中的防火墻,用戶(hù)可以不用編寫(xiě)或者修改Linux的內(nèi)核程序(盡管此類(lèi)工作正變得越來(lái)越簡(jiǎn)單)。17.1.1 netfilter簡(jiǎn)介L(zhǎng)inux環(huán)境下的防火17.1.2 netfilter框架netfilter在Linux內(nèi)核中的IPv4、IPv6和DECnet等網(wǎng)絡(luò)協(xié)議棧中都有相應(yīng)的實(shí)現(xiàn)。本書(shū)將只介紹其中讓大多數(shù)讀
6、者朋友們感興趣的IPv4協(xié)議棧上netfilter的實(shí)現(xiàn)。IPv4協(xié)議棧為了實(shí)現(xiàn)對(duì)netfilter架構(gòu)的支持,在IP包的IPv4協(xié)議棧上的傳遞過(guò)程之中,選擇了5個(gè)檢查點(diǎn)。在這5個(gè)檢查點(diǎn)上,各引入了一行對(duì)NF_HOOK()宏函數(shù)的一個(gè)相應(yīng)的調(diào)用。這5個(gè)參考點(diǎn)被分別命名為PREROUTING、LOCAL-IN、FORWARD、LOCAL-OUT和POSTROUTING。17.1.2 netfilter框架netfilter在L17.1.3 netfilter檢查時(shí)的表格netfilter在檢查點(diǎn)進(jìn)行檢查,先查看回調(diào)函數(shù)的合法性,然后根據(jù)協(xié)議方式?jīng)Q定是否調(diào)用。當(dāng)滿足條件時(shí),調(diào)用用戶(hù)掛接的回調(diào)函數(shù)。
7、netfilter的檢查是基于表格進(jìn)行的,iptables用結(jié)構(gòu)ipt_table表示。17.1.3 netfilter檢查時(shí)的表格netfilt17.1.4 netfilter的規(guī)則netfilter的規(guī)則用結(jié)構(gòu)struct ipt_entry來(lái)表示17.1.4 netfilter的規(guī)則netfilter的17.2 iptables和netfilter17.2.1 iptables簡(jiǎn)介17.2.2 iptables的表和鏈17.2.3 使用iptables設(shè)置過(guò)濾規(guī)則17.2 iptables和netfilter17.2.117.2.1 iptables簡(jiǎn)介netfilter的強(qiáng)大功能和靈活
8、性是通過(guò)iptables界面來(lái)實(shí)現(xiàn)的。iptables使用netfilter子系統(tǒng)來(lái)增進(jìn)網(wǎng)絡(luò)連接、檢驗(yàn)和處理方面的能力。使用iptables的第一步是啟動(dòng)iptables服務(wù)。在通常的系統(tǒng)中,可以使用以下命令進(jìn)行:$service iptables start17.2.1 iptables簡(jiǎn)介netfilter的強(qiáng)大17.2.2 iptables的表和鏈iptables的主要構(gòu)成是表,iptables的操作是對(duì)iptables上的表的操作。iptables內(nèi)置了3個(gè)表:nat、mangle和filter。默認(rèn)情況下是指對(duì)FILTER表的操作。1nat表2MANGLE表3filter表17.2.
9、2 iptables的表和鏈iptables的主linux教程-第17章-netfilter框架內(nèi)報(bào)文處理1nat表nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換。網(wǎng)絡(luò)數(shù)據(jù)包通過(guò)NAT操作后,數(shù)據(jù)包的地址發(fā)生了改變,這種改變是根據(jù)所定義的規(guī)則進(jìn)行的。1nat表nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換。網(wǎng)絡(luò)數(shù)據(jù)包通過(guò)2MANGLE表MANGLE表的主要作用用來(lái)對(duì)數(shù)據(jù)包進(jìn)行標(biāo)記。MANGLE表有5個(gè)內(nèi)建的鏈:PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD。2MANGLE表MANGLE表的主要作用用來(lái)對(duì)數(shù)據(jù)包進(jìn)行標(biāo)3filter表filter表是專(zhuān)門(mén)過(guò)濾包的,內(nèi)建3個(gè)鏈,可以對(duì)包進(jìn)
10、行DROP、LOG、ACCEPT和REJECT等操作。3filter表filter表是專(zhuān)門(mén)過(guò)濾包的,內(nèi)建3個(gè)鏈,17.2.3 使用iptables設(shè)置過(guò)濾規(guī)則通過(guò)向防火墻提供有關(guān)對(duì)來(lái)自某個(gè)源、到某個(gè)目的地或具有特定協(xié)議類(lèi)型的信息包要做些什么的指令、對(duì)信息包進(jìn)行過(guò)濾。通過(guò)使用netfilter/iptables系統(tǒng)提供的特殊命令iptables,建立這些規(guī)則,并將規(guī)則加到內(nèi)核空間內(nèi)特定信息包的過(guò)濾表內(nèi)的鏈上。$ iptables -t table command match target1表(table)2命令(command)3匹配(match)4目標(biāo)(target)17.2.3 使用ipta
11、bles設(shè)置過(guò)濾規(guī)則通過(guò)向防火墻linux教程-第17章-netfilter框架內(nèi)報(bào)文處理1表(table)-t table選項(xiàng)允許使用標(biāo)準(zhǔn)表之外的任何表。表是包含僅處理特定類(lèi)型信息包的規(guī)則和鏈的信息包過(guò)濾表。有3種可用的表選項(xiàng):filter、nat和mangle。該選項(xiàng)不是必需的,如果未指定,則filter用做默認(rèn)表。1表(table)-t table選項(xiàng)允許使用標(biāo)準(zhǔn)表之2命令(command)上面這條命令中具有強(qiáng)制性的command部分是iptables命令的最重要部分。它告訴iptables命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。以下是最常用的一些命令:2命令(co
12、mmand)上面這條命令中具有強(qiáng)制性的comm3匹配(match)iptables命令的可選match部分指定信息包與規(guī)則匹配所應(yīng)具有的特征(如源和目的地地址、協(xié)議等)。匹配分為兩大類(lèi):通用類(lèi)型匹配和特定協(xié)議的匹配。3匹配(match)iptables命令的可選match部4目標(biāo)(target)目標(biāo)是規(guī)則所描述的操作。當(dāng)數(shù)據(jù)包與規(guī)則匹配的時(shí)候,則對(duì)數(shù)據(jù)包執(zhí)行相應(yīng)的操作。ACCEPTDROPREJECRETURN4目標(biāo)(target)目標(biāo)是規(guī)則所描述的操作。當(dāng)數(shù)據(jù)包與規(guī)17.3 內(nèi)核模塊編程17.3.1 內(nèi)核“Hello World!”程序17.3.2 內(nèi)核模塊的基本架構(gòu)17.3.3 內(nèi)核模塊加
13、載和卸載過(guò)程17.3.4 內(nèi)核模塊初始化和清理函數(shù)17.3.5 內(nèi)核模塊初始化和清理過(guò)程的容錯(cuò)處理17.3.6 內(nèi)核模塊編譯所需的Makefile17.3 內(nèi)核模塊編程17.3.1 內(nèi)核“Hello W17.3.1 內(nèi)核“Hello World!”程序本節(jié)通過(guò)一個(gè)“Hello World”例子對(duì)內(nèi)核模塊程序設(shè)計(jì)進(jìn)行介紹。1內(nèi)核的“Hello World”例子2內(nèi)核模塊和應(yīng)用程序的調(diào)試和函數(shù)的不同17.3.1 內(nèi)核“Hello World!”程序本節(jié)通過(guò)17.3.2 內(nèi)核模塊的基本架構(gòu)17.3.1節(jié)的程序展示了內(nèi)核模塊的基本架構(gòu),如圖17.4所示,一個(gè)Linux內(nèi)核模塊包含如下幾個(gè)部分,其中陰影
14、的部分編寫(xiě)內(nèi)核模塊時(shí)必須具有。1模塊初始化函數(shù)2模塊清除函數(shù)3模塊許可證聲明、作者、模塊描述信息等聲明4模塊可導(dǎo)出符號(hào)表5模塊加載參數(shù)17.3.2 內(nèi)核模塊的基本架構(gòu)17.3.1節(jié)的程序展示了1模塊初始化函數(shù)使用命令insmod或者modprobe加載內(nèi)核模塊的時(shí)候,會(huì)自動(dòng)調(diào)用模塊的初始化函數(shù),進(jìn)行模塊的初始化,主要是資源申請(qǐng)。1模塊初始化函數(shù)使用命令insmod或者modprobe加2模塊清除函數(shù)使用命令rmmod卸載內(nèi)核模塊的時(shí)候,模塊清除函數(shù)會(huì)自動(dòng)調(diào)用,進(jìn)行模塊退出之前的清理工作,主要是狀態(tài)重置和資源釋放。2模塊清除函數(shù)使用命令rmmod卸載內(nèi)核模塊的時(shí)候,模塊清3模塊許可證聲明、作者、
15、模塊描述信息等聲明盡管沒(méi)有強(qiáng)制要求必須聲明許可證,但是在進(jìn)行模塊編寫(xiě)的時(shí)候最好指定。內(nèi)核可以識(shí)別如下4種許可方式:GPL、Dual BSD/GPL、Dual MPL/GPL、Proprietary。沒(méi)有采用以上許可證方式的聲明則假定為私有的,內(nèi)核加載這種模塊會(huì)被“污染”。3模塊許可證聲明、作者、模塊描述信息等聲明盡管沒(méi)有強(qiáng)制要求4模塊可導(dǎo)出符號(hào)表與用戶(hù)空間編程時(shí)的庫(kù)類(lèi)似,內(nèi)核模塊中也可以調(diào)用其他模塊中的例程,或者允許其他模塊調(diào)用本模塊中的函數(shù)。insmod的加載過(guò)程包含的一個(gè)步驟就是把允許導(dǎo)出的符號(hào)加到公共內(nèi)核符號(hào)表中,或者使用公共內(nèi)核符號(hào)表來(lái)解析加載模塊中未定義的符號(hào)。4模塊可導(dǎo)出符號(hào)表與用
16、戶(hù)空間編程時(shí)的庫(kù)類(lèi)似,內(nèi)核模塊中也可5模塊加載參數(shù)用戶(hù)空間的應(yīng)用程序可以接受用戶(hù)的參數(shù),Linux的內(nèi)核模塊在加載的時(shí)候也可以加載參數(shù)。在“Hello World”模塊中可以修改模塊初始化時(shí)的打印語(yǔ)句為:printk(KERN_ALERT Hello %s n, target);5模塊加載參數(shù)用戶(hù)空間的應(yīng)用程序可以接受用戶(hù)的參數(shù),Lin17.3.3 內(nèi)核模塊加載和卸載過(guò)程內(nèi)核模塊的加載過(guò)程分為用戶(hù)空間動(dòng)作和內(nèi)核空間動(dòng)作:用戶(hù)空間負(fù)責(zé)內(nèi)核模塊加載準(zhǔn)備;內(nèi)核空間負(fù)責(zé)復(fù)制、檢查和內(nèi)核模塊初始化等工作。內(nèi)核加載時(shí),用戶(hù)輸入命令insmod后,會(huì)調(diào)用init_module()。17.3.3 內(nèi)核模塊加載
17、和卸載過(guò)程內(nèi)核模塊的加載過(guò)程分為17.3.3 內(nèi)核模塊加載和卸載過(guò)程內(nèi)核模塊的卸載過(guò)程也分為用戶(hù)空間動(dòng)作和內(nèi)核空間動(dòng)作:用戶(hù)空間的動(dòng)作負(fù)責(zé)內(nèi)核模塊卸載準(zhǔn)備;內(nèi)核空間的動(dòng)作負(fù)責(zé)卸載前檢查、內(nèi)核模塊清理函數(shù)的調(diào)用、模塊清理等工作。17.3.3 內(nèi)核模塊加載和卸載過(guò)程內(nèi)核模塊的卸載過(guò)程也分17.3.4 內(nèi)核模塊初始化和清理函數(shù)內(nèi)核模塊的初始化函數(shù)主要進(jìn)行初始化工作,例如一些內(nèi)核模塊正常運(yùn)行所需資源(內(nèi)存、中斷等)的申請(qǐng)。模塊的初始化采用類(lèi)似如下代碼的形式:static int _init initialize(void) /* 內(nèi)核初始化代碼 */ return 0;module_init(init
18、ialize);內(nèi)核模塊清理函數(shù)在本模塊卸載時(shí)做一些清理工作,例如內(nèi)存釋放,狀態(tài)重置等,內(nèi)核模塊清理函數(shù)的代碼框架如下:static void _exit exit(void) /* 內(nèi)核清理代碼 */module_exit(exit);17.3.4 內(nèi)核模塊初始化和清理函數(shù)內(nèi)核模塊的初始化函數(shù)17.3.5 內(nèi)核模塊初始化和清理過(guò)程的容錯(cuò)處理在前面介紹的內(nèi)核初始化和清理函數(shù)時(shí)提到,在初始化過(guò)程和清理過(guò)程中會(huì)有出錯(cuò)的情況,如果不做容錯(cuò)處理,會(huì)產(chǎn)生災(zāi)難性的后果:經(jīng)常的現(xiàn)象是系統(tǒng)宕機(jī)。Linux內(nèi)核代碼編寫(xiě)對(duì)于容錯(cuò)的要求是在初始化發(fā)現(xiàn)錯(cuò)誤時(shí)立即停止之后的操作進(jìn)行回復(fù):釋放之前的資源、重置狀態(tài)參數(shù)等。
19、Linux內(nèi)核中經(jīng)常采用的一種錯(cuò)誤處理的框架是采用goto語(yǔ)句構(gòu)建倒置的容錯(cuò)。17.3.5 內(nèi)核模塊初始化和清理過(guò)程的容錯(cuò)處理在前面介紹17.3.6 內(nèi)核模塊編譯所需的Makefile編譯內(nèi)核的Makefile有如下特殊的地方:指定內(nèi)核模塊的編譯文件和頭文件路徑;指定編譯模塊的名稱(chēng);obj-m=.給出當(dāng)前模塊的路徑。17.3.6 內(nèi)核模塊編譯所需的Makefile編譯內(nèi)核的makefileobj-m += hello.o CURRENT_PATH:=$(shell pwd) #the current kernel version number- $(shell uname -r) LINUX_
20、KERNEL_PATH:=/usr/src/linux-headers-$(shell uname -r)#complie object all: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modulesclean: make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) cleanmakefileobj-m += hello.o make的執(zhí)行過(guò)程make執(zhí)行了兩次。第一次執(zhí)行時(shí)是讀hello模塊的源代碼所在目錄下的Makefile。第二次執(zhí)行時(shí)是執(zhí)行/usr/src/linux/下的Makefile時(shí)
21、,make 去$(LINUX_KERNEL_PATH)/Makefile中尋找目標(biāo)modules,即(第10行)指定進(jìn)入指定的目錄即內(nèi)核源代碼目錄,調(diào)用該目錄頂層下的Makefile,目標(biāo)為modules。 M=$(shellpwd)選項(xiàng)讓該Makefile在構(gòu)造modules目標(biāo)之后返回到模塊源代碼目錄并在當(dāng)前目錄生成obj-m指定的xxx.o目標(biāo)模塊。make的執(zhí)行過(guò)程make執(zhí)行了兩次。#General Purpose Makefile for Linux Kernel module by guoqingbo KERN_DIR = /home/gqb/development/linux-
22、kernel-2.6.37 #KERN_DIR = /usr/src/$(shell uname -r) #KERN_DIR = /lib/modules/$(shell uname -r)/build all: make -C $(KERN_DIR) M=$(shell pwd) modules clean: make -C $(KERN_DIR) M=$(shell pwd) modules clean rm -rf modules.order obj-m += xxx.o #General Purpose Makefile for 17.4 5個(gè)鉤子點(diǎn)17.4.1 netfilter的5
23、個(gè)鉤子點(diǎn)17.4.2 NF_HOOK宏17.4.3 鉤子的處理規(guī)則17.4 5個(gè)鉤子點(diǎn)17.4.1 netfilter的517.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 3.2的內(nèi)核中,netfilter中共有5個(gè)鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 3.2的內(nèi)核中,netfilter中
24、共有5個(gè)鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 17.4.1 netfilter的5個(gè)鉤子點(diǎn)17.4.1 netfilter的5個(gè)鉤子點(diǎn)17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux 3.2的內(nèi)核中,netfilter中共有5個(gè)鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的
25、ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。傳輸層接口層17.4.1 netfilter的5個(gè)鉤子點(diǎn)在Linux NF_HOOK的實(shí)現(xiàn)原理1.在網(wǎng)卡收到包之后交由ip層處理的時(shí)候,就交給了ip_recv函數(shù)int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)在做了基本的頭校驗(yàn)等工作后,就到了我們的重點(diǎn)NF_HOOK鉤子函數(shù),此時(shí)還未作路由等路處理return NF_HOOK
26、(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish);在做完P(guān)RE_ROUTING的篩選后,會(huì)執(zhí)行ip_recv_finish函數(shù),繼續(xù)執(zhí)行路由等處理,如果是本地的就會(huì)交給更高層的協(xié)議進(jìn)行處理,如果不是交由本地的就執(zhí)行FORWARDNF_HOOK的實(shí)現(xiàn)原理1.在網(wǎng)卡收到包之后交由ip層處理2.通過(guò)NF_HOOK的宏定義可以看到,NF_HOOK主要是調(diào)用nf_hook_slow,那么,nf_hook_slow主要做了哪些東西呢?nf_hook_slow(pf, hook, skb, indev, outdev, ok
27、fn, thresh)elem = &nf_hookspfhook;next_hook:verdict = nf_iterate(&nf_hookspfhook, skb, hook, indev,outdev, &elem, okfn, hook_thresh);nf_interate 的作用就是遞歸調(diào)用注冊(cè)的鉤子函數(shù).其實(shí)nf_iterate就是遞歸搜索list 執(zhí)行hook函數(shù)。2.通過(guò)NF_HOOK的宏定義可以看到,NF_HOOK主要是17.4.2 NF_HOOK宏netfilter的框架是在協(xié)議棧處理過(guò)程中調(diào)用函數(shù)宏NF_HOOK(),插入處理過(guò)程來(lái)實(shí)現(xiàn)的。NF_HOOK()函數(shù)宏定
28、義在include/linux/netfilter.h里,實(shí)現(xiàn)代碼如下:#ifdef CONFIG_NETFILTER#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) nf_hook_slow(pf), (hook), (skb), (indev), (outdev), (okfn)#else#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)#endif /*CONFIG_NETFILTER*/17.4.2 NF_HOOK宏netfilter的框架是在17.4.3
29、鉤子的處理規(guī)則netfilter的鉤子函數(shù)的返回值可以為NF_ACCEPT、NF_DROP、NF_STOLEN、NF_QUERE、NF_REPEAT這5個(gè)值,其含義如下:nf_accept:繼續(xù)傳遞,保持和原來(lái)傳輸?shù)囊恢拢籲f_drop:丟棄包;不再繼續(xù)傳遞;nf_stolen:接管包;不再繼續(xù)傳遞;nf_quere:隊(duì)列化包(通常是為用戶(hù)空間處理做準(zhǔn)備);nf_repeat:再次調(diào)用這一個(gè)鉤子。17.4.3 鉤子的處理規(guī)則netfilter的鉤子函數(shù)的17.5 注冊(cè)/注銷(xiāo)鉤子17.5.1 結(jié)構(gòu)nf_hook_ops17.5.2 注冊(cè)鉤子17.5.3 注銷(xiāo)鉤子17.5.4 注冊(cè)注銷(xiāo)函數(shù)17.5
30、 注冊(cè)/注銷(xiāo)鉤子17.5.1 結(jié)構(gòu)nf_hook17.5.1 結(jié)構(gòu)nf_hook_ops結(jié)構(gòu)nf_hook_ops是netfilter架構(gòu)中的常用結(jié)構(gòu),定義如下:struct nf_hook_opsstruct list_head list; /*鉤子鏈表*/nf_hookfn *hook; /*鉤子處理函數(shù)*/struct module *owner; /*模塊所有者*/int pf;/*鉤子的協(xié)議族*/int hooknum; /*鉤子的位置值*/int priority; /*鉤子的優(yōu)先級(jí),默認(rèn)情況下為繼承優(yōu)先級(jí)*/;17.5.1 結(jié)構(gòu)nf_hook_ops結(jié)構(gòu)nf_hook17.5.2
31、 注冊(cè)鉤子為了方便其他的內(nèi)核模塊操作網(wǎng)絡(luò)數(shù)據(jù),netfilter提供了注冊(cè)鉤子的函數(shù),其原型在netfilter.h中聲明,具體實(shí)現(xiàn)在文件netfilter.c中:int nf_register_hook(struct nf_hook_ops *reg);17.5.2 注冊(cè)鉤子為了方便其他的內(nèi)核模塊操作網(wǎng)絡(luò)數(shù)據(jù),17.5.3 注銷(xiāo)鉤子注銷(xiāo)鉤子的函數(shù)比較簡(jiǎn)單,將nf_unregister_hook()注冊(cè)的鉤子函數(shù)注銷(xiāo)就可以了。其原型如下:void nf_unregister_hook(struct nf_hook_ops *reg);17.5.3 注銷(xiāo)鉤子注銷(xiāo)鉤子的函數(shù)比較簡(jiǎn)單,將nf_un1
32、7.5.4 注冊(cè)注銷(xiāo)函數(shù)在netfilter中,nf_register_sockopt()和nf_unregister_sockopt()函數(shù)是在socket的選項(xiàng)控制上掛接鉤子函數(shù),使得用戶(hù)可以注冊(cè)自己的opt函數(shù),處理特殊的socket控制。注冊(cè)和注銷(xiāo)的函數(shù)原型如下:int nf_register_sockopt(struct nf_sockopt_ops *reg);void nf_unregister_sockopt(struct nf_sockopt_ops *reg);17.5.4 注冊(cè)注銷(xiāo)函數(shù)在netfilter中,nf_r17.6 鉤子的簡(jiǎn)單處理例子17.6.1 功能描述17.
33、6.2 需求分析17.6.3 ping回顯屏蔽實(shí)現(xiàn)17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實(shí)現(xiàn)17.6.5 端口關(guān)閉實(shí)現(xiàn)17.6.6 動(dòng)態(tài)配置實(shí)現(xiàn)17.6.7 可加載內(nèi)核實(shí)現(xiàn)代碼17.6.8 應(yīng)用層測(cè)試代碼實(shí)現(xiàn)17.6.9 編譯運(yùn)行17.6 鉤子的簡(jiǎn)單處理例子17.6.1 功能描述17.6.1 功能描述本例通過(guò)編寫(xiě)可加載內(nèi)核模塊,利用netfilter的框架,注冊(cè)鉤子函數(shù)對(duì)網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行處理,達(dá)到如下的功能:屏蔽ping的回顯禁止向某個(gè)IP發(fā)送數(shù)據(jù)關(guān)閉端口可動(dòng)態(tài)修改設(shè)置17.6.1 功能描述本例通過(guò)編寫(xiě)可加載內(nèi)核模塊,利用ne17.6.2 需求分析要實(shí)現(xiàn)17.6.1節(jié)的功能,需要在NF_IP_
34、LOCAL_IN和NF_IP_LOCAL_OUT兩個(gè)監(jiān)測(cè)點(diǎn)掛接鉤子函數(shù)。在掛接點(diǎn)NF_IP_LOCAL_IN處,根據(jù)設(shè)置對(duì)進(jìn)入本機(jī)的數(shù)據(jù)進(jìn)行丟棄或者接受;在掛接點(diǎn)NF_IP_LOCAL_OUT處,修改MAC地址。擴(kuò) 展 命 令SOE_BANDIPSOE_BANDPORTSOE_BANDPING參數(shù)IP地址協(xié)議類(lèi)型和端口無(wú)說(shuō)明禁止向某IP發(fā)送數(shù)據(jù)禁止某端口響應(yīng)禁止ping回顯17.6.2 需求分析要實(shí)現(xiàn)17.6.1節(jié)的功能,需要在N17.6.3 ping回顯屏蔽實(shí)現(xiàn)ping的功能是通過(guò)ICMP協(xié)議實(shí)現(xiàn)的,因此在netfilter對(duì)網(wǎng)絡(luò)數(shù)據(jù)的處理過(guò)程中,將其數(shù)據(jù)丟掉,協(xié)議棧就不會(huì)進(jìn)行處理。本處理過(guò)
35、程應(yīng)該在netfilter的LOCAL_IN掛接點(diǎn)進(jìn)行,此時(shí)數(shù)據(jù)包還沒(méi)有進(jìn)入?yún)f(xié)議棧。17.6.3 ping回顯屏蔽實(shí)現(xiàn)ping的功能是通過(guò)IC17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實(shí)現(xiàn)向目的IP地址發(fā)送數(shù)據(jù)的過(guò)程位于發(fā)送處理過(guò)程,因此在LOCAL_OUT掛接點(diǎn)進(jìn)行處理??梢詮腎P頭部的目的地址變量中得到IP地址,與預(yù)置的IP值進(jìn)行匹配,如果匹配,則丟棄該包,不進(jìn)行發(fā)送。17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實(shí)現(xiàn)向目的IP地17.6.5 端口關(guān)閉實(shí)現(xiàn)實(shí)現(xiàn)端口關(guān)閉的方式有多種,比較方便的一種是在數(shù)據(jù)進(jìn)入的時(shí)候就進(jìn)行截取,然后判斷處理。由于端口的協(xié)議分為UDP和TCP,在處理的時(shí)候兩種協(xié)議都
36、要進(jìn)行判斷,按照不同的方式在掛接點(diǎn)LOCAL_IN進(jìn)行處理。17.6.5 端口關(guān)閉實(shí)現(xiàn)實(shí)現(xiàn)端口關(guān)閉的方式有多種,比較方17.6.6 動(dòng)態(tài)配置實(shí)現(xiàn)動(dòng)態(tài)配置的實(shí)現(xiàn)采用了注冊(cè)私有sockopt的方法,使用API函數(shù)nf_register_sockipt()在IP RAW層注冊(cè)一個(gè)私有的sockopt處理鉤子函數(shù),利用其中的回調(diào)函數(shù)set和get來(lái)實(shí)現(xiàn)與用戶(hù)層的交互。17.6.6 動(dòng)態(tài)配置實(shí)現(xiàn)動(dòng)態(tài)配置的實(shí)現(xiàn)采用了注冊(cè)私有so17.6.7 可加載內(nèi)核實(shí)現(xiàn)代碼對(duì)ping進(jìn)行過(guò)濾的內(nèi)核代碼,利用netfilter的5個(gè)鉤子對(duì)進(jìn)出本地網(wǎng)絡(luò)接口的數(shù)據(jù)進(jìn)行過(guò)濾,來(lái)實(shí)現(xiàn)ping數(shù)據(jù)包的丟棄。1結(jié)構(gòu)sockopt的擴(kuò)展2內(nèi)核實(shí)現(xiàn)代碼17.6.7 可加載內(nèi)核實(shí)現(xiàn)代碼對(duì)ping進(jìn)行過(guò)濾的內(nèi)核代1結(jié)構(gòu)sockopt的擴(kuò)展由于進(jìn)行sockopt擴(kuò)展應(yīng)用層和內(nèi)核層需要共用一致的cmd命令和數(shù)據(jù)結(jié)構(gòu),在nf_sockopte.h文件中定義如下數(shù)據(jù)類(lèi)型,sockopt命令的擴(kuò)展可以選擇內(nèi)核源文件socket.h中的未用值來(lái)用。1結(jié)構(gòu)sockopt的擴(kuò)展由于進(jìn)行sockopt擴(kuò)展應(yīng)用層2內(nèi)核實(shí)現(xiàn)代碼內(nèi)核層的代碼實(shí)現(xiàn)如下,在模塊初始化的時(shí)候掛接了3個(gè)鉤子nfin、nfout和nfsockop
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度影視后期制作與剪輯服務(wù)合同范本4篇
- 2025年度專(zhuān)業(yè)樹(shù)木種植與生態(tài)旅游開(kāi)發(fā)合同4篇
- 2025年度夏令營(yíng)教育成果評(píng)估與分析合同4篇
- 把羊包給他人的合同
- 2025年度林業(yè)資源開(kāi)發(fā)與合作經(jīng)營(yíng)合同模板3篇
- 2025年度牛只運(yùn)輸與飼料配送綜合性服務(wù)合同4篇
- 2025年度內(nèi)墻涂料工程舊房翻新改造施工合同2篇
- 二零二五年度煤礦資源整合項(xiàng)目合同書(shū)4篇
- 2025版民宿布草租賃與民宿客棧特色文化打造合同4篇
- 2025年度股權(quán)轉(zhuǎn)讓與客戶(hù)關(guān)系維護(hù)合同范本3篇
- 《化工設(shè)備機(jī)械基礎(chǔ)(第8版)》全套教學(xué)課件
- 《帶一本書(shū)去讀研:研究生關(guān)鍵學(xué)術(shù)技能快速入門(mén)》筆記
- 人教版八年級(jí)數(shù)學(xué)下冊(cè)舉一反三專(zhuān)題17.6勾股定理章末八大題型總結(jié)(培優(yōu)篇)(學(xué)生版+解析)
- 2024屆上海高考語(yǔ)文課內(nèi)古詩(shī)文背誦默寫(xiě)篇目(精校版)
- DL-T5024-2020電力工程地基處理技術(shù)規(guī)程
- 2024年度-美團(tuán)新騎手入門(mén)培訓(xùn)
- 初中數(shù)學(xué)要背誦記憶知識(shí)點(diǎn)(概念+公式)
- 駕照體檢表完整版本
- 農(nóng)產(chǎn)品農(nóng)藥殘留檢測(cè)及風(fēng)險(xiǎn)評(píng)估
- 農(nóng)村高中思想政治課時(shí)政教育研究的中期報(bào)告
- 20100927-宣化上人《愣嚴(yán)咒句偈疏解》(簡(jiǎn)體全)
評(píng)論
0/150
提交評(píng)論