防范小量 DDOS 与 CC 攻击的各种方法 12月17日
对于互联网来说,DDOS 一直是以一种毒瘤的形式存在的。许多人都热爱这种无技术的攻击方式。
今天就介绍一下如何防范小量的 DDOS/CC 攻击( 准确来说,是缓解 ),废话不多说、进入教程~
这里稍微纠正一下,标题加“DDOS”完全是为了吸引阅读。
PS:2013年12月25日更新,https://www.zntec.cn/archives/ease-ddos-cc-update.html
一、防范第一招:iptables 配合 Shell script 缓解 CC 攻击。
这个方法适合 VPS 使用,把如下脚本保存为 ban.sh :
#!/bin/bash cur=`date +%H%M%S` becur=`date -d "1 minute ago" +%H%M%S` badip=`tail -n 10000 /home/wwwlogs/access.log | egrep -v "\.(gif|jpg|jpeg|png|css|js)" | awk -v a="$becur" -v b="$cur" -F [' ':] '{t=$5$6$7;if (t>=a && t<=b) print $1}' | sort | uniq -c | awk '{if ($1>=20) print $2}'` if [ ! -z "$badip" ];then for ip in $badip; do if test -z "`/sbin/iptables -nL | grep $ip`";then /sbin/iptables -I INPUT -s $ip -j DROP fi done fi
脚本解析:/home/wwwlogs/access.log 改为你网站的访问日志地址,$1>=20 是检查日志中 IP 每分钟访问的次数是否大于 20 次,是的话你懂的、脚本一执行就 ban 掉那个 IP 了。
使用方法:将以上脚本保存好之后,添加 Crontab 任务每分钟执行一次:
chmod +x /root/ban.sh #添加执行权限 crontab -e #进入编辑 crontab,进入后按“i”编辑
语句为:* * * * * /root/ban.sh
二、防范第二招:使用 iptables 缓解 CC 攻击。
这个也是仅仅适合 VPS 使用,依次执行如下命令即可:
iptables -N syn-flood #防止SYN攻击 iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN iptables -A syn-flood -j REJECT iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP #防止连接数过多,限制每 IP 为 15 个( eth0 改为你的外网 网卡 ) iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT #允许单个IP的最大连接数为30
三、防范第三招:使用 ddos-Deflat 抵御小量 CC 攻击。
这个也是仅适合 VPS 使用,因为基于 iptables 或 apf,所以先看看 iptables 可否运行:
service iptables status
如果是正常运行的再就下载 ddos-Deflat 并进行安装:
wget https://www.zntec.cn/wp-content/uploads/ddosDeflat.sh sh ddosDeflat.sh
安装完毕有个声明,可以直接按 q 退出。
使用方法:/usr/local/ddos/ddos.sh -h
四、防范第四招:利用强大的 Php 判断会话。
这个方法适合任何 Php 程序,如下以 WordPress 做例子:
//防止CC攻击 session_start(); //开启session $timestamp = time(); $ll_nowtime = $timestamp ; //判断session是否存在 如果存在从session取值,如果不存在进行初始化赋值 if ($_SESSION){ $ll_lasttime = $_SESSION['ll_lasttime']; $ll_times = $_SESSION['ll_times'] + 1; $_SESSION['ll_times'] = $ll_times; }else{ $ll_lasttime = $ll_nowtime; $ll_times = 1; $_SESSION['ll_times'] = $ll_times; $_SESSION['ll_lasttime'] = $ll_lasttime; } //现在时间-开始登录时间 来进行判断 如果登录频繁 跳转 否则对session进行赋值 if(($ll_nowtime - $ll_lasttime) < 3){ if ($ll_times>=5){ header("location:http://127.0.0.1"); exit; } }else{ $ll_times = 0; $_SESSION['ll_lasttime'] = $ll_nowtime; $_SESSION['ll_times'] = $ll_times; }
把如上代码添加到 functions.php 的 <?php 下面,如下图:
五、防范第五招之终极方法:最有效的防范 DDOS/CC 的方法。
1、使用 CloudFlare 作为网站 CDN,但是对于国内主机来说不靠谱。
2、使用 Dnspod 解析海外线路为 127.0.0.1( 大多数攻击 IP 基本是国外的 )
3、不做网站,让他任意 DDOS + CC 一百万次也不用管,特靠谱。
注意事项:
1、在使用 iptables 的相关功能时先添加你的 IP 到允许名单。
2、如果你已经被 CC 弄的不得了,试试重启 nginx 或 apache。
3、仅仅靠这个还是不行的,还是需要配合硬防。
今天的文章到此为止,以上方法均是自己用了挺长时间到处搞的。WP 代码来自:阿福博客
小结
要不是被 Bitch 刷的内存受不了,近期都不打算写文章的了。
- 本篇文章没有Trackback
那个不能说是防止SYN攻击吧,只能说削弱……
别忘了还有UDP,UDP FLOOD挺爽的。
没vps只能玩最后一招
纳尼,你的不是 VPS 么 。。你用的虚拟主机?
你可以让主机商帮忙设置一下嘛,又不占用他多少内存 。。
支持一下,虽然完全看不懂 😉
不用看得懂,用得上就 OK 了嘛~
或者每秒超过2次呢?最近正在被CC找了两天你这个最管用
你这么设置就太小了 。。刷新两下的话呢 。。
@Tomas: 眼睛都要瞪瞎了看nginx日志,最后设定了1秒内3次请求Ban掉。目前观察没有误伤。谢谢你的东西,真的解决了大问题。这种多IP伪装正常访问的CC真的很难防。我已经Ban掉了所有福建莆田的IP用nginx,配合这个服务器压力小很多了。也就是我在用Linode,别的服务器估计早就瘫了。谢谢
出新版了哦,欢迎围观~
@Tomas: 你好,我加了一下你Q貌似验证回答不对……有个问题,就是我中间清空过一次nginx日志,现在iptables -L就没有新ban的IP加上去了。不知道怎么回事,清空日之后,日志也又正常开始记录。
如果想改成5分钟内大于20次呢第一条怎么改?
“1 minute ago”,这里把 1 改为 5 应该就可以了
那人到底是何方神圣?
你猜 。。现在多台阿里云 SLB 了,内存也足够,让那 Bitch 刷吧
@Tomas: 用别人的错误惩罚自己。。这不值啊
@湖畔楼阁: 😡 ,其实老早就想了 。。可是当时没那么多余的金额来购买,不过近期兼职多所以就叼起来了 。。
@Tomas: 😡 😡 😡 😡 😡 😡 😡 到时候没钱供服务器搬你那去
纳尼,搬到我哪里 。。
@Tomas: 超级SLB
@湖畔楼阁: 😎 目前独立用,不过我貌似搞出 Azure 负载均衡了,因为内网联通速度还不错、稍微利用一下,如果 OK 的话过几天把博客搬到 azure 。。。
小民屁博,木有价值,不值得攻击
如果是同行呢。。
我喜欢第三个。
第三个不咋用,不过第一个效果不错~
貌似还真没有考虑过网站会被攻击的情况~~
如果是大量的呢 😎
如果是非常大量的话建议还是配合硬件防火墙好
海外127 不要google收录了?
那是比较终极的方法了 。。
@不给力的面条: 现在使用dnspod的,google基本都不收录了,怕什么
也对,dns 错误33%
板凳? 😯
沙發。 🙁
@鄭仁翔: 😡 下次也去你博客抢沙发,不过你博客那个背景真的不太好看还加载好慢 。。
@Tomas: 不然你給我找個適合的背景吧。 ➡
@鄭仁翔: Mossight 默认的还不错 。。
@Tomas: 不喜歡預設的。
额,那你用你现在这个吧 。。就是忒大了