中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LINUX 2.4.x 內核網絡安全框架的示例分析

發布時間:2021-12-27 09:23:10 來源:億速云 閱讀:197 作者:小新 欄目:系統運維

這篇文章將為大家詳細講解有關LINUX 2.4.x 內核網絡安全框架的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1.概述

在分析LINUX2.4.x網絡安全的實現之前先簡單介紹一下它里面包含的幾個重要概念:netfilter、iptables、match、target、nf_sockopt_ops、網絡安全功能點的實現。詳細解釋會在后面的分析中講到。

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

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

2.netfilter

netfilter定義了協議棧中的檢查點和檢查點上引用的數據結構以及對這些數據結構引用的過程。首先看看在檢查點上引用的數據結構,如圖所示:

圖中ns_hook_ops就是在檢查點上引用的結構。每個協議棧預先定義的8個鏈表數組用于保存這些結構,這些鏈表與協議棧中的檢查點一一對應。在實際的應用中,這8個鏈表并不一定都被使用,比如在IPV4中,只定義了5個檢查點,分別對應前5個鏈表。nf_hook_ops結構如下:

struct nf_hook_ops

{

struct list_head list;

nf_hookfn hook; /* 函數指針 */

int pf; /* 結構對應的協議棧號 */

int hooknum;  /* 結構對應的檢查點號*/

int priority; /* 結構的優先值 */

};

nf_register_hook函數將ns_hook_ops結構注冊到這些鏈表上,鏈表的索引由結構中hooknum指定。同一鏈表上的結構按優先值由小到大排列。在檢查點上引用這些結構時,以它們在鏈表上的先后順序引用。

檢查點由宏NF_HOOK定義。在檢查點上,函數nf_hook_slow調用函數nf_iterate遍歷對應鏈表并調用鏈表上的結構ns_hook_ops中定義的函數。如果結構中的函數返回NF_ACCEPT,則繼續調用下一個結構中的函數;如果結構中的函數返回NF_DROP或NF_STOLEN或NF_QUEUE,則將這個值返回給nf_hook_slow;如果結構中的函數返回NF_REPEAT,則重復調用此結構上的函數;如果到了鏈表上的最后一個結構,則把這個結構中函數的返回值返回給ns_hook_slow。在ns_hook_slow中判斷nf_iterate的返回值,如果是NF_ACCEPT,則允許數據包通過,并將數據包傳遞給協議棧中的下一個函數;如果是NF_DROP,則釋放數據包,協議棧流程中斷;如果是NF_STOLEN,同樣中斷協議棧的流程,但是沒有釋放這個數據包;如果是NF_QUEUE,則將這個包發送到用戶空間處理,同時中斷協議棧的流程。

檢查點分布在協議棧的流程中,下圖是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)處對收到的包做路由查找并判斷這個包是需要轉發的包還是發往本機上層的包,ROUTE(2)處查找發出包的路由。NF_IP_PRE_ROUTING處對所有傳入IP層的數據包進行檢查,在這之前,有關數據包的版本、長度、校驗和等正確性檢查已經完成。NF_IP_LOCAL_IN對發往本機上層的數據包進行檢查。請注意這兩個檢查點與LINUX2.2.x中檢查點的區別,在LINUX2.2.x沒有區分發往本機上層包和需要轉發的包,所以在做完地址解偽裝之后又調用了一次路由查找函數,為解偽裝之后的包查找路由。NF_IP_FORWARD處檢查需要轉發的數據包。NF_IP_POST_ROUTING處對所有向鏈路層傳遞的數據包進行檢查,注意在此處數據包的路由已經確定。NF_IP_LOCAL_OUT對本機發出的包進行檢查,此處的路由還沒有確定,所以可以做目的地址轉換。實現某個網絡安全功能可能需要在多個檢查點上注冊相應的結構,在后面的分析中我們可以看到具體的例子。

3. iptables

iptables實現對規則的管理和訪問。它里面有幾個重要的數據結構ipt_entry,ipt_match,ipt_target,ipt_table,用于構造規則表。還有一個重要的函數ipt_do_table,用于遍歷規則表并處理規則表上的結構。

ipt_entry是規則的數據結構,如下:

struct ipt_entry

{

struct ipt_ip ip;

unsigned int nfcache;

u_int16_t target_offset;/* target在規則中的偏移 */

u_int16_t next_offset; /* 下一條規則的偏移 */

unsigned int comefrom;

struct ipt_counters counters;/* 匹配規則的數據包的統計計數 */

unsigned char elems[0];

};

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

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

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

ipt_match用于匹配數據包的參數,如TCP數據包中的標志位,ICMP協議中的類型等,每個match所感興趣的參數都不一樣,所以一條規則可能有多個match。ipt_target決定在數據包完全匹配規則后應做什么樣的處理。這兩個在使用之間都必須先注冊到系統的鏈表中才能被規則引用。對這兩個數據結構不做過多分析,讀者可以自行參考源代碼。

ipt_table是規則表的數據結構,如下:

struct ipt_table

{

struct list_head list;

char name[IPT_TABLE_MAXNAMELEN];

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

unsigned int valid_hooks; /* 有效的檢查點置位*/

rwlock_t lock;

struct ipt_table_info private; /* 規則表在內核中的存儲結構 */

struct module *me;

};

在ipt_table中,ipt_replace是用戶空間配置程序傳遞給內核的規則表,這個規則表不能直接使用,必須先根據它里面包含的match和target的名稱將match和target轉換成在內核注冊的match和target的指針,還有一項重要的工作是檢查規則表中是否有循環,如果有循環,要給用戶空間的配置程序報告錯誤。轉換之后的規則表存儲在ipt_table_info中。valid_hooks指示與這個表相關的檢查點,并把相應的位置為1。一個table中可以有多個chain,chain分為系統默認的chain(與table注冊的檢查點對應)和用戶創建的chain。所有的table都注冊放在一個鏈表中,而chain和rule則用偏移值next_offset連接成一個單向鏈表。

關于“LINUX 2.4.x 內核網絡安全框架的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴隆县| 临朐县| 淮南市| 镇赉县| 德州市| 肥东县| 桐柏县| 开鲁县| 大连市| 西充县| 彭泽县| 准格尔旗| 苍梧县| 东安县| 弋阳县| 英山县| 台州市| 连州市| 广德县| 叶城县| 卢氏县| 文昌市| 达州市| 岚皋县| 嘉峪关市| 乌拉特中旗| 冷水江市| 汉阴县| 湄潭县| 陆丰市| 遂溪县| 驻马店市| 中江县| 惠来县| 甘南县| 奉新县| 四平市| 保山市| 萝北县| 成都市| 伊宁县|