說起安全,不得不說一下當前最為流行的一種 DDOS 的攻擊方式,從目前看來,這種攻擊仍然是危害性相當大,並且沒有辦法徹底防範的一種攻擊方式。而且,凡是基於 TCP 的高層應用,都有可能受到這種致命的攻擊。 在“可靠的”傳輸層,在這裡打上引號,是因為傳輸層並不是真正的可靠的,而只是相對的。為什麼這麼說呢,因為在 2 端的通訊中,如果由於通訊鏈路的故障,或者是某一端的故障,造成了通訊的異常,那麼另一端是不能主動地瞭解到的。打個比方說,這就好比是我匯錢給張三,用的是中國郵政的普通匯款,由於種種的原因,他們把錢在路上搞丟了,但是這個時候我並不知道錢丟了,我還在一直等張三給我打電話,告訴我錢是否到了,如果 2 個月之後,張三還是沒有來電話,說錢已經收到了,按照常理來說,一個半月之前就應該收到了,那沒辦法,我只得再給張三匯錢,如果這次又搞丟了,我還得再匯,直到張三打電話告訴我,錢已經到了,那麼可能對於張三來說,這個傳輸是可靠的,因為不管丟了多少次,終究他是收到了他想要的東西,但是對於我來說,我不能把丟的錢找回來,也不能自己去監視中國郵政到底是把我的錢搞丟了,還是被他們塞進自己的腰包了,我所知道的僅僅是“張三沒有收到錢”,我需要再給他寄一次。 由此可以看出,TCP 的傳輸並不是可靠的,它存在一個等待和重傳的機制,一旦資料在網路上發生丟失,它會依賴於 ACK / SYN 這些東西來進行一個重傳,而且,TCP 處理常式中存在一個計時器,如果計時器發生逾時,那麼它就認為資料已經丟了(當然不會像上邊的例子中說的是 2 個月),再去重傳,那麼既然要去重傳,就要保證將來一旦發生逾時,TCP 處理常式還能把丟失的東西找回來,那麼,TCP 處理常式在收到串連請求的時候,就會要在記憶體中開闢一片地區來,儲存 SYN 以及資料著一系列的東西。 好,現在瞭解到了 TCP 的可靠與不可靠的方面,現在來說一下 TCP 的 3 次握手,這個在以前的文章中已經寫過了,在這裡就不再多說了,在正常情況下,3 次握手的步驟如下: ISN A -------------------> B SYN/ACK A <------------------- B ACK A -------------------> B 在 A 向 B 發出 TCP 請求的時候,它發出一個隨機的 ISN (Initial Sequence Number),B 收到後給 A 回複一個 ACK = ISN + 1,同時再回複一個自己的 SYN 號,接著會儲存 A 發來的這些資訊,同時再記憶體中開闢緩衝區進行儲存,然後 A 再給 B 回複一個 ACK。經曆過這三次之後,一個端到端的 TCP 串連已經建立起來了,這是正常的情況。但是,考慮這種情況,如果在 A 向 B 發出請求,B 給 A 回複並且開闢了資源之後,A 不再進行第三次的回複,會怎麼辦?這就好比說,張三收到錢了,也不給我打電話,我一等 2 個月,按照常理的話張三早該收到錢了,但是他還沒來電話,沒辦法,我只有再去匯錢了,那麼如果每一次都這樣,我這裡的錢是不是很快就匯完了?TCP 中也是這樣,如果 A 一直在向B 發起 TCP 請求,B 也按照正常情況進行響應了,但是 A 不進行第三次的握手,造成半串連,那麼 B 分配出去的記憶體資源就一直這麼耗著,直到資源耗盡。 對於這種攻擊,似乎是沒有辦法防範的,因為 TCP 的三向交握是協議規定死的,所有使用 TCP 協議的軟體都必須遵循其規定,否則無法通訊。但是,有一種辦法,似乎可以防範,那就是限制通訊源的 TCP 並發串連數,例如:如果 A 在 1 秒鐘之內連續產生 100 個 TCP 半串連,那麼 B 就丟棄 A 所有的 TCP 資訊,並且在一定時間內不再響應攻擊者的釋放記憶體資源。這看起來似乎似乎一種行之有效辦法,可是實際並非這麼簡單,因為在第三層的 IP 協議是一個不可靠的協議,它的源地址可以被偽造,如果一個攻擊者製造大量的偽造源地址來對受害者進行攻擊,而每一個 IP 位址的 TCP 半串連只建立 3~5 次,這個時候如何防範? 基於此,一種新型的防禦方式產生了—— TCP Cookie,TCP Cookie 技術針對 TCP 協議的軟肋,做出了一些改進。仍以上面的通訊過程為例,在 A 向 B 發出一個 TCP 請求之後,B 並不立即為 A 的 TCP 請求分配資源,而是利用 A 發來的串連資訊計算出一個 Cookie 值——取 Client 端的 IP、連接埠,以及 Server 端的 IP、連接埠,再進行一種散列演算法,得到一個 Cookie,取該 Cookie 的前 24 位作為 SYN 值對對方進行回複。當對方對這個 SYN/ACK 再次進行 ACK (ACK=SYN+1)回複的時候,利用某種演算法和這個 ACK 來反向推算回原來的 Cookie,如果在一定範圍內符合,即認為是合法的 TCP 請求,對它進行響應,如果不符合,則認為其是非法的 TCP 請求,丟棄。為什麼說是一定範圍內呢,因為 Cookie 的變化和時間有關,那麼在 TCP 逾時之內的所有的 ACK 都應該是合法的,那麼在反向推算回去的時候,只要得到的 Cookie 和原來的 Cookie 在一個合法的時間段內相符,就認為是合法的。 這種 TCP Cookie 技術並不是無懈可擊的,首先,如果攻擊者大量地偽造 IP 位址進行半串連攻擊,受害者會忙於計算原來的 Cookie 值而造成資源耗盡,另外,由於並發串連數太多,會造成受害者的頻寬耗盡,同樣也會造成拒絕服務的攻擊(D.o.S 可不管是耗盡資源還是耗盡頻寬,它只要讓受害者的服務不能正常提供即可),頻寬總是有限的,所以不管怎麼防範,只要 D.o.S 攻擊威力足夠大,任何的防範方法都不能奏效。所以想要防範 D.o.S,還是厚道些做人,不要惹火駭客,否則在遭到攻擊的時候,除了拔網線,恐怕再沒有別的辦法了:-)
|