陳小中
[摘 要]:網(wǎng)絡(luò)技術(shù)的發(fā)展,由于網(wǎng)絡(luò)協(xié)議自身特點(diǎn),常導(dǎo)致相關(guān)安全問題,本文主要在分析SYN Flood攻擊的基本原理的同時(shí),詳細(xì)地描述了目前比較有效的一種御措施:地址狀態(tài)監(jiān)控技術(shù)。
[關(guān)鍵詞]:SYN Flood攻擊 拒絕服務(wù)攻擊 原理 防御方法
一、SYN Flood攻擊介紹
拒絕服務(wù)攻擊(Denial of Service,DoS)是目前比較有效而又非常難于防御的一種網(wǎng)絡(luò)攻擊方式,它的目的就是使服務(wù)器不能夠?yàn)檎TL問的用戶提供服務(wù)。所以,DoS對(duì)一些緊密依靠互聯(lián)網(wǎng)開展業(yè)務(wù)的企業(yè)和組織帶來(lái)了致命的威脅。SYN Flood是最為有效和流行的一種DoS攻擊形式,它利用TCP三次握手協(xié)議的缺陷,向目標(biāo)主機(jī)發(fā)送大量的偽造源地址的SYN連接請(qǐng)求,消耗目標(biāo)主機(jī)的資源,從而不能夠?yàn)檎S脩籼峁┓?wù)。
1.TCP連接建立的過程
要掌握SYN Flood攻擊的基本原理,必須先了解TCP的三次握手機(jī)制。
TCP三次握手過程如下:
(1)客戶端向服務(wù)器端發(fā)送一個(gè)SYN置位的TCP同步報(bào)文,包含客戶端使用的端口號(hào)和初始序列號(hào)A;
(2)服務(wù)器端收到客戶端發(fā)送來(lái)的SYN報(bào)文后,向客戶端發(fā)送一個(gè)SYN和ACK報(bào)文,包含確認(rèn)號(hào)為A+1和服務(wù)器的初始序列號(hào)B;
(3)TCP客戶端??蛻舳耸盏椒?wù)器返回的SYN+ACK報(bào)文后,向服務(wù)器返回一個(gè)確認(rèn)號(hào)為B+1序號(hào)為A+1的ACK報(bào)文,TCP連接建立完成。如圖1所示:
在SYN Flood攻擊中,黑客機(jī)器向受害主機(jī)發(fā)送大量偽造源地址的TCP SYN報(bào)文,受害主機(jī)分配必要的資源,然后向源地址返回SYN+ACK包,并等待源端返回ACK包,如圖2所示,由于源地址是偽造的,源端永遠(yuǎn)都不會(huì)返回ACK報(bào)文,受害主機(jī)繼續(xù)發(fā)送SYN+ACK包,并將半連接放入端口的積壓隊(duì)列中,雖然一般的主機(jī)都有超時(shí)機(jī)制和默認(rèn)的重傳次數(shù),但是由于端口的半連接隊(duì)列的長(zhǎng)度是有限的,如果不斷的向受害主機(jī)發(fā)送大量的TCP SYN報(bào)文,半連接隊(duì)列就會(huì)很快填滿,服務(wù)器拒絕新的連接,這樣將導(dǎo)致該端口無(wú)法響應(yīng)其他機(jī)器進(jìn)行的正常請(qǐng)求,最終使受害主機(jī)的資源耗盡而癱瘓。
二、地址狀態(tài)監(jiān)控的解決方法
地址狀態(tài)監(jiān)控的解決方法是利用監(jiān)控工具對(duì)網(wǎng)絡(luò)中的有關(guān)TCP連接的數(shù)據(jù)包進(jìn)行監(jiān)控,并對(duì)監(jiān)聽到的數(shù)據(jù)包進(jìn)行處理。處理的主要依據(jù)是連接請(qǐng)求的源地址。
每個(gè)源地址都有一個(gè)狀態(tài)與之對(duì)應(yīng),總共有四種狀態(tài):
初態(tài):任何源地址剛開始的狀態(tài);
NEW狀態(tài):第一次出現(xiàn)或出現(xiàn)多次也不能斷定存在的源地址的狀態(tài);
GOOD狀態(tài):斷定存在的源地址所處的狀態(tài);
BAD狀態(tài):源地址不存在或不可達(dá)時(shí)所處的狀態(tài)。
具體的動(dòng)作和狀態(tài)轉(zhuǎn)換根據(jù)TCP頭中的位碼值決定:
1.監(jiān)聽到SYN包,如果源地址是第一次出現(xiàn),則置該源地址的狀態(tài)為NEW狀態(tài);如果是NEW狀態(tài)或BAD狀態(tài);則將該包的RST位置1然后重新發(fā)出去,如果是GOOD狀態(tài)不作任何處理。
2.監(jiān)聽到ACK或RST包,如果源地址的狀態(tài)為NEW狀態(tài),則轉(zhuǎn)為GOOD狀態(tài);如果是GOOD狀態(tài)則不變;如果是BAD狀態(tài)則轉(zhuǎn)為NEW狀態(tài);如果是BAD狀態(tài)則轉(zhuǎn)為NEW狀態(tài)。
3.監(jiān)聽到從服務(wù)器來(lái)的SYN ACK報(bào)文(目的地址為addr),表明服務(wù)器已經(jīng)為從addr發(fā)來(lái)的連接請(qǐng)求建立了一個(gè)半連接,為防止建立的半連接過多,向服務(wù)器發(fā)送一個(gè)ACK包,建立連接,同時(shí),開始計(jì)時(shí),如果超時(shí),還未收到ACK報(bào)文,證明addr不可達(dá),如果此時(shí)addr的狀態(tài)為GOOD則轉(zhuǎn)為NEW狀態(tài);如果addr的狀態(tài)為NEW狀態(tài)則轉(zhuǎn)為BAD狀態(tài);如果為addr的狀態(tài)為BAD狀態(tài)則不變。
下面介紹基于地址狀態(tài)監(jiān)控的方法如何防御SYN Flood攻擊:
1.對(duì)于一個(gè)偽造源地址的SYN報(bào)文,若源地址第一次出現(xiàn),則源地址的狀態(tài)為NEW狀態(tài),當(dāng)監(jiān)聽到服務(wù)器的SYN+ACK報(bào)文,表明服務(wù)器已經(jīng)為該源地址的連接請(qǐng)求建立了半連接。此時(shí),監(jiān)控程序代源地址發(fā)送一個(gè)ACK報(bào)文完成連接。這樣,半連接隊(duì)列中的半連接數(shù)不是很多。計(jì)時(shí)器開始計(jì)時(shí),由于源地址是偽造的,所以不會(huì)收到ACK報(bào)文,超時(shí)后,監(jiān)控程序發(fā)送RST數(shù)據(jù)包,服務(wù)器釋放該連接,該源地址的狀態(tài)轉(zhuǎn)為BAD狀態(tài)。之后,對(duì)于每一個(gè)來(lái)自該源地址的SYN報(bào)文,監(jiān)控程序都會(huì)主動(dòng)發(fā)送一個(gè)RST報(bào)文。
2.對(duì)于一個(gè)合法的SYN報(bào)文,若源地址第一次出現(xiàn),則源地址的狀態(tài)為NEW狀態(tài),服務(wù)器響應(yīng)請(qǐng)求,發(fā)送SYN+ACK報(bào)文,監(jiān)控程序發(fā)送ACK報(bào)文,連接建立完畢。之后,來(lái)自客戶端的ACK很快會(huì)到達(dá),該源地址的狀態(tài)轉(zhuǎn)為GOOD狀態(tài)。服務(wù)器可以很好的處理重復(fù)到達(dá)的ACK包。
通過以上分析,基于監(jiān)控的方法可以很好地防御SYN Flood攻擊,而不影響正常用戶的連接。
參考文獻(xiàn):
[1]范建華譯. TCP/IP詳解卷1:協(xié)議.機(jī)械工業(yè)出版社,2000,4.