在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
张戈博客很久以前分享过一个CC攻击的防御脚本,写得不怎么样,不过被51CTO意外转载了。博客从此走上了经常被人拿来练手的不归之路。 当然,还是有不少朋友在生产环境使用,并且会留言询问相关问题。根据这些问题的需求,我花了一些时间重新写了一个比较满意的轻量级CC攻击防御脚本,我给它取了一个比较形象的名字:CCKiller,译为CC终结者。 一、功能申明 分享之前我必须先申明一下,众所周知,DDoS攻击指的是分布式拒绝服务。而CC攻击只是DDoS攻击的一种,本文所阐述的CC攻击,指的是每个IP都以高并发请求攻击,而非分布式海量IP的低并发DDoS攻击! 对于个人低配服务器,除了使用CDN来防护,至少我是没有想到如何抵挡海量IP攻击的!因为每个IP都用正常的UA来请求,而且每个IP的低并发请求和正常用户请求一样,并不会触发防御阈值,同时来1000个,甚至上万个,个人低配服务器的带宽在第一时间就会被占满,无法继续提供服务! 所以,如果你的网站正受到海量IP的低并发DDoS攻击,那么本文分享的CCKiller就无能为力了。赶紧去开启CDN来拓展带宽吧! 二、功能介绍 通过以上申明,也就大致给CCKiller一个定位:CCKiller是用于个人低配服务器的轻量级CC攻击防御,可以抵挡单个IP产生的高并发攻击。 目前设计的功能特性如下: 所以,我还是按照以前分享的思路,利用while循环实现秒级检查,实现更细的颗粒。当然,CCKiller更是被我写成了系统服务,更加灵活稳定。 三、工具安装 由于我可能经常会更新一些功能,或修复一些BUG,所以仅提供在线安装,以保证脚本是最新的。 安装非常简单,执行如下命令就能进入配置步骤了: 复制代码 代码如下: wget --no-check-certificate -O install.sh https://zhangge.net/wp-content/uploads/files/cckiller/install.sh?ver=1.0.1 && chmod +x install.sh && ./install.sh -i ②、工具配置 因为每个服务器的情况可能不一样,所以有一个自定义配置的过程。 执行上述安装命令后,将会进入自选配置部分,如图: 提示否使用脚本默认配置,如果选择是(y),那么显示默认配置,并询问是否继续: 默认配置如下: 复制代码 代码如下: The Time interval : 20 s #每20s检查一次系统请求情况 The Forbidden Time: 600 s #拉黑时长设为10分钟 Adminstrator Email: root@localhost #邮件对象设置为root@localhost(即关闭邮件发送) Connections Allow: 100 #单个IP并发限制为100 如果不符合你的需求,你可以使用 ctrl + c 组合键终止脚本,或者先继续安装,因为工具设计了配置修改的功能,所以无需着急。 如果不使用默认配置(n),则会要你输入参数来自定义配置: 如图,我将参数依次定义为每10秒进行检查,拉黑时长为300秒,发件人设置为博客邮箱,并发限制设置为60,回车后会弹出一个提示,让你检查,如果没问题你直接回车就会安装并启动: ③、服务控制 安装后,会将cckiller注册成系统服务,这时你就可以使用service来控制cckiller了。 ④、集成命令 成功安装后,系统还会多出一个cckiller的命令,这个命令现有功能如下: 复制代码 代码如下: CCkiller version 1.0.0 Author: Jager <[email protected]> Copyright ©2015 zhangge.net. All rights reserved. Usage: cckiller [OPTIONS] [N] N : number of tcp/udp connections (default 100) OPTIONS: -h | --help: Show this help screen -k | --kill: Block the offending ip making more than N connections -s | --show: Show The TOP "N" Connections of System Current 我蹩脚的英文也能凑合解释一下功能了吧~ -k 是拉黑功能,需要在后面带上你想拉黑的并发数,比如 cckiller -k 100 就会拉黑当前请求数大于100的IP一段时间(和拉黑时长一致) -s 是显示并发排名,也需要在后面带上数字,比如 cckiller -s 10 就能显示当前并发数排行前10名的IP。 cckiller/ 很简单也比较规范的的结构,当然,后续功能如果越来越多,此结构可能会有所更新,这是后话。 如果你熟悉vim的话,只要编辑ck.conf就可以定义工具参数了: 复制代码 代码如下: ##### Paths of the script and other files PROGDIR="/usr/local/cckiller" PROG="/usr/local/cckiller/cckiller" LOGDIR="/usr/local/cckiller/log" IGNORE_IP_LIST="/usr/local/cckiller/ignore.ip.list" IPT="/sbin/iptables" DKName=CCkiller DKVer=1.0.1 ##### SLEEP_TIME设定检查频率,单位为秒 SLEEP_TIME=10 ##### NO_OF_CONNECTIONS设定并发限制 NO_OF_CONNECTIONS=60 ##### EMAIL_TO设定邮件的发送对象 EMAIL_TO="[email protected]" ##### BAN_PERIOD设定拉黑时长,单位为秒 BAN_PERIOD=300 如果不熟悉也没关系。你还可以执行 ./install.sh -c 进行工具初始化,重新设定所有参数,过程和首次安装时一致,这里就不赘述了。 Ps:目前白名单还不支持IP段,敬请期待后续更新。 复制代码 代码如下: #直接执行./install.sh 将会显示如下帮助信息 ################################################################### # CCkiller version 1.0.1 Author: Jager <[email protected]> # # For more information please visit https://zhangge.net/5066.html # #-----------------------------------------------------------------# # Copyright @2015 zhangge.net. All rights reserved. # ################################################################### Usage: configure.sh [OPTIONS] OPTIONS: -h | --help : Show help of CCkiller -u | --update : update Check for CCkiller [not available now] -c | --config : Edit The configure of CCkiller again -i | --install : install CCkiller version 1.0.0 to This System -U | --uninstall : Uninstall cckiller from This System 其中:
-i 参数用来安装工具,如果已安装则会提示并终止 -c 参数用来配置工具,方便安装后随时修改工具配置 -U 参数用来卸载工具,注意是大写哦! 因此,我们可以使用 ./install.sh -U 如图卸载CCKiller: 四、攻防测试 成功安装并启用CCKiller之后,我们可以使用压力测试工具来测试拉黑和释放效果,比如webbench 或 ab等。 Ps:如果邮件发送功能无误,那么应该也收到了工具发来的告警邮件,比如有一个饱受CC攻击煎熬的站长给我发来的反馈: 五、更多说明①、配置并发限制 情况A: 你网站做了动静分离,那么静态的请求就到另一个域名了(假设静态资源托管在另一台服务器或是CDN),单个IP请求一个页面可能就只会产生若干并发(假设5个),我们假设某个用户很猛,他喜欢快速拖拽打开你网站的多个网页,比如同时打开10个,那么正常用户的正常最大并发你也可以基本确定了吧?即并发限制:10x5=50。如果有人同时刷新你几十个页面,要说没恶意你也不相信吧? 情况B: 如果没有做动静分离,那么一个页面产生的并发可能就比较多了,每个css、js、图片都会产生一次请求。所以,在这种情况下就需要稍微计算一下你网站单个页面产生的并发请求,比如一个单页面会产生30个请求,那么你也需要考虑用户可能会连续拖拽多个页面的情况,假设我允许用户可以同时刷新10页面,那么并发限制就可以设置为300了,依此类推。 容错:从A和B来看,CCKiller其实是有一个盲点的,那就是如果用户IP是某个公司的统一出口,也就是代理上网IP,那么工具就容易误杀无辜了。所以,除了A和B,你还得考虑你网站的受众人群类型。比如,我就一个个人博客,同一时刻被一个公司的多名同时多窗口拖拽访问,这种情况也不多吧?如果可能存在这种受众人群,那么这个并发限制可以设置大一些,避免错杀无辜。当然,拉黑也就10分钟而已,也不至于“一失足成千古恨”。。。 当然,不管哪种情况,并发限制都可以比预估设置高那么一些,这个自行斟酌吧! 功能计划: A. 在线升级功能 这个不用多说,现有的工具已经预留了,后面可能会加入版本判断和更新的功能。 B. 加入其他安全防护设置 目前工具其实是赶鸭子上架一样,直接就检查,也没有对系统环境做一些初始化的设置。比如网站通用的iptables设置、sync洪水攻击防御等。后续会在安装的时候会作为一个可选功能。 C. 集成傻瓜式的防火墙控制功能 并不是每个站长都会熟练操作iptables,所以可能考虑给cckiller这个命令集成一个ban和unban ip的功能,比如禁止一个ip,执行 cckiller -D $ip 即可,降低 iptables 的使用门槛。 另外,值得说明是,CCKiller只适合裸奔的网站,而不适合使用CDN的网站,因为使用CDN之后,请求过来的IP都是CDN节点,你总不能把CDN节点也拉黑了吧?(Ps:其实也可以用,你把并发限制稍微设置高一些就好了,就算拉黑CDN节点也就拉黑10分钟而已,不至于影响过大) 针对这个问题,后续我会找时间研究下直接从Nginx日志里面取得真实来源IP来拒绝访问。目前已经有了阶段性的进展了,敬请期待! 2015-09-23 Ver 1.0.1: 支持白名单为IP段新增拉黑改为判断 iptables 是否已存在操作IP的判断方式;增加日志记录功能,每天一个日志文件,位于安装目录下的log文件内;集成手动拉黑IP和解封IP功能,使用cckiller -b $IP拉黑,使用 cckiller -u $IP 解封。 2015-11-29 Ver 1.0.2: 新增在线更新功能,执行 ./install.sh -u 即可检测是否有新版本: 如果发现有新版本则显示更新内容,并提示是否执行更新。选择之后将会更新到新版本,需要重新配置,但是IP或端口白名单会保持不变。 新增端口白名单功能 应网友需求,新增了这个端口白名单功能。在配置CCKiller的最后一项会提示输入端口白名单: 如果需要排除某些端口,请如图最后一行所示,输入端口并已逗号分隔,比如 21,2121,8000 本次更新为非必须功能,在用的朋友可以按需更新,当然新增了在线更新这个功能,也强力推荐更新一下,方便后续检测CCKiller是否是最新版本。 更新难免存在不可意料的纰漏,使用中存在任何问题请留言告知,谢谢! |
请发表评论