国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
LINUX2.4.x網(wǎng)絡(luò)安全框架
作者:林風(fēng)
1.概述
在分析LINUX2.4.x網(wǎng)絡(luò)安全的實現(xiàn)之前先簡單介紹一下它里面包含的幾個重要概念:netfilter、iptables、match、target、nf_sockopt_ops、網(wǎng)絡(luò)安全功能點的實現(xiàn)。詳細(xì)解釋會在后面的分析中講到。
首先是netfilter,它定義了協(xié)議棧中的檢查點和在檢查點上引用的數(shù)據(jù)結(jié)構(gòu),以及在檢查點上對這些結(jié)構(gòu)引用的過程。iptables定義了實現(xiàn)網(wǎng)絡(luò)安全功能的規(guī)則的組織以及對規(guī)則的操作。一個規(guī)則中包含零個或多個match和一個target,規(guī)則組織沿用了LINUX2.2.x中的chain,rule的概念,但是增加了table的概念,這三者的關(guān)系是:table是實現(xiàn)某項功能所有規(guī)則的總和,chain是在某個檢查點上所引用規(guī)則的集合,rule是一個單獨的規(guī)則。match在規(guī)則中用于匹配數(shù)據(jù)包中的各項參數(shù),每個match匹配特定的參數(shù),所以一個規(guī)則中可以有多個match,這包括系統(tǒng)已定義的match,也包括通過內(nèi)核模塊另外添加的match。target在規(guī)則中決定如何處理匹配到的數(shù)據(jù)包,因此在target中實現(xiàn)了具體的網(wǎng)絡(luò)安全功能。nf_sockopt_ops是在系統(tǒng)調(diào)用get/setssockopt中引用的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)用戶空間對規(guī)則的添加、刪除、修改、查詢等動作。以上的結(jié)構(gòu)在使用之前必須先注冊到系統(tǒng)中才能被引用。
LINUX2.4.x網(wǎng)絡(luò)安全實現(xiàn)了包過濾,地址轉(zhuǎn)換(包含了LINUX2.2.x中的地址偽裝和透明代理功能并有其他擴展功能),連接跟蹤(這是實現(xiàn)地址轉(zhuǎn)換的基礎(chǔ),在它里面實現(xiàn)了對連接狀態(tài)的記錄和監(jiān)控,與狀態(tài)檢測類似),Mangle(這是LINUX2.4.x新增的一個功能,它對數(shù)據(jù)包進(jìn)行檢查但不做禁止、丟棄或允許的判斷)。實現(xiàn)這些功能點需要分別注冊netfilter,iptables,match,target,nf_sockopt_ops的數(shù)據(jù)結(jié)構(gòu)。如果實現(xiàn)其他新的功能,只需定義相應(yīng)的結(jié)構(gòu)并將它注冊到系統(tǒng)中,并且通過用戶空間的配置工具(這個配置工具也須支持新的結(jié)構(gòu))把它加入到規(guī)則中就可以了。這些結(jié)構(gòu)在規(guī)則中自動被引用。
2.netfilter
netfilter定義了協(xié)議棧中的檢查點和檢查點上引用的數(shù)據(jù)結(jié)構(gòu)以及對這些數(shù)據(jù)結(jié)構(gòu)引用的過程。首先看看在檢查點上引用的數(shù)據(jù)結(jié)構(gòu),如圖所示:
圖2.1 nf_hoo_ops數(shù)據(jù)結(jié)構(gòu)的組織
圖中ns_hook_ops就是在檢查點上引用的結(jié)構(gòu)。每個協(xié)議棧預(yù)先定義的8個鏈表數(shù)組用于保存這些結(jié)構(gòu),這些鏈表與協(xié)議棧中的檢查點一一對應(yīng)。在實際的應(yīng)用中,這8個鏈表并不一定都被使用,比如在IPV4中,只定義了5個檢查點,分別對應(yīng)前5個鏈表。nf_hook_ops結(jié)構(gòu)如下:
struct nf_hook_ops { struct list_head list; nf_hookfn hook; /* 函數(shù)指針 */ int pf; /* 結(jié)構(gòu)對應(yīng)的協(xié)議棧號 */ int hooknum; /* 結(jié)構(gòu)對應(yīng)的檢查點號*/ int priority; /* 結(jié)構(gòu)的優(yōu)先值 */ };
nf_register_hook函數(shù)將ns_hook_ops結(jié)構(gòu)注冊到這些鏈表上,鏈表的索引由結(jié)構(gòu)中hooknum指定。同一鏈表上的結(jié)構(gòu)按優(yōu)先值由小到大排列。在檢查點上引用這些結(jié)構(gòu)時,以它們在鏈表上的先后順序引用。
檢查點由宏NF_HOOK定義。在檢查點上,函數(shù)nf_hook_slow調(diào)用函數(shù)nf_iterate遍歷對應(yīng)鏈表并調(diào)用鏈表上的結(jié)構(gòu)ns_hook_ops中定義的函數(shù)。如果結(jié)構(gòu)中的函數(shù)返回NF_ACCEPT,則繼續(xù)調(diào)用下一個結(jié)構(gòu)中的函數(shù);如果結(jié)構(gòu)中的函數(shù)返回NF_DROP或NF_STOLEN或NF_QUEUE,則將這個值返回給nf_hook_slow;如果結(jié)構(gòu)中的函數(shù)返回NF_REPEAT,則重復(fù)調(diào)用此結(jié)構(gòu)上的函數(shù);如果到了鏈表上的最后一個結(jié)構(gòu),則把這個結(jié)構(gòu)中函數(shù)的返回值返回給ns_hook_slow。在ns_hook_slow中判斷nf_iterate的返回值,如果是NF_ACCEPT,則允許數(shù)據(jù)包通過,并將數(shù)據(jù)包傳遞給協(xié)議棧中的下一個函數(shù);如果是NF_DROP,則釋放數(shù)據(jù)包,協(xié)議棧流程中斷;如果是NF_STOLEN,同樣中斷協(xié)議棧的流程,但是沒有釋放這個數(shù)據(jù)包;如果是NF_QUEUE,則將這個包發(fā)送到用戶空間處理,同時中斷協(xié)議棧的流程。
檢查點分布在協(xié)議棧的流程中,下圖是IPV4中的檢查點:
圖2.2 IPV4中的檢查點
圖中檢查點的名稱如下:
檢查點編號 檢查點名稱 檢查點所在文件名
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中檢查點的名稱
圖中,ROUTE(1)處對收到的包做路由查找并判斷這個包是需要轉(zhuǎn)發(fā)的包還是發(fā)往本機上層的包,ROUTE(2)處查找發(fā)出包的路由。NF_IP_PRE_ROUTING處對所有傳入IP層的數(shù)據(jù)包進(jìn)行檢查,在這之前,有關(guān)數(shù)據(jù)包的版本、長度、校驗和等正確性檢查已經(jīng)完成。NF_IP_LOCAL_IN對發(fā)往本機上層的數(shù)據(jù)包進(jìn)行檢查。請注意這兩個檢查點與LINUX2.2.x中檢查點的區(qū)別,在LINUX2.2.x沒有區(qū)分發(fā)往本機上層包和需要轉(zhuǎn)發(fā)的包,所以在做完地址解偽裝之后又調(diào)用了一次路由查找函數(shù),為解偽裝之后的包查找路由。NF_IP_FORWARD處檢查需要轉(zhuǎn)發(fā)的數(shù)據(jù)包。NF_IP_POST_ROUTING處對所有向鏈路層傳遞的數(shù)據(jù)包進(jìn)行檢查,注意在此處數(shù)據(jù)包的路由已經(jīng)確定。NF_IP_LOCAL_OUT對本機發(fā)出的包進(jìn)行檢查,此處的路由還沒有確定,所以可以做目的地址轉(zhuǎn)換。實現(xiàn)某個網(wǎng)絡(luò)安全功能可能需要在多個檢查點上注冊相應(yīng)的結(jié)構(gòu),在后面的分析中我們可以看到具體的例子。
3. iptables
iptables實現(xiàn)對規(guī)則的管理和訪問。它里面有幾個重要的數(shù)據(jù)結(jié)構(gòu)ipt_entry,ipt_match,ipt_target,ipt_table,用于構(gòu)造規(guī)則表。還有一個重要的函數(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)計計數(shù) */ unsigned char elems[0]; };
在ipt_entry中ipt_ip是一個基本的match,它是固定的,用于匹配數(shù)據(jù)包的源地址/源端口、目的地址/目的端口、協(xié)議等。其他的match按需要添加,個數(shù)并不固定,所以在ipt_entry有一個變長的字符數(shù)組保存規(guī)則中match的指針,這些指針指向系統(tǒng)中注冊的match。每個規(guī)則有一個target,決定數(shù)據(jù)包完全匹配規(guī)則后怎樣處理這個數(shù)據(jù)包,它也是一個指向系統(tǒng)注冊的target的指針,并且也放在前面提到的變長字符數(shù)組中。ipt_entry中的target_offset是target在規(guī)則中的偏移,偏移是從規(guī)則的起始地址到target所在位置的長度,還有一個變量next_offset指示下一條規(guī)則偏移,它其實就是本條規(guī)則的長度。
前面提到在iptables中沿用了LINUX2.2.x中的chain和rule的概念,那么在ipt_entry中如何區(qū)分chain和rule的哪?
我們知道chain是某個檢查點上檢查的規(guī)則的集合。除了默認(rèn)的chain外,還可以創(chuàng)建新的chain。在iptables中,同一個chain里的規(guī)則是連續(xù)存放的。默認(rèn)的chain的最后一條規(guī)則的target是chain的policy。用戶創(chuàng)建的chain的最后一條規(guī)則的target的調(diào)用返回值是NF_RETURN,遍歷過程將返回原來的chain。規(guī)則中的target也可以指定跳轉(zhuǎn)到某個用戶創(chuàng)建的chain上,這時它的target是ipt_stardard_target,并且這個target的verdict值大于0。如果在用戶創(chuàng)建的chain上沒有找到匹配的規(guī)則,遍歷過程將返回到原來chain的下一條規(guī)則上。
ipt_match用于匹配數(shù)據(jù)包的參數(shù),如TCP數(shù)據(jù)包中的標(biāo)志位,ICMP協(xié)議中的類型等,每個match所感興趣的參數(shù)都不一樣,所以一條規(guī)則可能有多個match。ipt_target決定在數(shù)據(jù)包完全匹配規(guī)則后應(yīng)做什么樣的處理。這兩個在使用之間都必須先注冊到系統(tǒng)的鏈表中才能被規(guī)則引用。對這兩個數(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; /* 有效的檢查點置位*/ rwlock_t lock; struct ipt_table_info private; /* 規(guī)則表在內(nèi)核中的存儲結(jié)構(gòu) */ struct module *me; };
在ipt_table中,ipt_replace是用戶空間配置程序傳遞給內(nèi)核的規(guī)則表,這個規(guī)則表不能直接使用,必須先根據(jù)它里面包含的match和target的名稱將match和target轉(zhuǎn)換成在內(nèi)核注冊的match和target的指針,還有一項重要的工作是檢查規(guī)則表中是否有循環(huán),如果有循環(huán),要給用戶空間的配置程序報告錯誤。轉(zhuǎn)換之后的規(guī)則表存儲在ipt_table_info中。valid_hooks指示與這個表相關(guān)的檢查點,并把相應(yīng)的位置為1。一個table中可以有多個chain,chain分為系統(tǒng)默認(rèn)的chain(與table注冊的檢查點對應(yīng))和用戶創(chuàng)建的chain。所有的table都注冊放在一個鏈表中,而chain和rule則用偏移值next_offset連接成一個單向鏈表。用戶空間的配置工具在添加、刪除規(guī)則之前先把內(nèi)核中的規(guī)則表取到用戶空間,然后在用戶空間做添加或刪除的動作,然后再將修改過的規(guī)則表傳遞到內(nèi)核空間,由內(nèi)核空間的函數(shù)完成后續(xù)的轉(zhuǎn)換和檢查。
函數(shù)ipt_do_table遍歷table上的規(guī)則,其實這個函數(shù)的指針就保存在nf_hook_ops結(jié)構(gòu)中,并在檢查點上被調(diào)用。調(diào)用這個函數(shù)時須指定它遍歷的table的指針和調(diào)用它的檢查點的值。檢查點的值用來定位table中默認(rèn)chain的位置,前面我們提到,默認(rèn)的chain是和檢查點對應(yīng)的,在檢查點上檢查對應(yīng)chain的規(guī)則。遍歷規(guī)則,如果找到匹配的規(guī)則,則調(diào)用這條規(guī)則的target中定義的函數(shù),并將它的返回值返回給調(diào)用ipt_do_table的函數(shù),如果沒有找到匹配的規(guī)則,則調(diào)用默認(rèn)chain上最后一條規(guī)則的target定義的函數(shù),這個函數(shù)的返回值就是這個chain的policy。
4. nf_sockopt_ops
前面提到LINUX2.4.x網(wǎng)絡(luò)安全框架支持多種協(xié)議。規(guī)則的配置和查詢通過系統(tǒng)調(diào)用get/setsockopt完成。在調(diào)用這兩個系統(tǒng)調(diào)用時,不同協(xié)議使用的參數(shù)不同,所以每個實現(xiàn)網(wǎng)絡(luò)安全功能的協(xié)議棧都定義了自己的nf_sockopt_ops結(jié)構(gòu)并把它注冊系統(tǒng)的鏈表中。在調(diào)用get/setsockopt時根據(jù)不同的參數(shù)決定引用哪一個nf_sockopt_ops來完成真正的工作。
5.網(wǎng)絡(luò)安全功能點的實現(xiàn)
在LINUX2.4.x中實現(xiàn)網(wǎng)絡(luò)安全的功能點需要做以下幾件事情:一是定義nf_hook_ops結(jié)構(gòu),并將它注冊到netfilter中;二是定義iptable,match,target結(jié)構(gòu),并將它注冊到iptables中,如果需要還須注冊nf_sockopt_ops結(jié)構(gòu)以便處理特殊的get/setsockopt參數(shù)。下圖就是IPV4中的功能點注冊到netfilter中的nf_hook_ops結(jié)構(gòu):
圖5.1 IPV4的功能點在各檢查點上注冊的結(jié)構(gòu)
(圖中conntrack代表連接跟蹤;Filter代表包過濾;NAT(src)代表源地址轉(zhuǎn)換,NAT(dst)代表目的地址轉(zhuǎn)換;Mangle是LINUX2.4.x中新增的一個功能,完成對數(shù)據(jù)包的檢查,但是不對數(shù)據(jù)包做禁止或放行的判斷,與Filter不同。Mangle在LINUX2.4.18之前的實現(xiàn)中只在NF_IP_PRE_ROUTING,NF_IP_LOCAL_OUT兩個檢查點上注冊了nf_hook_ops結(jié)構(gòu),在LINUX2.4.18之后的實現(xiàn)中在五個檢查點上都注冊了nf_look_ops結(jié)構(gòu)。)
圖中在每個檢查點上,nf_hook_ops結(jié)構(gòu)按調(diào)用的先后順序從上而下排列??梢钥吹较嗤墓δ茳c在不同的檢查點上它的調(diào)用順序并不相同,這與功能點所做的動作有關(guān)。比如在NF_IP_LOCAL_IN上假設(shè)Conntrack在Filter之前,如果數(shù)據(jù)包的狀態(tài)在Conntrack中被記錄而在Filter中被禁止,那么與這個數(shù)據(jù)包相關(guān)的狀態(tài)就不會完整,浪費了一個Conntrack的結(jié)構(gòu),所以應(yīng)該先調(diào)用Filter,如果它的返回值是NF_ACCEPT才調(diào)用Conntrack。
功能點上注冊的ipt_table,ipt_match,ipt_target,nf_sockopt_ops結(jié)構(gòu)如下表所示:
功能點名稱 ipt_table ipt_match ipt_target nf_sockopt_ops
Filter packet_filter
Nat nat_table   ipt_snat_reg
ipt_dnat_reg
Conntrack       so_getorigdst
Mangle packet_mangler
表5.1 功能點注冊的數(shù)據(jù)結(jié)構(gòu)
值得指出的是連接跟蹤(Conntrack)沒有注冊任何規(guī)則表,說明它不需要規(guī)則來決定是否要作連接跟蹤。同時它又注冊了一個nf_sockopt_ops結(jié)構(gòu),這個結(jié)構(gòu)處理參數(shù)SO_ORIGINAL_DST,用于得到透明代理的目的地址。有關(guān)地址轉(zhuǎn)換和連接跟蹤的詳細(xì)分析會在以后的文章中介紹。
6. 小結(jié)
LINUX2.4.x中的網(wǎng)絡(luò)安全實現(xiàn)比LINUX2.2.x有了明顯的進(jìn)步。首先是IPV4協(xié)議棧中的檢查點的安排更加合理,避免在實現(xiàn)各功能點時不必要的函數(shù)調(diào)用。其次它的架構(gòu)可擴展性很強。把功能實現(xiàn)和框架分離,使功能實現(xiàn)時不必修改框架而只是注冊相應(yīng)的結(jié)構(gòu)就可完成。還有就是在這個網(wǎng)絡(luò)安全框架中實現(xiàn)的功能也比LINUX2.2.x豐富,支持的協(xié)議棧的數(shù)量也比LINUX2.2.x多。在這里我們只分析了LINUX2.4.x網(wǎng)絡(luò)安全實現(xiàn)的大概情況,具體的某個功能的實現(xiàn)會在后面的文章中分析,通過這些分析,我們將學(xué)會如何在LINUX2.4.x的網(wǎng)路安全框架中添加自己想要實現(xiàn)的功能,如何利用現(xiàn)有實現(xiàn)中的資源而有避免與現(xiàn)有的實現(xiàn)沖突。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
netfilter: Linux 防火墻在內(nèi)核中的實現(xiàn)
iptables 源碼分析
netfilter/iptables簡介
netfilter中iptables表的實現(xiàn)
LINUX iptable應(yīng)用手冊(一)
iptables 原理及應(yīng)用詳解(轉(zhuǎn))
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服