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(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述