![linux教程第17章netfilter框架內(nèi)報文處理課件_第1頁](http://file4.renrendoc.com/view/9d2469d1ab9ec35f78a59a2344e56d45/9d2469d1ab9ec35f78a59a2344e56d451.gif)
![linux教程第17章netfilter框架內(nèi)報文處理課件_第2頁](http://file4.renrendoc.com/view/9d2469d1ab9ec35f78a59a2344e56d45/9d2469d1ab9ec35f78a59a2344e56d452.gif)
![linux教程第17章netfilter框架內(nèi)報文處理課件_第3頁](http://file4.renrendoc.com/view/9d2469d1ab9ec35f78a59a2344e56d45/9d2469d1ab9ec35f78a59a2344e56d453.gif)
![linux教程第17章netfilter框架內(nèi)報文處理課件_第4頁](http://file4.renrendoc.com/view/9d2469d1ab9ec35f78a59a2344e56d45/9d2469d1ab9ec35f78a59a2344e56d454.gif)
![linux教程第17章netfilter框架內(nèi)報文處理課件_第5頁](http://file4.renrendoc.com/view/9d2469d1ab9ec35f78a59a2344e56d45/9d2469d1ab9ec35f78a59a2344e56d455.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第17章 netfilter框架內(nèi)報文處理17.1 netfilter17.2 iptables和netfilter17.3 內(nèi)核模塊編程17.4 5個鉤子點17.5 注冊/注銷鉤子17.6 鉤子的簡單處理例子17.7 一點多個鉤子的優(yōu)先級17.8 校驗和問題教學要求掌握:內(nèi)核模塊編程、 5個鉤子點、注冊/注銷鉤子、鉤子的簡單處理例子了解: Netfilter、iptables第17章 netfilter框架內(nèi)報文處理17.1 ne17.1 netfilter17.1.1 netfilter簡介17.1.2 netfilter框架17.1.3 netfilter檢查時的表格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)過網(wǎng)卡驅(qū)動和協(xié)議棧程序,以DM9000A網(wǎng)卡為例進行介紹接收數(shù)據(jù)的過程。 接收網(wǎng)絡(luò)數(shù)據(jù)recv()網(wǎng)絡(luò)數(shù)據(jù)接收依次經(jīng)過網(wǎng)卡驅(qū)動和協(xié) 發(fā)送網(wǎng)絡(luò)數(shù)據(jù)send()Linux對網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送過程的處理與接收過程相反。在一端對socket進行write()的過程中,首先會把要write的字符串緩沖區(qū)整理成msghdr的數(shù)據(jù)結(jié)構(gòu)形式,然后調(diào)用sock_sendmsg()把msghdr的數(shù)據(jù)傳送至inet層。對于msghdr結(jié)構(gòu)中數(shù)據(jù)區(qū)中的每個數(shù)據(jù)包,創(chuàng)建sk_buff結(jié)構(gòu),填充數(shù)據(jù),掛至發(fā)
3、送隊列。一層層往下層協(xié)議傳遞。 發(fā)送網(wǎng)絡(luò)數(shù)據(jù)send()Linux對網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送過程的處linux教程-第17章-netfilter框架內(nèi)報文處理17.4.1 netfilter的5個鉤子點在Linux 3.2的內(nèi)核中,netfilter中共有5個鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個鉤子點在Linux 系統(tǒng)提供修改網(wǎng)絡(luò)流程點Linux內(nèi)核中還提供了一種靈活修改網(wǎng)絡(luò)數(shù)據(jù)的
4、機制,用戶可以利用這種機制獲得和修改內(nèi)核層的網(wǎng)絡(luò)數(shù)據(jù)和屬性設(shè)置。白色的框為網(wǎng)絡(luò)數(shù)據(jù)的流向,協(xié)議棧按照正常的方式進行處理和傳遞。Linux內(nèi)核在網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過的多個地點設(shè)置了檢查點,當?shù)竭_檢查點的時候,會檢查這些點上是否有用戶設(shè)置的處理方法,按照用戶的處理規(guī)則對網(wǎng)絡(luò)數(shù)據(jù)進行處理后,數(shù)據(jù)會再次按照正常的網(wǎng)絡(luò)流程傳遞。 系統(tǒng)提供修改網(wǎng)絡(luò)流程點Linux內(nèi)核中還提供了一種靈活修改linux教程-第17章-netfilter框架內(nèi)報文處理17.4.1 netfilter的5個鉤子點17.4.1 netfilter的5個鉤子點17.1.1 netfilter簡介Linux環(huán)境下的防火墻技術(shù)從2.0的內(nèi)核版本
5、到目前的3.5版本經(jīng)歷了若干的技術(shù)革新,逐步發(fā)展起來。在Linux kernel 2.3系列的開發(fā)過程中形成了目前netfilter的主要架構(gòu)。用戶空間的防火墻管理工具,也相應地發(fā)展為iptables。netfilter/iptables的組合方式使用戶構(gòu)建防火墻更加簡單,相對于2.2內(nèi)核中的防火墻,用戶可以不用編寫或者修改Linux的內(nèi)核程序(盡管此類工作正變得越來越簡單)。17.1.1 netfilter簡介Linux環(huán)境下的防火17.1.2 netfilter框架netfilter在Linux內(nèi)核中的IPv4、IPv6和DECnet等網(wǎng)絡(luò)協(xié)議棧中都有相應的實現(xiàn)。本書將只介紹其中讓大多數(shù)讀
6、者朋友們感興趣的IPv4協(xié)議棧上netfilter的實現(xiàn)。IPv4協(xié)議棧為了實現(xiàn)對netfilter架構(gòu)的支持,在IP包的IPv4協(xié)議棧上的傳遞過程之中,選擇了5個檢查點。在這5個檢查點上,各引入了一行對NF_HOOK()宏函數(shù)的一個相應的調(diào)用。這5個參考點被分別命名為PREROUTING、LOCAL-IN、FORWARD、LOCAL-OUT和POSTROUTING。17.1.2 netfilter框架netfilter在L17.1.3 netfilter檢查時的表格netfilter在檢查點進行檢查,先查看回調(diào)函數(shù)的合法性,然后根據(jù)協(xié)議方式?jīng)Q定是否調(diào)用。當滿足條件時,調(diào)用用戶掛接的回調(diào)函數(shù)。
7、netfilter的檢查是基于表格進行的,iptables用結(jié)構(gòu)ipt_table表示。17.1.3 netfilter檢查時的表格netfilt17.1.4 netfilter的規(guī)則netfilter的規(guī)則用結(jié)構(gòu)struct ipt_entry來表示17.1.4 netfilter的規(guī)則netfilter的17.2 iptables和netfilter17.2.1 iptables簡介17.2.2 iptables的表和鏈17.2.3 使用iptables設(shè)置過濾規(guī)則17.2 iptables和netfilter17.2.117.2.1 iptables簡介netfilter的強大功能和靈活
8、性是通過iptables界面來實現(xiàn)的。iptables使用netfilter子系統(tǒng)來增進網(wǎng)絡(luò)連接、檢驗和處理方面的能力。使用iptables的第一步是啟動iptables服務。在通常的系統(tǒng)中,可以使用以下命令進行:$service iptables start17.2.1 iptables簡介netfilter的強大17.2.2 iptables的表和鏈iptables的主要構(gòu)成是表,iptables的操作是對iptables上的表的操作。iptables內(nèi)置了3個表:nat、mangle和filter。默認情況下是指對FILTER表的操作。1nat表2MANGLE表3filter表17.2.
9、2 iptables的表和鏈iptables的主linux教程-第17章-netfilter框架內(nèi)報文處理1nat表nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換。網(wǎng)絡(luò)數(shù)據(jù)包通過NAT操作后,數(shù)據(jù)包的地址發(fā)生了改變,這種改變是根據(jù)所定義的規(guī)則進行的。1nat表nat表的主要用處是網(wǎng)絡(luò)地址轉(zhuǎn)換。網(wǎng)絡(luò)數(shù)據(jù)包通過2MANGLE表MANGLE表的主要作用用來對數(shù)據(jù)包進行標記。MANGLE表有5個內(nèi)建的鏈:PREROUTING、POSTROUTING、OUTPUT、INPUT和FORWARD。2MANGLE表MANGLE表的主要作用用來對數(shù)據(jù)包進行標3filter表filter表是專門過濾包的,內(nèi)建3個鏈,可以對包進
10、行DROP、LOG、ACCEPT和REJECT等操作。3filter表filter表是專門過濾包的,內(nèi)建3個鏈,17.2.3 使用iptables設(shè)置過濾規(guī)則通過向防火墻提供有關(guān)對來自某個源、到某個目的地或具有特定協(xié)議類型的信息包要做些什么的指令、對信息包進行過濾。通過使用netfilter/iptables系統(tǒng)提供的特殊命令iptables,建立這些規(guī)則,并將規(guī)則加到內(nèi)核空間內(nèi)特定信息包的過濾表內(nèi)的鏈上。$ iptables -t table command match target1表(table)2命令(command)3匹配(match)4目標(target)17.2.3 使用ipta
11、bles設(shè)置過濾規(guī)則通過向防火墻linux教程-第17章-netfilter框架內(nèi)報文處理1表(table)-t table選項允許使用標準表之外的任何表。表是包含僅處理特定類型信息包的規(guī)則和鏈的信息包過濾表。有3種可用的表選項:filter、nat和mangle。該選項不是必需的,如果未指定,則filter用做默認表。1表(table)-t table選項允許使用標準表之2命令(command)上面這條命令中具有強制性的command部分是iptables命令的最重要部分。它告訴iptables命令要做什么,例如,插入規(guī)則、將規(guī)則添加到鏈的末尾或刪除規(guī)則。以下是最常用的一些命令:2命令(co
12、mmand)上面這條命令中具有強制性的comm3匹配(match)iptables命令的可選match部分指定信息包與規(guī)則匹配所應具有的特征(如源和目的地地址、協(xié)議等)。匹配分為兩大類:通用類型匹配和特定協(xié)議的匹配。3匹配(match)iptables命令的可選match部4目標(target)目標是規(guī)則所描述的操作。當數(shù)據(jù)包與規(guī)則匹配的時候,則對數(shù)據(jù)包執(zhí)行相應的操作。ACCEPTDROPREJECRETURN4目標(target)目標是規(guī)則所描述的操作。當數(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、載和卸載過程17.3.4 內(nèi)核模塊初始化和清理函數(shù)17.3.5 內(nèi)核模塊初始化和清理過程的容錯處理17.3.6 內(nèi)核模塊編譯所需的Makefile17.3 內(nèi)核模塊編程17.3.1 內(nèi)核“Hello W17.3.1 內(nèi)核“Hello World!”程序本節(jié)通過一個“Hello World”例子對內(nèi)核模塊程序設(shè)計進行介紹。1內(nèi)核的“Hello World”例子2內(nèi)核模塊和應用程序的調(diào)試和函數(shù)的不同17.3.1 內(nèi)核“Hello World!”程序本節(jié)通過17.3.2 內(nèi)核模塊的基本架構(gòu)17.3.1節(jié)的程序展示了內(nèi)核模塊的基本架構(gòu),如圖17.4所示,一個Linux內(nèi)核模塊包含如下幾個部分,其中陰影
14、的部分編寫內(nèi)核模塊時必須具有。1模塊初始化函數(shù)2模塊清除函數(shù)3模塊許可證聲明、作者、模塊描述信息等聲明4模塊可導出符號表5模塊加載參數(shù)17.3.2 內(nèi)核模塊的基本架構(gòu)17.3.1節(jié)的程序展示了1模塊初始化函數(shù)使用命令insmod或者modprobe加載內(nèi)核模塊的時候,會自動調(diào)用模塊的初始化函數(shù),進行模塊的初始化,主要是資源申請。1模塊初始化函數(shù)使用命令insmod或者modprobe加2模塊清除函數(shù)使用命令rmmod卸載內(nèi)核模塊的時候,模塊清除函數(shù)會自動調(diào)用,進行模塊退出之前的清理工作,主要是狀態(tài)重置和資源釋放。2模塊清除函數(shù)使用命令rmmod卸載內(nèi)核模塊的時候,模塊清3模塊許可證聲明、作者、
15、模塊描述信息等聲明盡管沒有強制要求必須聲明許可證,但是在進行模塊編寫的時候最好指定。內(nèi)核可以識別如下4種許可方式:GPL、Dual BSD/GPL、Dual MPL/GPL、Proprietary。沒有采用以上許可證方式的聲明則假定為私有的,內(nèi)核加載這種模塊會被“污染”。3模塊許可證聲明、作者、模塊描述信息等聲明盡管沒有強制要求4模塊可導出符號表與用戶空間編程時的庫類似,內(nèi)核模塊中也可以調(diào)用其他模塊中的例程,或者允許其他模塊調(diào)用本模塊中的函數(shù)。insmod的加載過程包含的一個步驟就是把允許導出的符號加到公共內(nèi)核符號表中,或者使用公共內(nèi)核符號表來解析加載模塊中未定義的符號。4模塊可導出符號表與用
16、戶空間編程時的庫類似,內(nèi)核模塊中也可5模塊加載參數(shù)用戶空間的應用程序可以接受用戶的參數(shù),Linux的內(nèi)核模塊在加載的時候也可以加載參數(shù)。在“Hello World”模塊中可以修改模塊初始化時的打印語句為:printk(KERN_ALERT Hello %s n, target);5模塊加載參數(shù)用戶空間的應用程序可以接受用戶的參數(shù),Lin17.3.3 內(nèi)核模塊加載和卸載過程內(nèi)核模塊的加載過程分為用戶空間動作和內(nèi)核空間動作:用戶空間負責內(nèi)核模塊加載準備;內(nèi)核空間負責復制、檢查和內(nèi)核模塊初始化等工作。內(nèi)核加載時,用戶輸入命令insmod后,會調(diào)用init_module()。17.3.3 內(nèi)核模塊加載
17、和卸載過程內(nèi)核模塊的加載過程分為17.3.3 內(nèi)核模塊加載和卸載過程內(nèi)核模塊的卸載過程也分為用戶空間動作和內(nèi)核空間動作:用戶空間的動作負責內(nèi)核模塊卸載準備;內(nèi)核空間的動作負責卸載前檢查、內(nèi)核模塊清理函數(shù)的調(diào)用、模塊清理等工作。17.3.3 內(nèi)核模塊加載和卸載過程內(nèi)核模塊的卸載過程也分17.3.4 內(nèi)核模塊初始化和清理函數(shù)內(nèi)核模塊的初始化函數(shù)主要進行初始化工作,例如一些內(nèi)核模塊正常運行所需資源(內(nèi)存、中斷等)的申請。模塊的初始化采用類似如下代碼的形式:static int _init initialize(void) /* 內(nèi)核初始化代碼 */ return 0;module_init(init
18、ialize);內(nèi)核模塊清理函數(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)核模塊初始化和清理過程的容錯處理在前面介紹的內(nèi)核初始化和清理函數(shù)時提到,在初始化過程和清理過程中會有出錯的情況,如果不做容錯處理,會產(chǎn)生災難性的后果:經(jīng)常的現(xiàn)象是系統(tǒng)宕機。Linux內(nèi)核代碼編寫對于容錯的要求是在初始化發(fā)現(xiàn)錯誤時立即停止之后的操作進行回復:釋放之前的資源、重置狀態(tài)參數(shù)等。
19、Linux內(nèi)核中經(jīng)常采用的一種錯誤處理的框架是采用goto語句構(gòu)建倒置的容錯。17.3.5 內(nèi)核模塊初始化和清理過程的容錯處理在前面介紹17.3.6 內(nèi)核模塊編譯所需的Makefile編譯內(nèi)核的Makefile有如下特殊的地方:指定內(nèi)核模塊的編譯文件和頭文件路徑;指定編譯模塊的名稱;obj-m=.給出當前模塊的路徑。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í)行過程make執(zhí)行了兩次。第一次執(zhí)行時是讀hello模塊的源代碼所在目錄下的Makefile。第二次執(zhí)行時是執(zhí)行/usr/src/linux/下的Makefile時
21、,make 去$(LINUX_KERNEL_PATH)/Makefile中尋找目標modules,即(第10行)指定進入指定的目錄即內(nèi)核源代碼目錄,調(diào)用該目錄頂層下的Makefile,目標為modules。 M=$(shellpwd)選項讓該Makefile在構(gòu)造modules目標之后返回到模塊源代碼目錄并在當前目錄生成obj-m指定的xxx.o目標模塊。make的執(zhí)行過程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個鉤子點17.4.1 netfilter的5
23、個鉤子點17.4.2 NF_HOOK宏17.4.3 鉤子的處理規(guī)則17.4 5個鉤子點17.4.1 netfilter的517.4.1 netfilter的5個鉤子點在Linux 3.2的內(nèi)核中,netfilter中共有5個鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個鉤子點在Linux 17.4.1 netfilter的5個鉤子點在Linux 3.2的內(nèi)核中,netfilter中
24、共有5個鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。17.4.1 netfilter的5個鉤子點在Linux 17.4.1 netfilter的5個鉤子點17.4.1 netfilter的5個鉤子點17.4.1 netfilter的5個鉤子點在Linux 3.2的內(nèi)核中,netfilter中共有5個鉤子,分別是PREROUTING、POSTROUTING、INPUT、FORWARD和OUTPUT。與之前的2.2版本的
25、ipchains相比,多了PRTEROUTING和POSTROUTING,它們是為支持NAT而新增加的。傳輸層接口層17.4.1 netfilter的5個鉤子點在Linux NF_HOOK的實現(xiàn)原理1.在網(wǎng)卡收到包之后交由ip層處理的時候,就交給了ip_recv函數(shù)int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)在做了基本的頭校驗等工作后,就到了我們的重點NF_HOOK鉤子函數(shù),此時還未作路由等路處理return NF_HOOK
26、(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish);在做完P(guān)RE_ROUTING的篩選后,會執(zhí)行ip_recv_finish函數(shù),繼續(xù)執(zhí)行路由等處理,如果是本地的就會交給更高層的協(xié)議進行處理,如果不是交由本地的就執(zhí)行FORWARDNF_HOOK的實現(xiàn)原理1.在網(wǎng)卡收到包之后交由ip層處理2.通過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)用注冊的鉤子函數(shù).其實nf_iterate就是遞歸搜索list 執(zhí)行hook函數(shù)。2.通過NF_HOOK的宏定義可以看到,NF_HOOK主要是17.4.2 NF_HOOK宏netfilter的框架是在協(xié)議棧處理過程中調(diào)用函數(shù)宏NF_HOOK(),插入處理過程來實現(xiàn)的。NF_HOOK()函數(shù)宏定
28、義在include/linux/netfilter.h里,實現(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個值,其含義如下:nf_accept:繼續(xù)傳遞,保持和原來傳輸?shù)囊恢?;nf_drop:丟棄包;不再繼續(xù)傳遞;nf_stolen:接管包;不再繼續(xù)傳遞;nf_quere:隊列化包(通常是為用戶空間處理做準備);nf_repeat:再次調(diào)用這一個鉤子。17.4.3 鉤子的處理規(guī)則netfilter的鉤子函數(shù)的17.5 注冊/注銷鉤子17.5.1 結(jié)構(gòu)nf_hook_ops17.5.2 注冊鉤子17.5.3 注銷鉤子17.5.4 注冊注銷函數(shù)17.5
30、 注冊/注銷鉤子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)先級,默認情況下為繼承優(yōu)先級*/;17.5.1 結(jié)構(gòu)nf_hook_ops結(jié)構(gòu)nf_hook17.5.2
31、 注冊鉤子為了方便其他的內(nèi)核模塊操作網(wǎng)絡(luò)數(shù)據(jù),netfilter提供了注冊鉤子的函數(shù),其原型在netfilter.h中聲明,具體實現(xiàn)在文件netfilter.c中:int nf_register_hook(struct nf_hook_ops *reg);17.5.2 注冊鉤子為了方便其他的內(nèi)核模塊操作網(wǎng)絡(luò)數(shù)據(jù),17.5.3 注銷鉤子注銷鉤子的函數(shù)比較簡單,將nf_unregister_hook()注冊的鉤子函數(shù)注銷就可以了。其原型如下:void nf_unregister_hook(struct nf_hook_ops *reg);17.5.3 注銷鉤子注銷鉤子的函數(shù)比較簡單,將nf_un1
32、7.5.4 注冊注銷函數(shù)在netfilter中,nf_register_sockopt()和nf_unregister_sockopt()函數(shù)是在socket的選項控制上掛接鉤子函數(shù),使得用戶可以注冊自己的opt函數(shù),處理特殊的socket控制。注冊和注銷的函數(shù)原型如下:int nf_register_sockopt(struct nf_sockopt_ops *reg);void nf_unregister_sockopt(struct nf_sockopt_ops *reg);17.5.4 注冊注銷函數(shù)在netfilter中,nf_r17.6 鉤子的簡單處理例子17.6.1 功能描述17.
33、6.2 需求分析17.6.3 ping回顯屏蔽實現(xiàn)17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實現(xiàn)17.6.5 端口關(guān)閉實現(xiàn)17.6.6 動態(tài)配置實現(xiàn)17.6.7 可加載內(nèi)核實現(xiàn)代碼17.6.8 應用層測試代碼實現(xiàn)17.6.9 編譯運行17.6 鉤子的簡單處理例子17.6.1 功能描述17.6.1 功能描述本例通過編寫可加載內(nèi)核模塊,利用netfilter的框架,注冊鉤子函數(shù)對網(wǎng)絡(luò)數(shù)據(jù)進行處理,達到如下的功能:屏蔽ping的回顯禁止向某個IP發(fā)送數(shù)據(jù)關(guān)閉端口可動態(tài)修改設(shè)置17.6.1 功能描述本例通過編寫可加載內(nèi)核模塊,利用ne17.6.2 需求分析要實現(xiàn)17.6.1節(jié)的功能,需要在NF_IP_
34、LOCAL_IN和NF_IP_LOCAL_OUT兩個監(jiān)測點掛接鉤子函數(shù)。在掛接點NF_IP_LOCAL_IN處,根據(jù)設(shè)置對進入本機的數(shù)據(jù)進行丟棄或者接受;在掛接點NF_IP_LOCAL_OUT處,修改MAC地址。擴 展 命 令SOE_BANDIPSOE_BANDPORTSOE_BANDPING參數(shù)IP地址協(xié)議類型和端口無說明禁止向某IP發(fā)送數(shù)據(jù)禁止某端口響應禁止ping回顯17.6.2 需求分析要實現(xiàn)17.6.1節(jié)的功能,需要在N17.6.3 ping回顯屏蔽實現(xiàn)ping的功能是通過ICMP協(xié)議實現(xiàn)的,因此在netfilter對網(wǎng)絡(luò)數(shù)據(jù)的處理過程中,將其數(shù)據(jù)丟掉,協(xié)議棧就不會進行處理。本處理過
35、程應該在netfilter的LOCAL_IN掛接點進行,此時數(shù)據(jù)包還沒有進入?yún)f(xié)議棧。17.6.3 ping回顯屏蔽實現(xiàn)ping的功能是通過IC17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實現(xiàn)向目的IP地址發(fā)送數(shù)據(jù)的過程位于發(fā)送處理過程,因此在LOCAL_OUT掛接點進行處理??梢詮腎P頭部的目的地址變量中得到IP地址,與預置的IP值進行匹配,如果匹配,則丟棄該包,不進行發(fā)送。17.6.4 禁止向目的IP地址發(fā)送數(shù)據(jù)的實現(xiàn)向目的IP地17.6.5 端口關(guān)閉實現(xiàn)實現(xiàn)端口關(guān)閉的方式有多種,比較方便的一種是在數(shù)據(jù)進入的時候就進行截取,然后判斷處理。由于端口的協(xié)議分為UDP和TCP,在處理的時候兩種協(xié)議都
36、要進行判斷,按照不同的方式在掛接點LOCAL_IN進行處理。17.6.5 端口關(guān)閉實現(xiàn)實現(xiàn)端口關(guān)閉的方式有多種,比較方17.6.6 動態(tài)配置實現(xiàn)動態(tài)配置的實現(xiàn)采用了注冊私有sockopt的方法,使用API函數(shù)nf_register_sockipt()在IP RAW層注冊一個私有的sockopt處理鉤子函數(shù),利用其中的回調(diào)函數(shù)set和get來實現(xiàn)與用戶層的交互。17.6.6 動態(tài)配置實現(xiàn)動態(tài)配置的實現(xiàn)采用了注冊私有so17.6.7 可加載內(nèi)核實現(xiàn)代碼對ping進行過濾的內(nèi)核代碼,利用netfilter的5個鉤子對進出本地網(wǎng)絡(luò)接口的數(shù)據(jù)進行過濾,來實現(xiàn)ping數(shù)據(jù)包的丟棄。1結(jié)構(gòu)sockopt的擴展2內(nèi)核實現(xiàn)代碼17.6.7 可加載內(nèi)核實現(xiàn)代碼對ping進行過濾的內(nèi)核代1結(jié)構(gòu)sockopt的擴展由于進行sockopt擴展應用層和內(nèi)核層需要共用一致的cmd命令和數(shù)據(jù)結(jié)構(gòu),在nf_sockopte.h文件中定義如下數(shù)據(jù)類型,sockopt命令的擴展可以選擇內(nèi)核源文件socket.h中的未用值來用。1結(jié)構(gòu)sockopt的擴展由于進行sockopt擴展應用層2內(nèi)核實現(xiàn)代碼內(nèi)核層的代碼實現(xiàn)如下,在模塊初始化的時候掛接了3個鉤子nfin、nfout和nfsockop
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 450億廣告投放框架合同正式簽署
- 人力資源和社會保障局與勞動合同法改革探討
- 個體戶全職員工標準勞動合同合同范本
- 個人小型店面租賃合同樣本
- 個體藥店并購轉(zhuǎn)讓合同及附件
- 產(chǎn)業(yè)合作投資合同
- 交通事故賠償合同范本大全
- 個人家政服務勞務合同
- 喪葬禮儀服務合同模板
- 二手拖拉機買賣合同協(xié)議書范本
- 父母贈與協(xié)議書
- 高校鑄牢中華民族共同體意識教育的路徑研究
- 《個人所得稅征管問題及對策研究》
- 2022年云南省公務員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 大學輔導員崗位考核參考指標
- 隱名股東協(xié)議股權(quán)代持的協(xié)議書(范本)
- 初級中學語文教師資格考試學科知識與教學能力試題及解答參考(2024年)
- 2024年高端裝備制造行業(yè)現(xiàn)狀分析:國家政策確保高端裝備制造行業(yè)有序發(fā)展
- 《帶一本書去讀研:研究生關(guān)鍵學術(shù)技能快速入門》筆記
- 知識圖譜智慧樹知到答案2024年浙江大學
- 2024年吉林省吉林市中考一模物理試題(解析版)
評論
0/150
提交評論