什麼是CC攻擊?CC攻擊是DDoS攻擊的一種型別,使用代理伺服器向受害伺服器傳送大量貌似合法的請求(通常使用HTTP GET)。
CC(Challenge Collapsar,挑戰黑洞)根據其工具命名,攻擊者創造性地使用代理機制,利用眾多廣泛可用的免費代理伺服器(即肉雞)發動DDoS攻擊。許多免費代理伺服器支援匿名模式,這使追蹤變得非常困難。
雖然用limit_req_module可以在一定程度上的防禦CC攻擊,但是有誤殺機率;國內寬頻使用者的IP地址已經大量內網化,幾百人共享一個IP的可能性是很大的。
做基於IP的頻率限制,誤殺的機率確實非常大。在國內,一個小區、一個公司經常會遇到共用IP的情況,而行動網路共用基站的裝置更是容易出現相同的公網IP。
墨菲定律第一條就是:任何事物都沒有表面看起來那麼簡單。何況這個看起來一點都不簡單,怎麼可能只用IP頻率限制這一種手段呢?
對於CC攻擊,其防禦必須聯合採取多種手段,而這些手段本質上也是在提高伺服器的併發能力。
1、伺服器垂直擴充套件和水平擴容
資金允許的情況下,這是最簡單的一種方法,本質上講,這個方法並不是針對CC攻擊的,而是提升服務本身處理併發的能力,但確實提升了對CC攻擊的承載能力。
•垂直擴充套件:
是指增加每臺伺服器的硬體能力,如升級CPU,增加記憶體,升級SSD固態硬碟等。
•水平擴容:
是指透過增加提供服務的伺服器來提升承載力。
上述擴充套件和擴容可以在服務的各個層級進行,包括:應用伺服器、資料庫伺服器、快取伺服器等等。
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限制依然可以結合上述規則一起使用,但是可以將其前置到外層的防火牆或負載均衡器上去做。
並且可以調大限制的閾值(結合歷史統計數量,預測一個極端的訪問量閾值,在伺服器可承受的範圍內,儘量避免誤傷),防止惡意訪問穿透到應用伺服器上,造成應用伺服器壓力。
涇溪石險人兢慎,終歲不聞傾覆人。卻是平流無石處,時時聞說有沈淪。——杜荀鶴《涇溪》
什麼是CC攻擊?CC攻擊是DDoS攻擊的一種型別,使用代理伺服器向受害伺服器傳送大量貌似合法的請求(通常使用HTTP GET)。
CC(Challenge Collapsar,挑戰黑洞)根據其工具命名,攻擊者創造性地使用代理機制,利用眾多廣泛可用的免費代理伺服器(即肉雞)發動DDoS攻擊。許多免費代理伺服器支援匿名模式,這使追蹤變得非常困難。
雖然用limit_req_module可以在一定程度上的防禦CC攻擊,但是有誤殺機率;國內寬頻使用者的IP地址已經大量內網化,幾百人共享一個IP的可能性是很大的。
做基於IP的頻率限制,誤殺的機率確實非常大。在國內,一個小區、一個公司經常會遇到共用IP的情況,而行動網路共用基站的裝置更是容易出現相同的公網IP。
墨菲定律第一條就是:任何事物都沒有表面看起來那麼簡單。何況這個看起來一點都不簡單,怎麼可能只用IP頻率限制這一種手段呢?
對於CC攻擊,其防禦必須聯合採取多種手段,而這些手段本質上也是在提高伺服器的併發能力。
1、伺服器垂直擴充套件和水平擴容
資金允許的情況下,這是最簡單的一種方法,本質上講,這個方法並不是針對CC攻擊的,而是提升服務本身處理併發的能力,但確實提升了對CC攻擊的承載能力。
•垂直擴充套件:
是指增加每臺伺服器的硬體能力,如升級CPU,增加記憶體,升級SSD固態硬碟等。
•水平擴容:
是指透過增加提供服務的伺服器來提升承載力。
上述擴充套件和擴容可以在服務的各個層級進行,包括:應用伺服器、資料庫伺服器、快取伺服器等等。
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限制依然可以結合上述規則一起使用,但是可以將其前置到外層的防火牆或負載均衡器上去做。
並且可以調大限制的閾值(結合歷史統計數量,預測一個極端的訪問量閾值,在伺服器可承受的範圍內,儘量避免誤傷),防止惡意訪問穿透到應用伺服器上,造成應用伺服器壓力。
涇溪石險人兢慎,終歲不聞傾覆人。卻是平流無石處,時時聞說有沈淪。——杜荀鶴《涇溪》