日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

LINUX2.4.x网络安全框架

發(fā)布時間:2024/1/17 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LINUX2.4.x网络安全框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  ? ?在分析LINUX2.4.x網(wǎng)絡(luò)安全的實現(xiàn)之前先簡介一下它里面包括的幾個重要概念:netfilter、iptables、match、target、nf_sockopt_ops、網(wǎng)絡(luò)安全功能點的實現(xiàn)。詳解會在后面的分析中講到。 首先是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ù)包進行檢查但不做禁止、丟棄或同意的推斷)。實現(xiàn)這些功能點須要分別注冊netfilter。iptables。match,target。nf_sockopt_ops的數(shù)據(jù)結(jié)構(gòu)。

假設(shè)實現(xiàn)其它新的功能,僅僅需定義對應(yīng)的結(jié)構(gòu)并將它注冊到系統(tǒng)中,而且通過用戶空間的配置工具(這個配置工具也須支持新的結(jié)構(gòu))把它增加到規(guī)則中就能夠了。這些結(jié)構(gòu)在規(guī)則中自己主動被引用。


????????? 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ù)。

假設(shè)結(jié)構(gòu)中的函數(shù)返回NF_ACCEPT。則繼續(xù)調(diào)用下一個結(jié)構(gòu)中的函數(shù);假設(shè)結(jié)構(gòu)中的函數(shù)返回NF_DROP或NF_STOLEN或NF_QUEUE,則將這個值返回給nf_hook_slow;假設(shè)結(jié)構(gòu)中的函數(shù)返回NF_REPEAT,則反復(fù)調(diào)用此結(jié)構(gòu)上的函數(shù)。假設(shè)到了鏈表上的最后一個結(jié)構(gòu)。則把這個結(jié)構(gòu)中函數(shù)的返回值返回給ns_hook_slow。

在ns_hook_slow中推斷nf_iterate的返回值,假設(shè)是NF_ACCEPT,則同意數(shù)據(jù)包通過,并將數(shù)據(jù)包傳遞給協(xié)議棧中的下一個函數(shù)。假設(shè)是NF_DROP。則釋放數(shù)據(jù)包,協(xié)議棧流程中斷;假設(shè)是NF_STOLEN,相同中斷協(xié)議棧的流程。可是沒有釋放這個數(shù)據(jù)包;假設(shè)是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ù)包進行檢查,在這之前,有關(guān)數(shù)據(jù)包的版本號、長度、校驗和等正確性檢查已經(jīng)完畢。

NF_IP_LOCAL_IN對發(fā)往本機上層的數(shù)據(jù)包進行檢查。

請注意這兩個檢查點與LINUX2.2.x中檢查點的差別。在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ù)包進行檢查,注意在此處數(shù)據(jù)包的路由已經(jīng)確定。NF_IP_LOCAL_OUT對本機發(fā)出的包進行檢查,此處的路由還沒有確定。所以能夠做目的地址轉(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_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),假設(shè)有循環(huán),要給用戶空間的配置程序報告錯誤。轉(zhuǎn)換之后的規(guī)則表存儲在ipt_table_info中。valid_hooks指示與這個表相關(guān)的檢查點,并把相應(yīng)的位置為1。一個table中能夠有多個chain,chain分為系統(tǒng)默認的chain(與table注冊的檢查點相應(yīng))和用戶創(chuàng)建的chain。

全部的table都注冊放在一個鏈表中,而chain和rule則用偏移值next_offset連接成一個單向鏈表。

用戶空間的配置工具在加入、刪除規(guī)則之前先把內(nèi)核中的規(guī)則表取到用戶空間,然后在用戶空間做加入或刪除的動作。然后再將改動過的規(guī)則表傳遞到內(nèi)核空間,由內(nèi)核空間的函數(shù)完畢興許的轉(zhuǎn)換和檢查。

????????? 函數(shù)ipt_do_table遍歷table上的規(guī)則,事實上這個函數(shù)的指針就保存在nf_hook_ops結(jié)構(gòu)中。并在檢查點上被調(diào)用。調(diào)用這個函數(shù)時須指定它遍歷的table的指針和調(diào)用它的檢查點的值。檢查點的值用來定位table中默認chain的位置。前面我們提到。默認的chain是和檢查點相應(yīng)的,在檢查點上檢查相應(yīng)chain的規(guī)則。

遍歷規(guī)則,假設(shè)找到匹配的規(guī)則,則調(diào)用這條規(guī)則的target中定義的函數(shù),并將它的返回值返回給調(diào)用ipt_do_table的函數(shù)。假設(shè)沒有找到匹配的規(guī)則,則調(diào)用默認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中,假設(shè)須要還須注冊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)用的先后順序從上而下排列。

能夠看到同樣的功能點在不同的檢查點上它的調(diào)用順序并不同樣。這與功能點所做的動作有關(guān)。比方在NF_IP_LOCAL_IN上假設(shè)Conntrack在Filter之前,假設(shè)數(shù)據(jù)包的狀態(tài)在Conntrack中被記錄而在Filter中被禁止,那么與這個數(shù)據(jù)包相關(guān)的狀態(tài)就不會完整。浪費了一個Conntrack的結(jié)構(gòu)。所以應(yīng)該先調(diào)用Filter,假設(shè)它的返回值是NF_ACCEPT才調(diào)用Conntrack。



????????? 功能點上注冊的ipt_table,ipt_match。ipt_target,nf_sockopt_ops結(jié)構(gòu)例如以下表所看到的:

功能點名稱ipt_tableipt_matchipt_targetnf_sockopt_ops
Filterpacket_filter???
Natnat_table?ipt_snat_reg
ipt_dnat_reg
?
Conntrack???so_getorigdst
Manglepacket_mangler???

????????? 表5.1 功能點注冊的數(shù)據(jù)結(jié)構(gòu)

????????? 值得指出的是連接跟蹤(Conntrack)沒有注冊不論什么規(guī)則表。說明它不須要規(guī)則來決定是否要作連接跟蹤。同一時候它又注冊了一個nf_sockopt_ops結(jié)構(gòu)。這個結(jié)構(gòu)處理參數(shù)SO_ORIGINAL_DST,用于獲得透明代理的目的地址。

?

總結(jié)

以上是生活随笔為你收集整理的LINUX2.4.x网络安全框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。