如何提高防護CC攻擊的能力

今天先是看到一篇討論CC攻擊的文章:Nginx防CC攻擊,緊接着就有同窗在羣裏問我關於防CC攻擊的問題,巧嗎?好巧!php

什麼是CC攻擊?html

CC攻擊是DDoS攻擊的一種類型,使用代理服務器向受害服務器發送大量貌似合法的請求(一般使用HTTP GET)。CC(Challenge Collapsar,挑戰黑洞)根據其工具命名,攻擊者創造性地使用代理機制,利用衆多普遍可用的免費代理服務器發動DDoS攻擊。許多免費代理服務器支持匿名模式,這使追蹤變得很是困難。redis

原本看了上面那篇文章,以爲雖然寫的很用心,還作了樣本壓測,但僅僅作基於IP的頻率限制,從原理上來說並不實用,爲何呢?其實,做者本身在文末也提到了。sql

雖然用limit_req_module能夠在必定程度上的防止CC攻擊,可是有誤殺機率;國內寬帶用戶的IP地址已經大量內網化,幾百人共享一個IP的可能性是很大的。數據庫

作基於IP的頻率限制,誤殺的機率確實很是大。在國內,一個小區、一個公司常常會遇到共用IP的狀況,而移動網絡共用基站的設備更是容易出現相同的公網IP。瀏覽器

墨菲定律第一條就是:任何事物都沒有表面看起來那麼簡單。況且這個看起來一點都不簡單,怎麼可能只用IP頻率限制這一種手段呢?對於CC攻擊,其防護必須採用多種方法,而這些方法本質上也是在提升服務器的併發能力。緩存

1. 服務器垂直擴展和水平擴容

資金容許的狀況下,這是最簡單的一種方法,本質上講,這個方法並非針對CC攻擊的,而是提高服務自己處理併發的能力,但確實提高了對CC攻擊的承載能力。服務器

  • 垂直擴展:是指增長每臺服務器的硬件能力,如升級CPU,增長內存,升級SSD固態硬盤等。微信

  • 水平擴容:是指經過增長提供服務的服務器來提高承載力。cookie

上述擴展和擴容能夠在服務的各個層級進行,包括:應用服務器、數據庫服務器、緩存服務器等等。

2. 數據緩存(內存級別,不要用文件)

對於服務中具有高度共性,多用戶可重用,或單用戶屢次可重用的數據,一旦從數據庫中檢索出,或經過計算得出後,最好將其放在緩存中,後續請求都可直接從緩存中取得數據,減輕數據庫的檢索壓力和應用服務器的計算壓力,而且可以快速返回結果並釋放進程,從而也能緩解服務器的內存壓力。

須要注意的是,緩存不要使用文件形式,可使用redis、memcached等基於內存的no sql緩存服務,而且與應用服務器分離,單獨部署在局域網內。局域網內的網絡IO確定比起磁盤IO要高。固然,爲了避免使局域網帶寬成爲瓶頸,千兆網絡也是有必要的。

3. 頁面靜態化

與數據緩存同樣,頁面數據本質上也屬於數據,常見的手段是生成靜態化的html頁面文件,利用客戶端瀏覽器的緩存功能或者服務端的緩存服務,以及CDN節點的緩衝服務,都可以下降服務器端的數據檢索和計算壓力,快速相應結果並釋放鏈接進程。

4. 用戶級別的調用頻率限制

無論服務是有登錄態仍是沒登錄態,基於session等方式均可覺得客戶端分配惟一的識別ID(後稱做SID),服務端能夠將SID存到緩存中。當客戶端請求服務時,若是沒有帶SID(cookie中或請求參數中等),則由服務端快速分配一個並返回。能夠的話,本次請求能夠不返回數據,或者將分配SID獨立出業務服務。當客戶端請求時帶了合法SID(即SID能在服務端緩存中匹配到),即可以依據SID對客戶端進行頻率限制。而對於SID非法的請求,則直接拒絕服務。

相比根據IP進行的頻率限制,根據SID的頻率限制更加精準可控,最大程度的避免誤殺的狀況。

5. IP限制

最後,IP限制依然能夠結合上述規則一塊兒使用,可是能夠將其前置到外層的防火牆或負載均衡器上去作,而且能夠調大限制的閾值(結合歷史統計數量,預測一個極端的訪問量閾值,在服務器可承受的範圍內,儘可能避免誤傷),防止惡意訪問穿透到應用服務器上,形成應用服務器壓力。

掃描下方二維碼或者微信搜索[phpjiagoushier],關注個人微信公衆號[PHP架構],參與互動交流。

phpjiagoushier

相關文章
相關標籤/搜索