对于互联网来说,DDOS 一直是以一种毒瘤的形式存在的。许多人都热爱这种无技术的攻击方式。

20131217001

今天就介绍一下如何防范小量的 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

20131216201146

二、防范第二招:使用 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

安装完毕有个声明,可以直接按 退出。

使用方法:/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 下面,如下图:

20131217002

五、防范第五招之终极方法:最有效的防范 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 刷的内存受不了,近期都不打算写文章的了。

目前有38条回应
Comment
Trackback
Loading ....
  • ★Extreme★ 回应于2014/01/17 20:33 回复TA

    那个不能说是防止SYN攻击吧,只能说削弱……
    别忘了还有UDP,UDP FLOOD挺爽的。

  • 麦田一根葱 回应于2013/12/23 11:49 回复TA

    没vps只能玩最后一招

    • Tomas 回应于2013/12/25 21:21 回复TA

      纳尼,你的不是 VPS 么 。。你用的虚拟主机?

      你可以让主机商帮忙设置一下嘛,又不占用他多少内存 。。

  • 小康 回应于2013/12/22 14:20 回复TA

    支持一下,虽然完全看不懂 😉

    • Tomas 回应于2013/12/22 15:58 回复TA

      不用看得懂,用得上就 OK 了嘛~

  • lafirel 回应于2013/12/22 04:29 回复TA

    或者每秒超过2次呢?最近正在被CC找了两天你这个最管用

    • Tomas 回应于2013/12/22 11:55 回复TA

      你这么设置就太小了 。。刷新两下的话呢 。。

      • lafirel 回应于2013/12/22 23:12 回复TA

        @Tomas: 眼睛都要瞪瞎了看nginx日志,最后设定了1秒内3次请求Ban掉。目前观察没有误伤。谢谢你的东西,真的解决了大问题。这种多IP伪装正常访问的CC真的很难防。我已经Ban掉了所有福建莆田的IP用nginx,配合这个服务器压力小很多了。也就是我在用Linode,别的服务器估计早就瘫了。谢谢

        • Tomas 回应于2013/12/25 21:18 回复TA

          出新版了哦,欢迎围观~

          • lafirel 回应于2013/12/27 09:58 回复TA

            @Tomas: 你好,我加了一下你Q貌似验证回答不对……有个问题,就是我中间清空过一次nginx日志,现在iptables -L就没有新ban的IP加上去了。不知道怎么回事,清空日之后,日志也又正常开始记录。

  • lafirel 回应于2013/12/22 03:47 回复TA

    如果想改成5分钟内大于20次呢第一条怎么改?

    • Tomas 回应于2013/12/22 11:53 回复TA

      “1 minute ago”,这里把 1 改为 5 应该就可以了

  • 湖畔楼阁 回应于2013/12/19 19:23 回复TA

    那人到底是何方神圣?

    • Tomas 回应于2013/12/19 19:56 回复TA

      你猜 。。现在多台阿里云 SLB 了,内存也足够,让那 Bitch 刷吧

      • 湖畔楼阁 回应于2013/12/20 23:16 回复TA

        @Tomas: 用别人的错误惩罚自己。。这不值啊

        • Tomas 回应于2013/12/21 12:51 回复TA

          @湖畔楼阁: 😡 ,其实老早就想了 。。可是当时没那么多余的金额来购买,不过近期兼职多所以就叼起来了 。。

          • 湖畔楼阁 回应于2013/12/21 13:02 回复TA

            @Tomas: 😡 😡 😡 😡 😡 😡 😡 到时候没钱供服务器搬你那去

            • Tomas 回应于2013/12/21 13:56 回复TA

              纳尼,搬到我哪里 。。

              • 湖畔楼阁 回应于2013/12/22 19:47 回复TA

                @Tomas: 超级SLB

                • Tomas 回应于2013/12/22 19:49 回复TA

                  @湖畔楼阁: 😎 目前独立用,不过我貌似搞出 Azure 负载均衡了,因为内网联通速度还不错、稍微利用一下,如果 OK 的话过几天把博客搬到 azure 。。。

  • 神父 回应于2013/12/18 08:48 回复TA

    小民屁博,木有价值,不值得攻击

    • Tomas 回应于2013/12/18 09:47 回复TA

      如果是同行呢。。

  • oott123 回应于2013/12/18 07:59 回复TA

    我喜欢第三个。

    • Tomas 回应于2013/12/18 09:47 回复TA

      第三个不咋用,不过第一个效果不错~

  • 火枪手博客 回应于2013/12/18 00:26 回复TA

    貌似还真没有考虑过网站会被攻击的情况~~

  • 炜昸 回应于2013/12/17 23:45 回复TA

    如果是大量的呢 😎

    • Tomas 回应于2013/12/18 09:47 回复TA

      如果是非常大量的话建议还是配合硬件防火墙好

  • 不给力的面条 回应于2013/12/17 22:44 回复TA

    海外127 不要google收录了?

  • 鄭仁翔 回应于2013/12/17 21:05 回复TA

    板凳? 😯

  • 鄭仁翔 回应于2013/12/17 21:04 回复TA

    沙發。 🙁

  • 本篇文章没有Trackback
你目前的身份是游客,请输入昵称和电邮!