LINUX2.4.x內(nèi)核網(wǎng)絡(luò)安全框架的示例分析

這篇文章將為大家詳細(xì)講解有關(guān)LINUX 2.4.x 內(nèi)核網(wǎng)絡(luò)安全框架的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

目前成都創(chuàng)新互聯(lián)已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、茂南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

1.概述

在分析LINUX2.4.x網(wǎng)絡(luò)安全的實(shí)現(xiàn)之前先簡單介紹一下它里面包含的幾個(gè)重要概念:netfilter、iptables、match、target、nf_sockopt_ops、網(wǎng)絡(luò)安全功能點(diǎn)的實(shí)現(xiàn)。詳細(xì)解釋會(huì)在后面的分析中講到。

首先是netfilter,它定義了協(xié)議棧中的檢查點(diǎn)和在檢查點(diǎn)上引用的數(shù)據(jù)結(jié)構(gòu),以及在檢查點(diǎn)上對(duì)這些結(jié)構(gòu)引用的過程。iptables定義了實(shí)現(xiàn)網(wǎng)絡(luò)安全功能的規(guī)則的組織以及對(duì)規(guī)則的操作。一個(gè)規(guī)則中包含零個(gè)或多個(gè)match和一個(gè)target,規(guī)則組織沿用了LINUX2.2.x中的chain,rule的概念,但是增加了table的概念,這三者的關(guān)系是:table是實(shí)現(xiàn)某項(xiàng)功能所有規(guī)則的總和,chain是在某個(gè)檢查點(diǎn)上所引用規(guī)則的集合,rule是一個(gè)單獨(dú)的規(guī)則。match在規(guī)則中用于匹配數(shù)據(jù)包中的各項(xiàng)參數(shù),每個(gè)match匹配特定的參數(shù),所以一個(gè)規(guī)則中可以有多個(gè)match,這包括系統(tǒng)已定義的match,也包括通過內(nèi)核模塊另外添加的match。target在規(guī)則中決定如何處理匹配到的數(shù)據(jù)包,因此在target中實(shí)現(xiàn)了具體的網(wǎng)絡(luò)安全功能。nf_sockopt_ops是在系統(tǒng)調(diào)用get/setssockopt中引用的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)用戶空間對(duì)規(guī)則的添加、刪除、修改、查詢等動(dòng)作。以上的結(jié)構(gòu)在使用之前必須先注冊(cè)到系統(tǒng)中才能被引用。

LINUX2.4.x網(wǎng)絡(luò)安全實(shí)現(xiàn)了包過濾,地址轉(zhuǎn)換(包含了LINUX2.2.x中的地址偽裝和透明代理功能并有其他擴(kuò)展功能),連接跟蹤(這是實(shí)現(xiàn)地址轉(zhuǎn)換的基礎(chǔ),在它里面實(shí)現(xiàn)了對(duì)連接狀態(tài)的記錄和監(jiān)控,與狀態(tài)檢測類似),Mangle(這是LINUX2.4.x新增的一個(gè)功能,它對(duì)數(shù)據(jù)包進(jìn)行檢查但不做禁止、丟棄或允許的判斷)。實(shí)現(xiàn)這些功能點(diǎn)需要分別注冊(cè)netfilter,iptables,match,target,nf_sockopt_ops的數(shù)據(jù)結(jié)構(gòu)。如果實(shí)現(xiàn)其他新的功能,只需定義相應(yīng)的結(jié)構(gòu)并將它注冊(cè)到系統(tǒng)中,并且通過用戶空間的配置工具(這個(gè)配置工具也須支持新的結(jié)構(gòu))把它加入到規(guī)則中就可以了。這些結(jié)構(gòu)在規(guī)則中自動(dòng)被引用。

2.netfilter

netfilter定義了協(xié)議棧中的檢查點(diǎn)和檢查點(diǎn)上引用的數(shù)據(jù)結(jié)構(gòu)以及對(duì)這些數(shù)據(jù)結(jié)構(gòu)引用的過程。首先看看在檢查點(diǎn)上引用的數(shù)據(jù)結(jié)構(gòu),如圖所示:

圖中ns_hook_ops就是在檢查點(diǎn)上引用的結(jié)構(gòu)。每個(gè)協(xié)議棧預(yù)先定義的8個(gè)鏈表數(shù)組用于保存這些結(jié)構(gòu),這些鏈表與協(xié)議棧中的檢查點(diǎn)一一對(duì)應(yīng)。在實(shí)際的應(yīng)用中,這8個(gè)鏈表并不一定都被使用,比如在IPV4中,只定義了5個(gè)檢查點(diǎn),分別對(duì)應(yīng)前5個(gè)鏈表。nf_hook_ops結(jié)構(gòu)如下:

struct nf_hook_ops

{

struct list_head list;

nf_hookfn hook; /* 函數(shù)指針 */

int pf; /* 結(jié)構(gòu)對(duì)應(yīng)的協(xié)議棧號(hào) */

int hooknum;  /* 結(jié)構(gòu)對(duì)應(yīng)的檢查點(diǎn)號(hào)*/

int priority; /* 結(jié)構(gòu)的優(yōu)先值 */

};

nf_register_hook函數(shù)將ns_hook_ops結(jié)構(gòu)注冊(cè)到這些鏈表上,鏈表的索引由結(jié)構(gòu)中hooknum指定。同一鏈表上的結(jié)構(gòu)按優(yōu)先值由小到大排列。在檢查點(diǎn)上引用這些結(jié)構(gòu)時(shí),以它們?cè)阪湵砩系南群箜樞蛞谩?/p>

檢查點(diǎn)由宏NF_HOOK定義。在檢查點(diǎn)上,函數(shù)nf_hook_slow調(diào)用函數(shù)nf_iterate遍歷對(duì)應(yīng)鏈表并調(diào)用鏈表上的結(jié)構(gòu)ns_hook_ops中定義的函數(shù)。如果結(jié)構(gòu)中的函數(shù)返回NF_ACCEPT,則繼續(xù)調(diào)用下一個(gè)結(jié)構(gòu)中的函數(shù);如果結(jié)構(gòu)中的函數(shù)返回NF_DROP或NF_STOLEN或NF_QUEUE,則將這個(gè)值返回給nf_hook_slow;如果結(jié)構(gòu)中的函數(shù)返回NF_REPEAT,則重復(fù)調(diào)用此結(jié)構(gòu)上的函數(shù);如果到了鏈表上的最后一個(gè)結(jié)構(gòu),則把這個(gè)結(jié)構(gòu)中函數(shù)的返回值返回給ns_hook_slow。在ns_hook_slow中判斷nf_iterate的返回值,如果是NF_ACCEPT,則允許數(shù)據(jù)包通過,并將數(shù)據(jù)包傳遞給協(xié)議棧中的下一個(gè)函數(shù);如果是NF_DROP,則釋放數(shù)據(jù)包,協(xié)議棧流程中斷;如果是NF_STOLEN,同樣中斷協(xié)議棧的流程,但是沒有釋放這個(gè)數(shù)據(jù)包;如果是NF_QUEUE,則將這個(gè)包發(fā)送到用戶空間處理,同時(shí)中斷協(xié)議棧的流程。

檢查點(diǎn)分布在協(xié)議棧的流程中,下圖是IPV4中的檢查點(diǎn):

圖中檢查點(diǎn)的名稱如下:

檢查點(diǎn)編號(hào) 檢查點(diǎn)名稱 檢查點(diǎn)所在文件名

1 NF_IP_PRE_ROUTING ip_input.c

2 NF_IP_LOCAL_IN ip_input.c

3 NF_IP_FORWARD ip_forward.c

4 NF_IP_POST_ROUTING ip_output.c

5 NF_IP_LOCAL_OUT ip_output.c

表2.1 IPV4中檢查點(diǎn)的名稱

圖中,ROUTE(1)處對(duì)收到的包做路由查找并判斷這個(gè)包是需要轉(zhuǎn)發(fā)的包還是發(fā)往本機(jī)上層的包,ROUTE(2)處查找發(fā)出包的路由。NF_IP_PRE_ROUTING處對(duì)所有傳入IP層的數(shù)據(jù)包進(jìn)行檢查,在這之前,有關(guān)數(shù)據(jù)包的版本、長度、校驗(yàn)和等正確性檢查已經(jīng)完成。NF_IP_LOCAL_IN對(duì)發(fā)往本機(jī)上層的數(shù)據(jù)包進(jìn)行檢查。請(qǐng)注意這兩個(gè)檢查點(diǎn)與LINUX2.2.x中檢查點(diǎn)的區(qū)別,在LINUX2.2.x沒有區(qū)分發(fā)往本機(jī)上層包和需要轉(zhuǎn)發(fā)的包,所以在做完地址解偽裝之后又調(diào)用了一次路由查找函數(shù),為解偽裝之后的包查找路由。NF_IP_FORWARD處檢查需要轉(zhuǎn)發(fā)的數(shù)據(jù)包。NF_IP_POST_ROUTING處對(duì)所有向鏈路層傳遞的數(shù)據(jù)包進(jìn)行檢查,注意在此處數(shù)據(jù)包的路由已經(jīng)確定。NF_IP_LOCAL_OUT對(duì)本機(jī)發(fā)出的包進(jìn)行檢查,此處的路由還沒有確定,所以可以做目的地址轉(zhuǎn)換。實(shí)現(xiàn)某個(gè)網(wǎng)絡(luò)安全功能可能需要在多個(gè)檢查點(diǎn)上注冊(cè)相應(yīng)的結(jié)構(gòu),在后面的分析中我們可以看到具體的例子。

3. iptables

iptables實(shí)現(xiàn)對(duì)規(guī)則的管理和訪問。它里面有幾個(gè)重要的數(shù)據(jù)結(jié)構(gòu)ipt_entry,ipt_match,ipt_target,ipt_table,用于構(gòu)造規(guī)則表。還有一個(gè)重要的函數(shù)ipt_do_table,用于遍歷規(guī)則表并處理規(guī)則表上的結(jié)構(gòu)。

ipt_entry是規(guī)則的數(shù)據(jù)結(jié)構(gòu),如下:

struct ipt_entry

{

struct ipt_ip ip;

unsigned int nfcache;

u_int16_t target_offset;/* target在規(guī)則中的偏移 */

u_int16_t next_offset; /* 下一條規(guī)則的偏移 */

unsigned int comefrom;

struct ipt_counters counters;/* 匹配規(guī)則的數(shù)據(jù)包的統(tǒng)計(jì)計(jì)數(shù) */

unsigned char elems[0];

};

在ipt_entry中ipt_ip是一個(gè)基本的match,它是固定的,用于匹配數(shù)據(jù)包的源地址/源端口、目的地址/目的端口、協(xié)議等。其他的match按需要添加,個(gè)數(shù)并不固定,所以在ipt_entry有一個(gè)變長的字符數(shù)組保存規(guī)則中match的指針,這些指針指向系統(tǒng)中注冊(cè)的match。每個(gè)規(guī)則有一個(gè)target,決定數(shù)據(jù)包完全匹配規(guī)則后怎樣處理這個(gè)數(shù)據(jù)包,它也是一個(gè)指向系統(tǒng)注冊(cè)的target的指針,并且也放在前面提到的變長字符數(shù)組中。ipt_entry中的target_offset是target在規(guī)則中的偏移,偏移是從規(guī)則的起始地址到target所在位置的長度,還有一個(gè)變量next_offset指示下一條規(guī)則偏移,它其實(shí)就是本條規(guī)則的長度。

前面提到在iptables中沿用了LINUX2.2.x中的chain和rule的概念,那么在ipt_entry中如何區(qū)分chain和rule的哪?

我們知道chain是某個(gè)檢查點(diǎn)上檢查的規(guī)則的集合。除了默認(rèn)的chain外,還可以創(chuàng)建新的chain。在iptables中,同一個(gè)chain里的規(guī)則是連續(xù)存放的。默認(rèn)的chain的最后一條規(guī)則的target是chain的policy。用戶創(chuàng)建的chain的最后一條規(guī)則的target的調(diào)用返回值是NF_RETURN,遍歷過程將返回原來的chain。規(guī)則中的target也可以指定跳轉(zhuǎn)到某個(gè)用戶創(chuàng)建的chain上,這時(shí)它的target是ipt_stardard_target,并且這個(gè)target的verdict值大于0。如果在用戶創(chuàng)建的chain上沒有找到匹配的規(guī)則,遍歷過程將返回到原來chain的下一條規(guī)則上。

ipt_match用于匹配數(shù)據(jù)包的參數(shù),如TCP數(shù)據(jù)包中的標(biāo)志位,ICMP協(xié)議中的類型等,每個(gè)match所感興趣的參數(shù)都不一樣,所以一條規(guī)則可能有多個(gè)match。ipt_target決定在數(shù)據(jù)包完全匹配規(guī)則后應(yīng)做什么樣的處理。這兩個(gè)在使用之間都必須先注冊(cè)到系統(tǒng)的鏈表中才能被規(guī)則引用。對(duì)這兩個(gè)數(shù)據(jù)結(jié)構(gòu)不做過多分析,讀者可以自行參考源代碼。

ipt_table是規(guī)則表的數(shù)據(jù)結(jié)構(gòu),如下:

struct ipt_table

{

struct list_head list;

char name[IPT_TABLE_MAXNAMELEN];

struct ipt_replace table;/* 用戶空間傳遞的規(guī)則表 */

unsigned int valid_hooks; /* 有效的檢查點(diǎn)置位*/

rwlock_t lock;

struct ipt_table_info private; /* 規(guī)則表在內(nèi)核中的存儲(chǔ)結(jié)構(gòu) */

struct module *me;

};

在ipt_table中,ipt_replace是用戶空間配置程序傳遞給內(nèi)核的規(guī)則表,這個(gè)規(guī)則表不能直接使用,必須先根據(jù)它里面包含的match和target的名稱將match和target轉(zhuǎn)換成在內(nèi)核注冊(cè)的match和target的指針,還有一項(xiàng)重要的工作是檢查規(guī)則表中是否有循環(huán),如果有循環(huán),要給用戶空間的配置程序報(bào)告錯(cuò)誤。轉(zhuǎn)換之后的規(guī)則表存儲(chǔ)在ipt_table_info中。valid_hooks指示與這個(gè)表相關(guān)的檢查點(diǎn),并把相應(yīng)的位置為1。一個(gè)table中可以有多個(gè)chain,chain分為系統(tǒng)默認(rèn)的chain(與table注冊(cè)的檢查點(diǎn)對(duì)應(yīng))和用戶創(chuàng)建的chain。所有的table都注冊(cè)放在一個(gè)鏈表中,而chain和rule則用偏移值next_offset連接成一個(gè)單向鏈表。

關(guān)于“LINUX 2.4.x 內(nèi)核網(wǎng)絡(luò)安全框架的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

當(dāng)前名稱:LINUX2.4.x內(nèi)核網(wǎng)絡(luò)安全框架的示例分析
文章鏈接:http://muchs.cn/article4/ihcpoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)商城網(wǎng)站、響應(yīng)式網(wǎng)站靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)