利用netfilter構(gòu)建用戶態(tài)防火墻_第1頁(yè)
已閱讀1頁(yè),還剩21頁(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、防火墻II——利用netfilter構(gòu)建用戶級(jí)防火墻,2012-12,課程內(nèi)容,Netfilter概述Netfilter工作機(jī)制利用netfilter構(gòu)建用戶級(jí)防火墻原理Libipq工作流程與相關(guān)函數(shù)實(shí)驗(yàn)題目,Netfilter概述,Netfilter 更準(zhǔn)確地講是Linux 內(nèi)核中,一個(gè)包過(guò)濾框架,默認(rèn)地,它在這個(gè)框架上實(shí)現(xiàn)了包過(guò)濾、狀態(tài)檢測(cè)、網(wǎng)絡(luò)地址轉(zhuǎn)換和包標(biāo)記等多種功能,因?yàn)樗O(shè)計(jì)的開(kāi)放性,任何有內(nèi)核開(kāi)發(fā)經(jīng)驗(yàn)的開(kāi)發(fā)人員,也

2、可以很容易地利用它提供接口,在內(nèi)核的數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層,實(shí)現(xiàn)自己的功能模塊。,Netfilter工作機(jī)制,Netfilter的五種操作,NF_DROP 丟棄該報(bào)文,釋放所有與該報(bào)文相關(guān)的資源;NF_ACCEPT 接受該報(bào)文,并繼續(xù)處理;NF_STOLEN 該報(bào)文已經(jīng)被HOOK函數(shù)接管,協(xié)議棧無(wú)須繼續(xù)處理;NF_QUEUE 將該報(bào)文傳遞到用戶態(tài)去做進(jìn)一步的處理;NF_REPEAT 再次調(diào)用本HOOK函數(shù)。,利用netfilter構(gòu)

3、建防火墻,在內(nèi)核中注冊(cè)自己的鉤子函數(shù);利用IP_QUEUE實(shí)現(xiàn)內(nèi)核與用戶層之間的數(shù)據(jù)包交換,實(shí)現(xiàn)用戶態(tài)防火墻,利用netfilter構(gòu)建用戶態(tài)防火墻機(jī)制,當(dāng)HOOK處理函數(shù)返回NF_QUEUE值時(shí),內(nèi)核協(xié)議棧將通過(guò)Linux NetLink通信機(jī)制把當(dāng)前報(bào)文傳遞到用戶態(tài),由用戶態(tài)的防火墻程序進(jìn)行處理。這樣,只要能夠在相應(yīng)的HOOK點(diǎn)上返回NF_QUEUE值,就可以安心地在用戶態(tài)使用自己的程序來(lái)過(guò)濾報(bào)文了,這個(gè)功能可以由iptables

4、實(shí)現(xiàn)。,Libipq簡(jiǎn)介,Libipq是NetFilter框架的重要組成部分。任何時(shí)候在任何NetFilter規(guī)則鏈中,數(shù)據(jù)報(bào)都可以被排隊(duì)轉(zhuǎn)發(fā)到用戶空間去。用戶進(jìn)程能對(duì)數(shù)據(jù)報(bào)進(jìn)行任何處理。處理結(jié)束以后,用戶進(jìn)程可以將該數(shù)據(jù)報(bào)重新注入內(nèi)核或者設(shè)置一個(gè)對(duì)數(shù)據(jù)報(bào)的目標(biāo)動(dòng)作。,開(kāi)發(fā)流程,設(shè)置過(guò)濾環(huán)境編寫(xiě)應(yīng)用程序,設(shè)置過(guò)濾環(huán)境,加載過(guò)濾需要的內(nèi)核模塊 # modprobe iptable_filter # modprobe ip_queue

5、設(shè)置過(guò)濾規(guī)則iptables -A OUTPUT -p icmp -j QUEUEIptables -A OUTPUT –p tcp –j QUEUE,Libipq程序框架,初始化ipq_create_handle(),設(shè)置包復(fù)制規(guī)則ipq_set_mode(),讀取包數(shù)據(jù)ipq_read(),,,包處理ipq_set_verdict()},銷(xiāo)毀ipq_destroy_handle(),,包過(guò)濾處理循環(huán)

6、while(1){,,分析包ipq_message_type()ipq_get_packet(),,Libipq接口函數(shù)(1),建立ipq的handle:struct ipq_handle *ipq_create_handle(u_int32_t flags, u_int32_t protocol); flags:基本上沒(méi)用,通常設(shè)為0; protocol:制定想獲取協(xié)議的隊(duì)列,PF_INET為IPV4隊(duì)列

7、, PF_INET6為IPV6隊(duì)列成功:返回一個(gè)不為空的指針;失敗:返回一個(gè)NULL指針,元數(shù)據(jù),struct nlmsghdr{ __u32 nlmsg_len; /* Length of message including header */ __u16 nlmsg_type; /* Message content */ __u16 nlmsg_flags; /* Additional flags */

8、__u32 nlmsg_seq; /* Sequence number */ __u32 nlmsg_pid; /* Sending process PID */};,Libipq接口函數(shù)(2),設(shè)置IPQ的拷貝模式:用戶空間來(lái)設(shè)置ip_queue的接收數(shù)據(jù)模式的.int ipq_set_mode(const struct ipq_handle *h, u_int8_t mode, size_t len)h:是通過(guò)ipq

9、_create_handle ()獲得的句柄指針; mode:設(shè)定拷貝模式,IPQ_COPY_META和IPQ_COPY_PACKET。當(dāng)為IPQ_COPY_META時(shí),內(nèi)核將在其后的報(bào)文傳遞中只傳遞“報(bào)文的元數(shù)據(jù)”;當(dāng)為IPQ_COPY_PACKET時(shí),內(nèi)核將同時(shí)傳遞“報(bào)文的元數(shù)據(jù)”和報(bào)文本身 len:請(qǐng)求拷貝的報(bào)文長(zhǎng)度成功:返回一個(gè)非0的正數(shù);失?。悍祷?1;,Libipq接口函數(shù)(3),從內(nèi)核中的pack

10、et queue中讀取數(shù)據(jù)包,將其拷貝到buf指定的緩沖區(qū)ssize_t ipq_read(const struct ipq_handle *h,unsigned char *buf, size_t len, int timeout);h:ipq_create_handle創(chuàng)建的句柄;buf: 存放數(shù)據(jù)包的緩沖區(qū); len:拷貝的字節(jié)數(shù); timeout:超時(shí)時(shí)限,0表示函數(shù)直到指定的數(shù)據(jù)讀

11、到緩沖區(qū)里接觸阻塞,負(fù)數(shù),表示函數(shù)馬上接觸阻塞。成功:返回一個(gè)大于0 的數(shù);失?。?1,Libipq接口函數(shù)(4),分析數(shù)據(jù)包的類(lèi)型int ipq_message_type(const unsigned char *buf);1、buf:通過(guò)ipq_read存放數(shù)據(jù)包的緩沖區(qū);返回值存在兩種可能:NLMSG_ERROR:數(shù)據(jù)包是一個(gè)錯(cuò)誤的數(shù)據(jù)包;IPQM_PACKET:元數(shù)據(jù)或是既包含元數(shù)據(jù)和負(fù)載的數(shù)據(jù)包,Libip

12、q接口函數(shù)(5),從緩沖中獲取數(shù)據(jù)包ipq_packet_msg_t *ipq_get_packet(const unsigned char *buf);,Libipq接口函數(shù)(5),用戶層通過(guò)這個(gè)函數(shù)告訴內(nèi)核對(duì)某一個(gè)數(shù)據(jù)包的處理意見(jiàn) int ipq_set_verdict(const struct ipq_handle *h,ipq_id_t id,unsigned int verdict,size_t data_len,un

13、signed char *buf);h:id: 數(shù)據(jù)包的標(biāo)識(shí)符,通過(guò)ipq_get_packet得到的;verdict:對(duì)數(shù)據(jù)包的處理意見(jiàn),NF_ACCEPT:接收數(shù)據(jù)包,NF_DROP:丟棄數(shù)據(jù)包;len:buf:成功:>0的正數(shù);失敗:-1,Libipq接口函數(shù)(6),釋放ipq句柄int ipq_destroy_handle(struct ipq_handle *h);成功:0失?。?

14、1,,用libipq編寫(xiě)程序,頭文件#include #include 編譯、鏈接gcc -o myfw myfw.c –lipq輸出fprintf(stderr,…..),編譯環(huán)境的搭建,Ubuntu:sudo apt-get install iptables-devRedhat 9.0:# file iptables-1.2.7a.tar# tar xjvf iptables-1.2.7a.tar

15、# make instll-develRedhat 高版本系列:1、rpm –ivh iptables 1.XX-dev(在安裝盤(pán)里能找到安裝包);2、yum install iptables-dev;,試驗(yàn)題目,設(shè)置iptables過(guò)濾規(guī)則為:所有從本機(jī)發(fā)出的icmp包全部到自己編寫(xiě)的應(yīng)用程序編寫(xiě)應(yīng)用程序,功能如下:允許從本機(jī)出發(fā),目的地址為win xp ip的icmp包;丟棄其他任何icmp包;當(dāng)出現(xiàn)錯(cuò)誤時(shí),做錯(cuò)

溫馨提示

  • 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ù)僅提供信息存儲(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)論