李 旭,路 娟
(1.新疆財經(jīng)大學(xué) 計算機科學(xué)與工程學(xué)院,烏魯木齊 830012;2.北京交通大學(xué),北京 100044)
Netfilter就是在網(wǎng)絡(luò)的若干位置放置一些鉤子點(hook),在每個鉤子點注冊一些處理函數(shù),并根據(jù)一定的規(guī)則存入內(nèi)核空間的特定鏈表中。這些函數(shù)對流經(jīng)的數(shù)據(jù)包進行處理,如連線跟蹤,NAT,包過濾等等[1]。Netfilter的注冊、存儲和處理關(guān)系如圖1所示。
圖1 Netfilter內(nèi)部關(guān)系圖
設(shè)置防火墻的過濾規(guī)則,并將規(guī)則添加到內(nèi)核空間的特定信息包過濾表內(nèi)的鏈表中,通過Netfilter框架的鉤子函數(shù)完成對數(shù)據(jù)包的過濾工作。Netfilter內(nèi)核模塊是完成對數(shù)據(jù)包進行分析和處理的地方,是一種內(nèi)核中用于擴展各種網(wǎng)絡(luò)安全服務(wù)的結(jié)構(gòu)化底層框架。Netfilter定義了協(xié)議棧中的檢查點和檢查點上引用的數(shù)據(jù)結(jié)構(gòu)以及對這些數(shù)據(jù)結(jié)構(gòu)引用的過程。數(shù)據(jù)包在協(xié)議棧上經(jīng)過五個檢查點會被Netfilter模塊注冊為鉤子函數(shù),并捕獲分析[2]。五個檢查點的分布如圖2所示。
圖2 Netfilter Hook檢測點示意圖
鉤子函數(shù)的注冊是通過int nf_register_hook(struct nf_hook_ops*reg)函數(shù)進行的。每個注冊的鉤子點函數(shù)分析數(shù)據(jù)包后都會返回下列值之一,告訴Netfilter核心代碼分析的結(jié)果,以方便Netfilter模塊對數(shù)據(jù)包做相應(yīng)的處理。
(1)NF_ACCEPT:允許數(shù)據(jù)包通過,繼續(xù)傳給協(xié)議棧中的下一個函數(shù);
(2)NF_DROP:丟棄該數(shù)據(jù)包;
(3)NF_STOLEN:由鉤子函數(shù)處理該數(shù)據(jù)包,不再繼續(xù)傳送;
(4)NF_QUEUE:將數(shù)據(jù)包送到用戶空間處理,協(xié)議棧流終端;
表1 HOOK檢查點對應(yīng)函數(shù)
(5)NF_REPEAT:再次調(diào)用鉤子函數(shù),該返回值要慎重使用,防止造成死循環(huán)。[3]
Netfilter實現(xiàn)代碼都是通過NF_HOOK宏嵌入在網(wǎng)絡(luò)協(xié)議棧的代碼中,在所有需要進行檢查過濾的地方,基本上都調(diào)用了HF_HOOK宏,這對于數(shù)據(jù)包的過濾和用戶自己的擴展,提供了接口。
不過,對比行業(yè)來看,情況則沒有那么樂觀,同一區(qū)間內(nèi)才府玻璃對比的同業(yè)綜合毛利率平均值分別為:27.19%、26.72%、25.94%和24.90%。行業(yè)毛利率走勢呈現(xiàn)明顯下滑態(tài)勢,這與玻璃包裝容器產(chǎn)量、銷量等從高峰逐步回落的走勢基本吻合,我國玻璃包裝容器年產(chǎn)量從2015年和2016年的2047萬噸和2064萬噸的高峰陡然下滑,2017年僅錄得1827.53萬噸。這一銷量走勢表明,行業(yè)當(dāng)下正處于調(diào)整的陣痛期。
為了實現(xiàn)管理口的防護功能,在Netfilter中需要對以下函數(shù)進行定義。
(1)static int__init access_init(void):這是模塊的初始化函數(shù),完成鉤子函數(shù)參數(shù)的指定。內(nèi)核模塊在初始化時調(diào)用Netfilter提供的接口函數(shù)nf_register_hook(struct nf_hook_ops*reg)來注冊處理函數(shù),reg為nf_hook_ops結(jié)構(gòu)體類型指針,自定義的函數(shù)指針即保持在該結(jié)構(gòu)體中。
(2)static unsigned int access_local_in_hook(unsigned int hooknum,struct sk_buff*skb,const struct net_device*in,const struct net_device*out,int(*okfn)(struct sk_buff*)):鉤子函數(shù)的定義,該函數(shù)針對控制口的訪問進行了相應(yīng)的防御操作。
(3)static void access_exit(void):模塊注銷函數(shù),完成鉤子函數(shù)的注銷功能。注銷鉤子函數(shù),只需要調(diào)用nf_unregister_hook(&local_access_op)函數(shù),并且以之前注冊這個hook時用到的相同數(shù)據(jù)結(jié)構(gòu)地址作為參數(shù)。
通過調(diào)用上述三個函數(shù),就可以搭建基于Netfilter的管理口防護框架,通過協(xié)議棧的數(shù)據(jù)包將被鉤子函數(shù)調(diào)用并進行相應(yīng)的處理。
管理口防護功能是為了阻止局域網(wǎng)對防火墻管理口的攻擊。針對該問題,對訪問管理口做了權(quán)限設(shè)置,包括請求方式和IP地址范圍。配置相應(yīng)的IP地址范圍和請求方式,當(dāng)數(shù)據(jù)包請求時,access_local_in_hook()鉤子函數(shù)首先判斷該數(shù)據(jù)包的請求方式,請求方式匹配成功之后再去地址池匹配IP地址,如果匹配成功則返回NF_ACCEPT,繼續(xù)傳給協(xié)議棧中的下一個函數(shù);反之,返回NF_ACCEPT,放棄該數(shù)據(jù)包。
請求方式(acc_type) 包括 HTTP、SSH、TELNET、PING和HTTPS,開辟內(nèi)存共享來存儲IP地址,不同的請求方式對應(yīng)著不同的IP地址范圍。IP地址以鏈表的形勢存儲,port_ip_list為指向共享內(nèi)存首地址的指針。
配置方式如下:
(1)允許 192.168.50.0/24 網(wǎng)段的 HTTP 請求,管理口為eth0
interface eth0 allow access http ip 192.168.50.0/24
(2)允許 192.168.50.198 地址的 TELNET 請求,管理口為eth0
interface eth0 allow access telnet ip 192.168.50.198
(3)不允許 192.168.50.198 地址的 TELNET 請求,管理口為eth0
interface eth0 no allow access telnet ip 192.168.50.198
(4)允許所有IP的PING請求,管理口為eth0
interface eth0 allow access ping
從以上配置可以驗證,只允許 192.168.50.0/24網(wǎng)段的HTTP數(shù)據(jù)包請求和所有的PING數(shù)據(jù)包請求,其他所有數(shù)據(jù)包均被丟棄。
通過分析Netfilter防火墻的工作原理,本文設(shè)計并實現(xiàn)了防火墻管理口防護的功能。通過測試表明,該功能有效地阻止了局域網(wǎng)對防火墻管理口的攻擊,保證了網(wǎng)絡(luò)可以被正常訪問、配置。
[1]賴思銀.Linux下基于 Netfilter防火墻應(yīng)用研究[J].計算機時代,2011(9).
[2]劉建志,田志宏.基于Netfilter框架和IPQueue機制的輕量級網(wǎng)絡(luò)防火墻實現(xiàn)[J].智能計算機與應(yīng)用,2012(4).
[3]http://www.netfilter.org/documentation/HOWTO/netfilterhacking-HOWTO-1.html2002.