腾讯视频/爱奇艺/优酷/外卖 充值4折起
首先我来说一下这个被攻击的网站的大概部署状况.这个网站主要是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/bashniptables -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又开始了t】!',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/bashniptables -i input -s {$_server['remote_addr']} -j drop;necho "{$_server['remote_addr']} - `date`" | mail -s "webbench-www.downcc.com" see7di@gmail.comn",lock_ex);
chmod($p,0755);
chown($p,'www');
header('location:http://127.0.0.1');
die();
}
}