1,登入進VPS控制台,準備好隨時重啟VPS。
2,關閉Web Server先,過高的負載會導致後面的操作很難進行,甚至直接無法登入SSH。
3,以防萬一,把設定的Web Server系統啟動後自動運行去掉。
(如果已經無法登入進系統,並且重啟後負載過高導致剛剛開機就已經無法登入,可聯絡管理員在母機上封掉VPS的IP或80連接埠,在母機上用虛擬控制台登入進系統,然後進行2&3的操作,之後解鎖)
二,找出攻擊者IP
1,在網站根目錄建立檔案ip.php,寫入下面的內容。
代碼如下 |
複製代碼 |
<?php
$real_ip = getenv('HTTP_X_FORWARDED_FOR'); if(isset($real_ip)){ shell_exec("echo $real_ip >> real_ip.txt"); shell_exec("echo $_SERVER['REMOTE_ADDR'] >> proxy.txt"); }else{ shell_exec("echo $_SERVER['REMOTE_ADDR'] >> ips.txt"); } echo '伺服器受到攻擊,正在收集攻擊源,請在5分鐘後訪問本站,5分鐘內多次訪問本站有可能會被當作攻擊源封掉IP。謝謝合作!'; ?> |
2,設定偽靜態,將網站下的所有訪問都rewrite到ip.php。
Nginx規則:
代碼如下 |
複製代碼 |
rewrite (.*) /ip.php; Lighttpd規則: url.rewrite = (
"^/(.+)/?$" => "/ip.php" ) |
3,啟動Web Server開始收集IP
進行完1和2的設定後,啟動Web Server,開始記錄IP資訊。
收集時間建議為3到5分鐘,然後再次關閉Web Server。
real_ip.txt,這個檔案中儲存的IP有80%以上都相同的,這個IP就是攻擊者實施攻擊的平台的IP。
proxy.txt,這個檔案中儲存的是攻擊者調用的Proxy 伺服器的IP,需要封掉。
ips.txt,這裡記錄的是未表現出Proxy 伺服器特徵的IP,根據訪問次數判斷是否為攻擊源。
三,對上一段的補充
如果VPS上啟用了WEB日誌,可以查看記錄檔的增長速度來判斷是哪個網站被攻擊。
如果沒有啟用日誌,並且網站數量很少,臨時啟用日誌也很方便 。
如果沒有啟用日誌,並且網站數量過多,可以使用臨時的Web Server設定檔,不綁定虛擬機器主機,設定一個預設的網站。然後在ip.php裡加入下面一行
代碼如下 |
複製代碼 |
shell_exec("echo $_SERVER['HTTP_HOST'] >> domain.txt");
|
domain.txt裡將儲存被訪問過的網域名稱,被CC攻擊的網站將在裡面占絕大多數。
四,開始封堵IP
建立檔案ban.php
代碼如下 |
複製代碼 |
<?php $threshold = 10; $ips = array_count_values(file('ips.txt')); $ban_num = 0; foreach($ips as $ip=>$num){ if($num > $threshold){ $ip = trim($ip); $cmd = "iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP"; shell_exec($cmd); echo "$ip baned!n"; $ban_num ++; } } $proxy_arr = array_unique(file('proxy.txt')); foreach($proxy_arr as $proxy){ proxy = trim($proxy); $cmd = "iptables -I INPUT -p tcp --dport 80 -s $proxy -j DROP"; shell_exec($cmd); echo "$proxy baned!n"; $ban_num ++; } echo "total: $ban_num ipsn"; ?> |
用下面的命令執行指令碼(確保php命令在PATH中)
php ban.php
這個指令碼依賴於第二段中ips.txt裡儲存的結果,當其中記錄的IP訪問次數超過10次,就被當作攻擊源給屏蔽掉。如果是Proxy 伺服器,則不判斷次數直接封掉。
封完IP之後,把所有的網站設定恢複正常,網站可以繼續正常運行了。