zoukankan      html  css  js  c++  java
  • linux服务器配合php和cron自动实现封锁攻击者ip

        我已经好久没有写点东西了,主要是因为最近实在是太忙了,有个白痴天天用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();
    	}
    }
    
  • 相关阅读:
    linux常见的编码转换
    linux sort的用法
    转--11个失败之后
    shell入门
    迟到
    必须要回答的问题
    【转载】个人开发者要掌握的时间规划建议
    Unity 碰撞检测 OnTriggerEnter 入门
    浅谈BUFF设计
    随机掉宝,对玩家来讲真的随机吗?
  • 原文地址:https://www.cnblogs.com/see7di/p/2987050.html
Copyright © 2011-2022 走看看