禹定臣 夏躍偉 劉金廣
(1.黃淮學院信息工程學院,河南駐馬店 463000;2.漯河職業(yè)技術學院計算機工程系,漯河 462000 3.黃淮學院信息工程學院,河南駐馬店 463000)
隨著網(wǎng)絡技術的不斷發(fā)展,給人們帶來便利的同時,也給人們的網(wǎng)絡安全帶來了巨大的隱患,如何做到有效的控制網(wǎng)絡的安全性成為當今研究的主要課題。防火墻技術就此產(chǎn)生,它是防止網(wǎng)絡攻擊的重要手段,目前的防火墻技術已經(jīng)發(fā)展到一定的水平,商業(yè)產(chǎn)品也有很多,防火墻的主要作用就是防止外部網(wǎng)絡對內(nèi)部網(wǎng)絡進行攻擊,一個標準的網(wǎng)絡防火墻的模型可以如圖1。
圖1 防火墻模型
防火墻的設計的一個重要規(guī)則就是要使內(nèi)部網(wǎng)絡能夠輕松的訪問到外部網(wǎng)絡,外部網(wǎng)絡不能夠隨意的訪問到內(nèi)部網(wǎng)絡。因此,防火墻的設計可以采用兩種默認規(guī)則:一個是完全的默認所有數(shù)據(jù)包能夠通過,只要預定的一些數(shù)據(jù)包不能通過。另外一種默認規(guī)則就是完全阻止所有的數(shù)據(jù)包,只有預定的數(shù)據(jù)包能夠通過。本課題采用的默認禁止的策略。根據(jù)數(shù)據(jù)包的來源,禁止或者允許該數(shù)據(jù)包的通過與否。防火墻設計的規(guī)則需要知道數(shù)據(jù)包的源IP地址、目的IP地址,數(shù)據(jù)包的源端口和目的端口等信息。
1.在網(wǎng)絡攻擊中,一種常見的攻擊方式就是ICMP攻擊,這個攻擊是采用的向主機發(fā)送大量的ICMP數(shù)據(jù)包,致使主機耗費大量的時間去處理該數(shù)據(jù)包。在本課題中,為了應對這種攻擊,減少主機處理ICMP數(shù)據(jù)包的處理時間和數(shù)量,在單位時間內(nèi),限制ICMP數(shù)據(jù)包的個數(shù),而且為了防止異常的ICMP數(shù)據(jù)包,限定該包的大小,如果大于規(guī)定的數(shù)值則認為是異常包,直接丟棄。在linux的netfilter的NF_IP_PRE_ROUTIN開始處理。具體的處理代碼如下:
icmp_fire(void)
{
int count=0;//進入主機的ICMP包計數(shù)
Int m=10;//單位時間最大允許ICMP包數(shù)量
if(ip->version==0)// 判斷是否是 ICMP 包
{
If(ip->long>64)//判斷icmp包的大小是否在64字節(jié)以內(nèi)
DROP; //丟棄包
}
}
struct timer_list timer;//定義內(nèi)核定時器
void timer_function(int para);//作為內(nèi)核定時器的處理函數(shù),此處para為形參而實際值由timer.data傳遞過來。
{
printk("<0>Timer Expired and para is %d !! ",para);//輸出data參
}
int timer_init() //模塊初始化函數(shù)
{
init_timer(&timer);//初始化定時器鏈表
timer.data = 5;//參數(shù)為5,用于timer.function
timer.expires = jiffies + (20 * HZ);//設置定時時間為20秒
timer.function = timer_function;//設置操作函數(shù)
add_timer(&timer);//啟動定時器
//注意以上幾個函數(shù)的參數(shù)均為指針類型的,所以用&取地址
return 0;
}
void timer_exit()
{
del_timer( &timer );
}
2.SYN flood攻擊
網(wǎng)絡攻擊中的另外一種常見的攻擊方式就是SYN攻擊,它的攻擊原理就是不斷的向主機發(fā)送大量的SYN請求,可是又不回應主機的應答信息,主機會不停地重新發(fā)送應答信息,浪費主機的時間和空間資源。在netfilter的NF_IP_FORWARD這個鉤子點,是所有數(shù)據(jù)包通過防火墻的點,可以在該點設計防止SYN攻擊。同時要考慮到防火墻的開放性和完整性。為了方便,需要用到linux內(nèi)核中的狀態(tài)檢測機制,在TCP通信過程中,有三次握手,則定為三種狀態(tài)。通過定義三個宏來標識這三個狀態(tài):
TCP_SYN 0
TCP_ACCEPT 1
TCP_ACK 2
TCP_STATE_NUM 3
在設計過程中,通過定義一個哈希表ip_infor_hash來儲存處理的數(shù)據(jù)包,該哈希表的每一個節(jié)點都是一個雙向鏈表。當數(shù)據(jù)包到達NF_IP_FORWARD鉤子點的時候,分析該數(shù)據(jù)包的內(nèi)在信息,IP地址、源端口、目的端口等,以及該數(shù)據(jù)包的狀態(tài)信息。如果這個地址的數(shù)據(jù)包已經(jīng)存在于哈希表中,則認為它現(xiàn)有的狀態(tài)時不正確的,直接丟棄該數(shù)據(jù)包。如果哈希表中沒有改地址的數(shù)據(jù)包,則對這個數(shù)據(jù)包進行檢查,如果檢查數(shù)據(jù)包是錯誤的,則將這個數(shù)據(jù)包信息放到哈希表中,否則直接讓這個數(shù)據(jù)包通過這個鉤子點。
struct pack_info
{
struct list_head ip_list; //定義為一個鏈表結構
struct inaddr src,dst;//表示數(shù)據(jù)包的源地址和目的地址
u_int16_t proto;//數(shù)據(jù)包的傳輸協(xié)議類型
u_int16_t spts,dpts ; //數(shù)據(jù)包的源端口和目的端口
u_int8_t addr_flag ; //這是判斷地址信息的真假狀態(tài)標志。為0就表示地址是假,為1則表示為真
u_int8_t pack_state;//數(shù)據(jù)包擁有的狀態(tài)標志
u_int32_t sequence ;//TCP數(shù)據(jù)包中序列號
u_int32_t ackno ;//TCP數(shù)據(jù)包的確認序列號
struct ntimer_list timeout ; //定時器,到達定時則刪除這條記錄
}
static unsigned int ipt_forward(unsigned int hook,struct sk_uff **pskb,const struct
net_device in, const struct net_device out,int(okfn)(struct sk_uff*))
{
int judge,new_flag,verdict;process_defend_dos(pskb,&new_flag ,&verdict);if(new_flag)
{
judge=ipt_do_table(pskb,HOOK,in,out,&packet_filter,NULL);
Insert_hash_info(pskb);
Return judge;
}
return verdict;
}
上面的邏輯中,對DOS攻擊的邏輯處理都在process_defend_dos函數(shù)中實現(xiàn)。這個函數(shù)的三個參數(shù)類型分別為struct sk_buff, 首先在協(xié)議棧中有關數(shù)據(jù)的傳輸是通過變量值進行的,這個變量值就是structsk_buff,其次關于第2個參數(shù)是用來判斷的,判斷會話連接中的第1個數(shù)據(jù)包是否是此數(shù)據(jù)包,最后關于第3個參數(shù)是用來存放判斷結果的。關于該數(shù)據(jù)對會話連接有兩個方面,第一個就是如果這個數(shù)據(jù)包不是在會話連接的第一次,則把判斷的結果直接放到參數(shù)中去,同時返回該判斷結果,第二就是如果這個是會話中連接的第一個數(shù)據(jù)包,就把該數(shù)據(jù)包的信息放到哈希表中,然后也返回該數(shù)據(jù)包的判斷結果,Netfilter中一個重要的處理函數(shù)是ipt_do_table,該函數(shù)的主要功能就是對規(guī)則進行匹配操作,如果得到了匹配的規(guī)則后,就會按照要求分別進行對應的處理,這期間也會return一個對數(shù)據(jù)包的判斷結果。
在DOS攻擊中,常見的攻擊有ICMP攻擊、SYN攻擊,本課題在防火墻設計工程中,分析了這兩種攻擊的原理,分析了linux的Netfilter機制,然后構建了一個抵抗這兩種攻擊的防火墻,通過實驗的驗證,本設計的防御能力對于輕度和中度的攻擊行為能有較好的能力。
[1]周小勇.軟件防火墻設計[J].華中科技大學學報(自然科學版), 2008;32(3):83-85.
[2]毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學出版社,2001.
[3]付志剛.Linux內(nèi)核防火墻分析 ,計算機工程[J],2009;11(3):56-60.
[4]Potter.B.open source firewall alternatives[J].Network security,2006;18(6):16-17.
[5]唐振云,李曉霞.Linux網(wǎng)絡內(nèi)核的機制分析[J].計算機應用, 2010;25(1):76-84.