前言
CC攻擊是目前互聯(lián)網上最常見的攻擊方式,具有成本低,效果好的優(yōu)點,往往幾百塊錢就可以攻擊你一周,讓你網站痛不欲生。
本教程只防CC攻擊,不能防DDOS,防DDOS請購買百度云加速或高防IP解決。
實測:1核1G內存撐住700多代理IP持續(xù)攻擊,屹立不倒,且CPU在45%左右徘徊。
本教程借助根據CPU/內存大小 優(yōu)化LNMP環(huán)境配置,且使用了類似cfCDN的防CC攻擊特點并做了一些優(yōu)化
什么是CC攻擊
攻擊者借助代理服務器生成指向受害主機的合法請求,實現(xiàn)DDOS和偽裝就叫:CC(ChallengeCollapsar)。 CC主要是用來攻擊頁面的。大家都有這樣的經歷,就是在訪問論壇時,如果這個論壇比較大,訪問的人比較多,打開頁面的速度會比較慢,訪問的人越多,論壇的頁面越多,數據庫壓力就越大,被訪問的頻率也越高,占用的系統(tǒng)資源也就相當可觀。 一個靜態(tài)頁面不需要服務器多少資源,甚至可以說直接從內存中讀出來發(fā)給你就可以了,但是論壇就不一樣了,我看一個帖子,系統(tǒng)需要到數據庫中判斷我是否有讀帖子的權限,如果有,就讀出帖子里面的內容,顯示出來——這里至少訪問了2次數據庫,如果數據庫的數據容量有200MB大小,系統(tǒng)很可能就要在這200MB大小的數據空間搜索一遍,這需要多少的CPU資源和時間?如果我是查找一個關鍵字,那么時間更加可觀,因為前面的搜索可以限定在一個很小的范圍內,比如用戶權限只查用戶表,帖子內容只查帖子表,而且查到就可以馬上停止查詢,而搜索肯定會對所有的數據進行一次判斷,消耗的時間是相當的大。 CC就是充分利用了這個特點,模擬多個用戶(多少線程就是多少用戶)不停的進行訪問(訪問那些需要大量數據操作,就是需要大量CPU時間的頁面).這一點用一個一般的性能測試軟件就可以做到大量模擬用戶并發(fā)。
你是否受到了CC攻擊
1.網站訪問緩慢,報503錯誤(nginx拒絕連接),502錯誤(php掛逼)
2.服務器CPU 100%;
基本上確診被C了。
LNMP環(huán)境優(yōu)化
1.nginx優(yōu)化:nginx沒有過多的優(yōu)化,一般nginx都死被php拖死的。簡稱:扶不起來
2.寶塔中nginx的防火墻試效果并不理想,主機吧用過幾次,都是幫客戶設置的,完全沒用,而且有誤殺幾率視乎有點高。
3.php優(yōu)化:服務器掛壁基本都是php進程太多導致的了。nginx是個傳菜的,php就是真正花時間吃飯的。
4.如圖:簡單理解,最少15個人在廠里,最多50個人同時干活,如果有35個人以上沒干活就開除掉。
5.根據CPU核數設定起始進程數和最小空閑,這樣可以發(fā)揮正常狀態(tài)的最大優(yōu)勢,加快處理速度 設置為15*核數 ,即1核15進程,雙核30進程。
6.根據內存設置最大進程,防止出現(xiàn)內存爆炸,導致fpm掛起或者mysql等其他服務掛逼。設置為1G*(40-50),即1G內存40-50,2G內存80-100。
7.設置上面兩項可以更有效率的使用服務器。
8.如上設置并不能防止CC攻擊,但是為我接下來需要說的提供了前提。
redis + 驗證碼 + 策略 防CC
采用redis高性能數據庫,合理的訪問策略驗證并在超大攻擊時開啟驗證碼訪問。讓網站遠離CC
1.安裝redis,在寶塔軟件管理找到,安裝;
2.安裝php redis擴展,你用哪個php就安裝哪個php的擴展,別裝錯了;
3.在網站入口,如Wordpress的index.php 頭部加入如下代碼:
header('Content-Type: text/html; charset=UTF-8'); //emlog原有代碼,復制下列代碼放在下面 //CC攻擊停止后會盡快解除驗證碼,回到正常狀態(tài) //防CC配置$IPmax = 30; //開啟驗證碼條件 值>=php最大進程數,適當設置更大會降低驗證碼觸發(fā)條件,但會增大502錯誤幾率(php掛起) $IPfor = 60; //周期 這個值基本不用動 $IPban = 60; //扔入黑名單 60秒內訪問超過60次即拉黑IP $banTime = 3600*24; //黑名單時長 扔小黑屋時長,這種代理IP放一天感覺都少了 = =! $ip = ip(); //連接本地的 Redis 服務$redis = new Redis();$redis->connect('127.0.0.1', 6379); //攔截黑名單if($redis->exists($ip.'ban')){ exit('您被關進了小黑屋,黑白網丨HeiBai.Org');} //扔黑名單檢測if($redis->get($ip.'ok') >= $IPban){ $redis->setex($ip.'ban', $banTime, '1');} if($redis->exists($ip.'ok')){ $redis->incrby($ip.'ok',1); //記錄IP 自增1}else{ $redis->setex($ip.'ok',$IPfor,1);} //按需開啟防CC 小黑屋IP不會觸發(fā)該條件,所以當一段時間以后就會解除驗證碼。除非攻擊者換一批代理繼續(xù)攻擊。如此往復if(count($redis->keys("*ok")) > $IPmax){ //驗證 if($_COOKIE['key'] == ''){ if($_GET['cc']){ $key = md5($ip.$_GET['cc']); setcookie("key",$key); } } //攔截代碼 if($_COOKIE['key'] && $_COOKIE['cc'] && $_COOKIE['key'] == md5($ip.$_COOKIE['cc'])){ //通過 }else{ if($_GET['cc']){ $key = md5($ip.$_GET['cc']); setcookie("key",$key); }else{ $cc = rand(1000,9999); setcookie("cc",$cc); //這里只是簡單的構造了一下驗證碼,有能力可以自己更改的更安全和完美。 echo '<!DOCTYPE html> <html> <body> <form action="">請輸入:'.$cc.' :<input type="text" name="cc" value=""><input type="submit" value="繼續(xù)訪問"></form> <p>訪問異常,請輸入驗證碼。</p> </body> </html>'; } exit(); }}function ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; return $res;}
如果不會技術怎么辦?
那也沒事,直接接入百度云加速防護,進入安全功能-ADS-CC防護,直接啟用強力防護。