SYN-Flood攻擊是當(dāng)前網(wǎng)絡(luò)上最為常見的DDoS攻擊,也是最為經(jīng)典的拒絕服務(wù)攻擊,它利用了TCP協(xié)議實(shí)現(xiàn)上的一個(gè)缺陷,通過向網(wǎng)絡(luò)服務(wù)所在端口發(fā)送大量的偽造源地址的攻擊報(bào)文,就可能造成目標(biāo)服務(wù)器中的半開連接隊(duì)列被占滿,從而阻止其他合法用戶進(jìn)行訪問。這種攻擊早在1996年就被發(fā)現(xiàn),但至今仍然顯示出強(qiáng)大的生命力。很多操作系統(tǒng),甚至防火墻、路由器都無(wú)法有效地防御這種攻擊,而且由于它可以方便地偽造源地址,追查起來(lái)非常困難。它的數(shù)據(jù)包特征通常是,源發(fā)送了大量的SYN包,并且缺少三次握手的最后一步握手ACK回復(fù)。
SYN Flood攻擊原理
例如,攻擊者首先偽造地址對(duì)服務(wù)器發(fā)起SYN請(qǐng)求(我可以建立連接嗎?),服務(wù)器就會(huì)回應(yīng)一個(gè)ACK+SYN(可以+請(qǐng)確認(rèn))。而真實(shí)的IP會(huì)認(rèn)為,我沒有發(fā)送請(qǐng)求,不作回應(yīng)。服務(wù)器沒有收到回應(yīng),會(huì)重試3-5次并且等待一個(gè)SYN Time(一般30秒-2分鐘)后,丟棄這個(gè)連接。
如果攻擊者大量發(fā)送這種偽造源地址的SYN請(qǐng)求,服務(wù)器端將會(huì)消耗非常多的資源來(lái)處理這種半連接,保存遍歷會(huì)消耗非常多的CPU時(shí)間和內(nèi)存,何況還要不斷對(duì)這個(gè)列表中的IP進(jìn)行SYN+ACK的重試。最后的結(jié)果是服務(wù)器無(wú)暇理睬正常的連接請(qǐng)求—拒絕服務(wù)。在服務(wù)器上用netstat –an命令查看SYN_RECV狀態(tài)的話,就可以看到:
如果我們抓包來(lái)看:
可以看到大量的SYN包沒有ACK回應(yīng)。
SYN Flood攻擊防護(hù)
目前市面上有些防火墻具有SYN Proxy功能,這種方法一般是定每秒通過指定對(duì)象(目標(biāo)地址和端口、僅目標(biāo)地址或僅源地址)的SYN片段數(shù)的閥值,當(dāng)來(lái)自相同源地址或發(fā)往相同目標(biāo)地址的SYN片段數(shù)達(dá)到這些閥值之一時(shí),防火墻就開始截取連接請(qǐng)求和代理回復(fù)SYN/ACK片段,并將不完全的連接請(qǐng)求存儲(chǔ)到連接隊(duì)列中直到連接完成或請(qǐng)求超時(shí)。當(dāng)防火墻中代理連接的隊(duì)列被填滿時(shí),防火墻拒絕來(lái)自相同安全區(qū)域(zone)中所有地址的新SYN片段,避免網(wǎng)絡(luò)主機(jī)遭受不完整的三次握手的攻擊。但是,這種方法在攻擊流量較大的時(shí)候,連接出現(xiàn)較大的延遲,網(wǎng)絡(luò)的負(fù)載較高,很多情況下反而成為整個(gè)網(wǎng)絡(luò)的瓶頸;
Random Drop:隨機(jī)丟包的方式雖然可以減輕服務(wù)器的負(fù)載,但是正常連接的成功率也會(huì)降低很多;?
特征匹配:IPS上會(huì)常用的手段,在攻擊發(fā)生的當(dāng)時(shí)統(tǒng)計(jì)攻擊報(bào)文的特征,定義特征庫(kù),例如過濾不帶TCP Options 的syn 包等;
早期攻擊工具(例如synkiller,xdos,hgod等)通常是發(fā)送64字節(jié)的TCP SYN報(bào)文,而主機(jī)操作系統(tǒng)在發(fā)起TCP連接請(qǐng)求時(shí)發(fā)送SYN 報(bào)文是大于64字節(jié)的。因此可以在關(guān)鍵節(jié)點(diǎn)上設(shè)置策略過濾64字節(jié)的TCP SYN報(bào)文,某些宣傳具有防護(hù)SYN Flood攻擊的產(chǎn)品就是這么做的。隨著工具的改進(jìn),發(fā)出的TCP SYN 報(bào)文完全模擬常見的通用操作系統(tǒng),并且IP頭和TCP頭的字段完全隨機(jī),這時(shí)就無(wú)法在設(shè)備上根據(jù)特定的規(guī)則來(lái)過濾攻擊報(bào)文。這時(shí)就需要根據(jù)經(jīng)驗(yàn)判斷IP 包頭里TTL值不合理的數(shù)據(jù)包并阻斷,但這種手工的方法成本高、效率低。 圖是某攻擊工具屬性設(shè)置。
SYN cookie:就是給每一個(gè)請(qǐng)求連接的IP地址分配一個(gè)Cookie,如果短時(shí)間內(nèi)連續(xù)受到某個(gè)IP的重復(fù)SYN報(bào)文,就認(rèn)定是受到了攻擊,以后從這個(gè)IP地址來(lái)的包會(huì)被丟棄。但SYN Cookie依賴于對(duì)方使用真實(shí)的IP地址,如果攻擊者利用SOCK_RAW隨機(jī)改寫IP報(bào)文中的源地址,這個(gè)方法就沒效果了。
商業(yè)產(chǎn)品的防護(hù)算法
syn cookie/syn proxy類防護(hù)算法:這種算法對(duì)所有的syn包均主動(dòng)回應(yīng),探測(cè)發(fā)起syn包的源IP地址是否真實(shí)存在;如果該IP地址真實(shí)存在,則該IP會(huì)回應(yīng)防護(hù)設(shè)備的探測(cè)包,從而建立TCP連接;大多數(shù)的國(guó)內(nèi)外抗拒絕服務(wù)產(chǎn)品采用此類算法。
safereset算法:此算法對(duì)所有的syn包均主動(dòng)回應(yīng),探測(cè)包特意構(gòu)造錯(cuò)誤的字段,真實(shí)存在的IP地址會(huì)發(fā)送rst包給防護(hù)設(shè)備,然后發(fā)起第2次連接,從而建立TCP連接;部分國(guó)外產(chǎn)品采用了這樣的防護(hù)算法。?
syn重傳算法:該算法利用了TCP/IP協(xié)議的重傳特性,來(lái)自某個(gè)源IP的第一個(gè)syn包到達(dá)時(shí)被直接丟棄并記錄狀態(tài),在該源IP的第2個(gè)syn包到達(dá)時(shí)進(jìn)行驗(yàn)證,然后放行。
綜合防護(hù)算法:結(jié)合了以上算法的優(yōu)點(diǎn),并引入了IP信譽(yù)機(jī)制。當(dāng)來(lái)自某個(gè)源IP的第一個(gè)syn包到達(dá)時(shí),如果該IP的信譽(yù)值較高,則采用syncookie算法;而對(duì)于信譽(yù)值較低的源IP,則基于協(xié)議棧行為模式,如果syn包得到驗(yàn)證,則對(duì)該連接進(jìn)入syncookie校驗(yàn),一旦該IP的連接得到驗(yàn)證則提高其信譽(yù)值。有些設(shè)備還采用了表結(jié)構(gòu)來(lái)存放協(xié)議棧行為模式特征值,大大減少了存儲(chǔ)量。
金盾防火墻在默認(rèn)的設(shè)置下就能很有效的防御此類攻擊,見下圖:
金盾防火墻的“防護(hù)參數(shù)”面板,其中的“SYN保護(hù)觸發(fā)”,“SYN緊急觸發(fā)”,“SYN單機(jī)屏蔽”這個(gè)3設(shè)置項(xiàng)就是專門針對(duì)此類攻擊的防御設(shè)置,“SYN保護(hù)觸發(fā)”是當(dāng)SYN包的數(shù)量達(dá)到設(shè)置的數(shù)值以上就自動(dòng)開啟SYN保護(hù),而“SYN緊急觸發(fā)”是當(dāng)SYN包的數(shù)量達(dá)到緊急觸發(fā)所設(shè)置的值時(shí)采用緊急保護(hù)模式,最大限度防御SYN攻擊;“SYN單機(jī)屏蔽”是當(dāng)一個(gè)IP發(fā)送到我們服務(wù)器上的SYN包達(dá)到指定數(shù)值的情況下就對(duì)這個(gè)IP進(jìn)行屏蔽,默認(rèn)配置下就能很好的防御SYN Flood類型的攻擊了。