什么是CC攻擊?CC攻擊是DDoS攻擊的一種類型,使用代理服務器向受害服務器發(fā)送大量貌似合法的請求(通常使用HTTP GET)。
CC(Challenge Collapsar,挑戰(zhàn)黑洞)根據(jù)其工具命名,攻擊者創(chuàng)造性地使用代理機制,利用眾多廣泛可用的免費代理服務器(即肉雞)發(fā)動DDoS攻擊。許多免費代理服務器支持匿名模式,這使追蹤變得非常困難。
雖然用limit_req_module可以在一定程度上的防御CC攻擊,但是有誤殺概率;國內(nèi)寬帶用戶的IP地址已經(jīng)大量內(nèi)網(wǎng)化,幾百人共享一個IP的可能性是很大的。
做基于IP的頻率限制,誤殺的概率確實非常大。在國內(nèi),一個小區(qū)、一個公司經(jīng)常會遇到共用IP的情況,而移動網(wǎng)絡共用基站的設備更是容易出現(xiàn)相同的公網(wǎng)IP。
墨菲定律第一條就是:任何事物都沒有表面看起來那么簡單。何況這個看起來一點都不簡單,怎么可能只用IP頻率限制這一種手段呢?
對于CC攻擊,其防御必須聯(lián)合采取多種手段,而這些手段本質(zhì)上也是在提高服務器的并發(fā)能力。
1、服務器垂直擴展和水平擴容
資金允許的情況下,這是最簡單的一種方法,本質(zhì)上講,這個方法并不是針對CC攻擊的,而是提升服務本身處理并發(fā)的能力,但確實提升了對CC攻擊的承載能力。
•垂直擴展:
是指增加每臺服務器的硬件能力,如升級CPU,增加內(nèi)存,升級SSD固態(tài)硬盤等。
•水平擴容:
是指通過增加提供服務的服務器來提升承載力。
上述擴展和擴容可以在服務的各個層級進行,包括:應用服務器、數(shù)據(jù)庫服務器、緩存服務器等等。
2、數(shù)據(jù)緩存(內(nèi)存級別,不要用文件)
對于服務中具備高度共性,多用戶可重用,或單用戶多次可重用的數(shù)據(jù),一旦從數(shù)據(jù)庫中檢索出,或通過計算得出后,最好將其放在緩存中。
后續(xù)請求均可直接從緩存中取得數(shù)據(jù),減輕數(shù)據(jù)庫的檢索壓力和應用服務器的計算壓力,并且能夠快速返回結(jié)果并釋放進程,從而也能緩解服務器的內(nèi)存壓力。
需要注意的是,緩存不要使用文件形式,可以使用redis、memcached等基于內(nèi)存的no sql緩存服務,并且與應用服務器分離,單獨部署在局域網(wǎng)內(nèi)。
局域網(wǎng)內(nèi)的網(wǎng)絡IO肯定比起磁盤IO要高。當然,為了不使局域網(wǎng)帶寬成為瓶頸,千兆網(wǎng)絡也是有必要的。
3、 頁面靜態(tài)化
與數(shù)據(jù)緩存一樣,頁面數(shù)據(jù)本質(zhì)上也屬于數(shù)據(jù),常見的手段是生成靜態(tài)化的html頁面文件,利用客戶端瀏覽器的緩存功能或者服務端的緩存服務,以及CDN節(jié)點的緩沖服務,均可以降低服務器端的數(shù)據(jù)檢索和計算壓力,快速相應結(jié)果并釋放連接進程。
4、用戶級別的調(diào)用頻率限制
不管服務是有登陸態(tài)還是沒登陸態(tài),基于session等方式都可以為客戶端分配唯一的識別ID(后稱作SID),服務端可以將SID存到緩存中。
客戶端請求服務時,如果沒有帶SID(cookie中或請求參數(shù)中等),則由服務端快速分配一個并返回。
可以的話,本次請求可以不返回數(shù)據(jù),或者將分配SID獨立出業(yè)務服務。當客戶端請求時帶了合法SID(即SID能在服務端緩存中匹配到),便可以依據(jù)SID對客戶端進行頻率限制。而對于SID非法的請求,則直接拒絕服務。
相比根據(jù)IP進行的頻率限制,根據(jù)SID的頻率限制更加精準可控,最大程度的避免誤殺的情況。
5、IP限制
最后,IP限制依然可以結(jié)合上述規(guī)則一起使用,但是可以將其前置到外層的防火墻或負載均衡器上去做。
并且可以調(diào)大限制的閾值(結(jié)合歷史統(tǒng)計數(shù)量,預測一個極端的訪問量閾值,在服務器可承受的范圍內(nèi),盡量避免誤傷),防止惡意訪問穿透到應用服務器上,造成應用服務器壓力。