DDoS防護(hù)的TCP協(xié)議防護(hù)和防御原理是怎樣的呢?

? ? ? TCP協(xié)議,我相信每個(gè)開發(fā)工程師都不陌生的。由于協(xié)議具有面向連接、可靠的特點(diǎn),因此在Internet上得到了廣泛的應(yīng)用。常見的Web、SSH、FTP等都是基于TCP協(xié)議的。目前,TCP協(xié)議占整個(gè)網(wǎng)絡(luò)流量的80%,因此這已成為黑客攻擊的主要類別。

? ? ? ?以下是使用wireshark在本地瀏覽器訪問www.163.com時(shí)抓包的結(jié)果:

? ? ? ?我們將忽略中間的數(shù)據(jù)傳輸過程,而專注于頂部和底部的連接,它們建立了我斷開的連接。TCP連接的建立:主要目的是通知對(duì)方自己的初始序列號(hào),這個(gè)序列號(hào)是用于IP數(shù)據(jù)包在網(wǎng)絡(luò)中按順序到達(dá),便于TCP對(duì)IP數(shù)據(jù)包重新排序。

客戶端的第一個(gè)報(bào)文如下:

? ? ? ? TCP中的syn標(biāo)志位置為1,序號(hào)為 612417286(記為i)。

? ? ? ? 服務(wù)端接收到報(bào)文后,對(duì)該報(bào)文進(jìn)行確認(rèn),并發(fā)送自己的sequence number給客戶端,故為SYN_ACK包,在tcp中syn,ack標(biāo)志位同時(shí)被置為1,服務(wù)端確認(rèn)客戶端的報(bào)文,Acknowledgement number(確認(rèn)號(hào))為612417287(i+1),并帶上自己的sequence number 為 522111292(記為j)。

? ? ? ?客戶端收到后會(huì)對(duì)發(fā)送確認(rèn)報(bào)文,對(duì)服務(wù)端報(bào)文進(jìn)行確認(rèn),如下

? ? ? ?TCP的ack標(biāo)志位被置為1,確認(rèn)號(hào)為522111293(j+1)。這樣經(jīng)過這3個(gè)報(bào)文,客戶端和服務(wù)端都獲取到了對(duì)方的初始sequence number,連接就建立了。

? ? ? ?TCP連接斷開:TCP是一個(gè)全雙工的數(shù)量傳輸協(xié)議,所以TCP連接的斷開實(shí)際上是2個(gè)方向上的傳輸關(guān)閉過程。接下來(lái)看看報(bào)文的交互過程,本例為服務(wù)端發(fā)起的關(guān)閉:

? ? ? ?首先服務(wù)端發(fā)送一個(gè)FIN報(bào)文。通知客戶端,服務(wù)端不在有數(shù)據(jù)發(fā)送給客戶端。

? ? ? ?這里我們可以忽略ack和Acknowledgement number,這個(gè)為對(duì)前一次客戶端報(bào)文的確認(rèn)。我們可以看到TCP中的FIN標(biāo)志位置為1,sequence number 為522230043(記為k)??蛻舳耸盏絝in報(bào)文后,回復(fù)一個(gè)ack包確認(rèn)。這樣從服務(wù)端到客戶端這個(gè)方向上的數(shù)據(jù)傳輸通道就被關(guān)閉,即服務(wù)端應(yīng)用不可以在通過這條連接發(fā)送數(shù)據(jù)給客戶端。接下來(lái)就是關(guān)閉客戶端到服務(wù)端的傳輸通道,客戶端首先發(fā)送fin包服務(wù)端收到后發(fā)送確認(rèn)報(bào)文給客戶端。這樣一來(lái)從客戶端到服務(wù)端的傳輸通道也關(guān)閉了,那么此時(shí)兩個(gè)方向上的傳輸通道都關(guān)閉了,TCP的通信雙方就都斷開了連接。

? ? ? ? 從上述的連接建立和斷開方式我們會(huì)發(fā)現(xiàn)TCP連接的建立和斷開涉及多個(gè)報(bào)文,多個(gè)狀態(tài)之間的轉(zhuǎn)換。那么從攻擊者角度看上述過程,我們?cè)撛趺蠢媒换ミ^程進(jìn)行DDOS攻擊呢?

TCP攻擊可以簡(jiǎn)單的分為以下三類:

(1)FLOOD類攻擊,例如發(fā)送海量的syn、syn_ack、ack、fin等報(bào)文,占用服務(wù)器資源,使之無(wú)法提供服務(wù)。

(2)連接耗盡類攻擊,如與被攻擊方完成三次握手后不再發(fā)送報(bào)文一直維持連接,或者立刻發(fā)送FIN或RST報(bào)文,斷開連接后再次快速發(fā)起新的連接等,消耗TCP連接資源。

? ? ? ? ?還有一類則比較巧妙,是在我們上述沒有做分析的數(shù)據(jù)傳輸過程中的利用TCP本身的流控,可靠性保證等機(jī)制來(lái)達(dá)到攻擊的目的,即:

(3)利用協(xié)議特性攻擊:例如攻擊這建好連接之后,基于TCP的流控特性,立馬就把TCP窗口值設(shè)為0,然后斷開連接,則服務(wù)器就要等待Windows開放,造成資源不可用?;蛘甙l(fā)送異常報(bào)文,可能造成被攻擊目標(biāo)奔潰。

? ? ? ? 那么上述三種類型的攻擊具體的實(shí)時(shí)和防御原理是怎樣的呢?

? ? ? ? FLOOD類攻擊與防御。

? ? ? ?Flood類攻擊中最常見,危害最大的是syn_flood攻擊,也是歷史最悠久的攻擊之一。因此我們先來(lái)看看syn_flood攻擊。

? ? ? ?syn_flood攻擊: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)非常困難。

? ? ? ?從上文我們可以知道客戶端發(fā)起連接的報(bào)文即為syn報(bào)文。當(dāng)攻擊者發(fā)送大量的偽造IP端口的syn報(bào)文時(shí),服務(wù)端接收到syn報(bào)文后,新建一共表項(xiàng)插入到半連接隊(duì)列,并發(fā)送syn_ack。但由于這些syn報(bào)文都是偽造的,發(fā)出去的syn_ack報(bào)文將沒有回應(yīng)。TCP是可靠協(xié)議,這時(shí)就會(huì)重傳報(bào)文,默認(rèn)重試次數(shù)為5次,重試的間隔時(shí)間從1s開始每次都番倍,分別為1s + 2s + 4s + 8s +16s = 31s,第5次發(fā)出后還要等32s才知道第5次也超時(shí)了,所以一共是31 + 32 = 63s。

? ? ? ? ?也就是說(shuō)一共假的syn報(bào)文,會(huì)占用TCP準(zhǔn)備隊(duì)列63s之久,而半連接隊(duì)列默認(rèn)為1024,系統(tǒng)默認(rèn)不同,可 cat /proc/sys/net/ipv4/tcp_max_syn_backlog c 查看。也就是說(shuō)在沒有任何防護(hù)的情況下,每秒發(fā)送200個(gè)偽造syn包,就足夠撐爆半連接隊(duì)列,從而使真正的連接無(wú)法建立,無(wú)法響應(yīng)正常請(qǐng)求。

? ? ? ? ? 而一臺(tái)普通的每秒就可以輕松偽造100w個(gè)syn包。因此即使把隊(duì)列大小調(diào)大最大也無(wú)濟(jì)于事。那么應(yīng)該如何區(qū)防護(hù)呢?

? ? ? ? ?Syn_flood防御:通常針對(duì)syn_flood 有2種比較通用的防護(hù)機(jī)制

(1)cookie源認(rèn)證:

? ? ? ?原理是syn報(bào)文首先由DDOS防護(hù)系統(tǒng)來(lái)響應(yīng)syn_ack。帶上特定的sequence number (記為cookie)。真實(shí)的客戶端會(huì)返回一個(gè)ack 并且Acknowledgment number 為cookie+1。 而偽造的客戶端,將不會(huì)作出響應(yīng)。這樣我們就可以知道那些IP對(duì)應(yīng)的客戶端是真實(shí)的,將真實(shí)客戶端IP加入白名單。下次訪問直接通過,而其他偽造的syn報(bào)文就被攔截。

(2)reset認(rèn)證:

? ? ? ?Reset認(rèn)證利用的是TCP協(xié)議的可靠性,也是首先由DDOS防護(hù)系統(tǒng)來(lái)響應(yīng)syn。防護(hù)設(shè)備收到syn后響應(yīng)syn_ack,將Acknowledgement number (確認(rèn)號(hào))設(shè)為特定值(記為cookie)。當(dāng)真實(shí)客戶端收到這個(gè)報(bào)文時(shí),發(fā)現(xiàn)確認(rèn)號(hào)不正確,將發(fā)送reset報(bào)文,并且sequence number 為cookie + 1。

? ? ? ?而假消息來(lái)源,則不會(huì)有任何回應(yīng)。這允許我們白名單的真正的客戶端IP。

? ? ? ?在實(shí)際應(yīng)用中,它通常與丟包和源認(rèn)證相結(jié)合使用。第一個(gè)丟包的原理是:DDOS保護(hù)裝置接收到syn報(bào)文后,記錄5個(gè)元組,然后丟棄。正常用戶將重新發(fā)送syn消息,保護(hù)設(shè)備在消息到達(dá)5元組并在指定時(shí)間內(nèi)轉(zhuǎn)發(fā)該消息。當(dāng)重新傳輸?shù)膕yn消息達(dá)到某個(gè)閾值時(shí),就啟用了上述源身份驗(yàn)證。這減少了反射的syn_ack包的數(shù)量,并在不影響保護(hù)的情況下減少了網(wǎng)絡(luò)擁塞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容