[摘要] 本文介紹了分布式拒絕服務(wù)防御技術(shù)中SYN Cookie的原理,提出一種改進(jìn)目前嵌入式Linux中SYN Cookie技術(shù)的思路,并在基于INTEL IXP網(wǎng)絡(luò)處理器的硬件平臺(tái)上,得到了實(shí)踐和驗(yàn)證。
[關(guān)鍵詞] 分布式拒絕服務(wù)嵌入式LINUX路由器Intel IXP處理器
在目前的因特網(wǎng)體系結(jié)構(gòu)中,網(wǎng)絡(luò)安全一直是一個(gè)不容被忽視的問(wèn)題,在各類(lèi)網(wǎng)絡(luò)環(huán)境中,SYN Flood是一種非常危險(xiǎn)而常見(jiàn)的DDoS攻擊方式,而能夠有效防范SYN Flood攻擊的手段并不多,SYN Cookie是其中最著名的一種,筆者在設(shè)計(jì)一個(gè)基于IXP1200的路由器軟件時(shí),對(duì)SYN Cookie技術(shù)實(shí)現(xiàn)進(jìn)行了相關(guān)實(shí)踐。
一、SYN Flood攻擊和SYN Cookie原理
SYN Flood攻擊是一種典型的拒絕服務(wù)型攻擊,它利用的是TCP協(xié)議的三次握手過(guò)程進(jìn)行的攻擊。TCP協(xié)議規(guī)定,如果一端想向另一端發(fā)起連接,它需要首先發(fā)送TCP SYN 包到對(duì)方,對(duì)方收到后發(fā)送一個(gè)TCP SYN+ACK包回來(lái),發(fā)起方再發(fā)送TCP ACK包回去,這樣三次握手就結(jié)束了。我們把TCP連接的發(fā)起方叫作”TCP客戶機(jī)”,TCP連接的接收方叫作“TCP服務(wù)器”,值得注意的是在TCP服務(wù)器收到TCP SYN request包時(shí),在發(fā)送TCP SYN+ACK包回TCP客戶機(jī)前,TCP服務(wù)器要先分配好一個(gè)數(shù)據(jù)區(qū)專(zhuān)門(mén)服務(wù)于這個(gè)即將形成的TCP連接,這種連接狀態(tài)稱(chēng)半開(kāi)連接。在最常見(jiàn)的SYN Flood攻擊中,攻擊者在短時(shí)間內(nèi)發(fā)送大量的TCP SYN包給受害者,這時(shí)攻擊者是TCP客戶機(jī),受害者是TCP服務(wù)器,受害者會(huì)為每個(gè)TCP SYN包分配一個(gè)特定的數(shù)據(jù)區(qū),只要這些SYN包具有不同的源地址,這將最終導(dǎo)致系統(tǒng)不能正常工作。
SYN Cookie是對(duì)TCP服務(wù)器端的三次握手協(xié)議做一些修改,專(zhuān)門(mén)用來(lái)防范SYN Flood攻擊。它的原理是,在TCP服務(wù)器收到TCP SYN包并返回TCP SYN+ACK包時(shí),不分配一個(gè)專(zhuān)門(mén)的數(shù)據(jù)區(qū),而是根據(jù)這個(gè)SYN包計(jì)算出一個(gè)cookie值。在收到TCP ACK包時(shí),TCP服務(wù)器再根據(jù)那個(gè)cookie值檢查這個(gè)TCP ACK包的合法性。如果合法,再分配專(zhuān)門(mén)的數(shù)據(jù)區(qū)進(jìn)行處理。
二、Linux內(nèi)核中SYN Cookie實(shí)現(xiàn)技術(shù)分析
在Linux內(nèi)核中對(duì)SYN Flood有很好的防護(hù),在每一個(gè)sock中都有一個(gè)tcp_opt選項(xiàng)。在tcp_opt中有一個(gè)tcp_listen_opt,這里存儲(chǔ)的是這個(gè)sock在LISTEN狀態(tài)下時(shí)保存的一些選項(xiàng),其中有一個(gè)open_request結(jié)構(gòu)的數(shù)組,數(shù)組長(zhǎng)度為T(mén)CP_SYNQ_HSIZE(512),最多可以同時(shí)開(kāi)啟512個(gè)半開(kāi)連接。當(dāng)這個(gè)數(shù)組滿了時(shí),新來(lái)的open_request會(huì)頂替掉一個(gè)老的open_request。但問(wèn)題是,這種處理方法會(huì)在面對(duì)SYN Flood攻擊時(shí)丟掉正常的連接請(qǐng)求。SYN Cookie的作用恰恰是保證在面對(duì)SYN Flood攻擊時(shí),一方面能夠拒絕非法的TCP連接請(qǐng)求,一方面正常連接可以被建立。Linux內(nèi)核對(duì)TCP流程的處理主要在tcp_ipv4.c文件中的函數(shù)實(shí)現(xiàn)。
上面介紹的就是Linux中對(duì)SYN Cookie的實(shí)現(xiàn)方式,合法的TCP連接請(qǐng)求一定可以通過(guò)SYN Cookie流程。
三、基于IXP1200網(wǎng)絡(luò)處理器的SYN Cookie技術(shù)研究
從上文介紹可以看到,Linux中的SYN Cookie機(jī)制主要功能是防止本機(jī)遭受SYN Flood攻擊,但在筆者實(shí)踐中,不僅需要讓設(shè)備自身對(duì)SYN Flood攻擊免疫,而且還要保護(hù)它后面所有對(duì)外開(kāi)放TCP端口的主機(jī)免受攻擊。
為此,我們利用原SYN Cookie原理在內(nèi)網(wǎng)和外網(wǎng)之間實(shí)現(xiàn)TCP三次握手過(guò)程的代理。
在代理LINUX系統(tǒng)S收到來(lái)自外網(wǎng)的SYN包時(shí),它并不直接轉(zhuǎn)發(fā),而是緩存在本地,再按照原來(lái)SYN Cookie的機(jī)制制作好一個(gè)針對(duì)這個(gè)SYN包的SYN+ACK包,注意,這個(gè)SYN+ACK包中的ack順序號(hào)為特制的cookie值c,更重要的是這個(gè)包的的源地址被偽造成了S的地址。這樣C會(huì)接收到這個(gè)SYN+ACK包,并認(rèn)為是從S反饋回來(lái)的。于是C再響應(yīng)一個(gè)ACK包,并認(rèn)為與S的TCP連接已經(jīng)建立起來(lái)。這時(shí)防火墻F收到這個(gè)ACK包,按照前面的描述的SYN Cookie原理來(lái)檢查這個(gè)ACK中的ack順序號(hào)。如果認(rèn)為合法,F(xiàn)將本地緩存的來(lái)自C的SYN包發(fā)送給S,這時(shí)S會(huì)響應(yīng)一個(gè)SYN+ACK包到C,其中也攜帶一個(gè)seq號(hào), 我們?cè)O(shè)為c`。當(dāng)然這個(gè)包不會(huì)到達(dá)C,而是由防火墻F截取,F(xiàn)根據(jù)這個(gè)包中的序列號(hào)等信息,造一個(gè)ACK包響應(yīng)到S。這時(shí)的情況是:C認(rèn)為自己已經(jīng)與S建立了TCP連接;S認(rèn)為自己與C建立了TCP連接。以后的TCP數(shù)據(jù)內(nèi)容可以直接穿過(guò)防火墻F,在S和C之間交互。
它相當(dāng)于在TCP Server與TCP Client之間實(shí)現(xiàn)了對(duì)三次握手協(xié)議的代理。第一次”三次握手”在TCP Client與代理LINUX系統(tǒng)之間進(jìn)行,第二次”三次握手”在代理LINUX系統(tǒng)與TCP Server之間。
四、結(jié)束語(yǔ)
通過(guò)對(duì)LINUX下SYN Cookies的分析和在IXP平臺(tái)下的實(shí)踐,我們改進(jìn)了SYN Cookies的工作機(jī)制,就是當(dāng)服務(wù)器從特定主機(jī)接收到一個(gè)SYN請(qǐng)求時(shí),它返回給主機(jī)一個(gè)SYN-ACK包,但是服務(wù)器并不立即進(jìn)入SYN_RECD狀態(tài),而是根據(jù)參數(shù)通過(guò)一個(gè)哈希函數(shù)計(jì)算所需要的初始連接序列字,這樣,在三次握手過(guò)程中,當(dāng)?shù)谌齻€(gè)數(shù)據(jù)包返回時(shí),服務(wù)器只需檢查序列字是否和計(jì)算的哈希函數(shù)結(jié)果值相匹配,從而防止同一個(gè)發(fā)起者稍后重新使用相同的序列字。
參考文獻(xiàn):
[1]沈清等:基于SYN Cookie下防分布式拒絕服務(wù)攻擊算法的分析與實(shí)現(xiàn).計(jì)算機(jī)應(yīng)用,2005.12
[2]林闖等:基于Intel網(wǎng)絡(luò)處理器的路由器隊(duì)列管理:設(shè)計(jì)、實(shí)現(xiàn)與分析.計(jì)算機(jī)學(xué)報(bào),2003.09
[3]賀冰琰姜帥:基于網(wǎng)絡(luò)處理器IXP1200的路由查找功能的微碼實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī), 2007,(01)