linux伺服器配合php和cron自動實現封鎖攻擊者ip

來源:互聯網
上載者:User

    我已經好久沒有寫點東西了,主要是因為最近實在是太忙了,有個白癡天天用webbench攻擊公司的伺服器.

    俗話說得好,久病成醫,今天我這個蒙古大夫就分享一下自動防攻擊的部分.

    首先我來說一下這個被攻擊的網站的大概部署狀況.這個網站主要是nginx+mysql+php,有兩台伺服器分別放了web和資料庫,web只對外開啟了80連接埠作業系統是centos,而資料庫伺服器則在內網,攻擊者的手段其實很簡單,用webbench網站壓力測試工具發送大量的請求到伺服器,之前的時候發送每一個請求之後資料庫就會相應,然後讀取內容最終顯示,造成資料庫和web之間大量的交換資料,甚至導致mysql達到串連數上限,請求被拒絕,而且攻擊者時間挺多的,他不停地換浮動ip,因此直接用防火牆封鎖ip沒意義.

   剛開始我的做法是,用php取得攻擊者的agent頭,判斷是不是webbench來訪,如果是就die掉,不在請求資料庫,確實挺有效,資料庫不會再超出限制了,但是對方頻繁的發送請求過來,導致網路頻寬被嚴重消耗,看來得想想其他辦法,最終想到了一個解決方案且實際測試發現可行,因此分享給大家,其實我的做法原理很簡單:用php取得使用者agent頭判斷是否是webbench來源,如果是的話就在伺服器上寫一個shell檔案,這個檔案的內容就是封鎖IP的規則,然後再用chmod函數修改一下這個檔案讓其可執行,再用cron服務讀取這個檔案執行,把ip封鎖掉,整個過程全部自動化完成不需要人為幹預,另外在封鎖的時候給我發一封email通知我有個倒黴蛋被幹掉了,這樣就行了.

    具體實現代碼如下:

IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {$_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {$p='/home/www/webbench.sh';$_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';File_Put_Contents($p,"#!/bin/bash\niptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;\n",LOCK_EX);Chmod($p,0755);chown($p,'www');Function sMail($to,$tit,$msg) {IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){throw new Exception('電郵地址錯誤!');}$tit='=?UTF-8?B?'.Base64_Encode($tit).'?=';$msg = str_replace("\n.","\n..",$msg);//Windows如果在一行開頭髮現一個句號則會被刪掉,要避免此問題將單個句號替換成兩個句號Return Mail($to,$tit,$msg,'From:No-reply@adm.bossadm.com.tw'."\n".'Content-Type:text/html;charset=utf-8');}sMail('see7di@gmail.com','【WebBench又開始了-by http://www.7di.net】!',date('Y-m-d H:i:s',time())." {$_SERVER['REMOTE_ADDR']}");Header('Location:http://127.0.0.1');Die();}}

 後來我又做了一次調整,把發email的部份寫入了shell檔案內,不再用php發email,因為那會灌爆你的信箱,把上邊的代碼修改成:

IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {$_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {$p='/home/www/webbench.sh';$_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';File_Put_Contents($p,"#!/bin/bash\niptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;\necho \"{$_SERVER['REMOTE_ADDR']} - `date`\" | mail -s \"WebBench-www.7di.net\" see7di@gmail.com\n",LOCK_EX);Chmod($p,0755);chown($p,'www');Header('Location:http://127.0.0.1');Die();}}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.