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