Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击

一个朋友将自己的企业站放在其云否主机上,流量不大,但由于使用的是经常受到CC攻击,主要表现就是IO和CPU爆增,最后就是数据库挂掉导致网站无法访问。一开始启用了Cloudflare,但是攻击者疯狂地扫描,防御效果一般。

为了能够精确地识别恶意IP,在启用了Cloudflare CDN后需要在Nginx和Apache中启用Real IP模块,然后利用脚本分析网站日志,从日志中搜集异常IP,然后使用Cloudflare API批量将恶意IP添加到Cloudflare的防火墙当中。

当然,当网站遭遇非常强大的CC和DDoS攻击时,我们可以启用Cloudflare经典的5秒盾防攻击,如果把握不了攻击的频率的话,可以设置一个定时任务,当系统负载超过某一个值(一般来攻击会导致系统负载爆增),调用Cloudflare API启用5秒盾。

Cloudflare自动拉黑恶意IP到防火墙和自动切换5秒盾脚本防CC攻击

更多的关于网站安全和优化,这里有:

  1. 五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机
  2. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题
  3. 启用HSTS并加入HSTS Preload List让网站Https访问更加安全-附删除HSTS方法

PS:更新记录.

1、很多人不想修改NS服务器但是又想接入CloudFlare CDN,这里有最新的方法:最新CloudFlare免费CNAME和IP接入教程-无需修改NS直接接入CloudFlare。2022.8.3

2、这里还有一个应对小型CC和DDos攻击的策略,可以帮助应急:解决VPS网站小型CC攻击的方法-CloudFlare+Nginx+iptables防火墙。2020.12.27

3、对于VPS的安全问题,很朋友可能会忽视VPS本身的SSH配置,这里有强化策略:VPS主机和服务器安全防护:SSH修改端口,添加白名单,仅限密钥登录。2019.3.25

一、Cloudflare自动拉黑恶意IP

1.1  找出恶意IP

利用脚本分析在一分钟单个IP访问的频率,超过一定的频率(一般来正常的访问,一分钟内应该不超过60次,你可以设置为更小),即认定为恶意IP。脚本如下:

#/bin/bash

#日志文件,你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.txt,这里wzfou.com为了测试设置了2,你需要改成其它的数字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done

1.2  批量添加IP到防火墙

使用以下代码就可以将恶意IP批量添加到Cloudflare的防火墙了,记得替换为你的Cloudflare API。

#!/bin/bash
# Author: Zhys
# Date  : 2018

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(</data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR[@]}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  -H "X-Auth-Email: $CFEMAIL" \
  -H "X-Auth-Key: $CFAPIKEY" \
  -H "Content-Type: application/json" \
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
rm -rf /data/wwwlogs/black.txt

1.3  自动找出恶意IP并添加到防火墙

直接将上面两个脚本合并到一个脚本即可。

#/bin/bash

#日志文件,你需要改成你自己的路径

logfile=/data/wwwlogs/

last_minutes=1 

#开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)

start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'

echo $start_time

#结束时间现在

stop_time=`date +"%Y-%m-%d %H:%M:%S"`

echo $stop_time

cur_date="`date +%Y-%m-%d`" 

echo $cur_date

#过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径

tac $logfile/sky.ucblog.net_nginx.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}' | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10

ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`

ip=`cat $logfile/log_ip_top10 | awk '{if($1>2)print $2}'`

# 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字

for line in $ip

do

echo $line >> $logfile/black.txt

echo $line

# 这里还可以执行CF的API来提交数据到CF防火墙

done

# 填Cloudflare Email邮箱
CFEMAIL="freehao123@gmail.com"
# 填Cloudflare API key
CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"
# 填Cloudflare Zones ID 域名对应的ID
ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

# /data/wwwlogs/black.txt存放恶意攻击的IP列表
# IP一行一个。
IPADDR=$(</data/wwwlogs/black.txt)

# 循环提交 IPs 到 Cloudflare  防火墙黑名单
# 模式(mode)有 block, challenge, whitelist, js_challenge
for IPADDR in ${IPADDR[@]}; do
echo $IPADDR
curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  -H "X-Auth-Email: $CFEMAIL" \
  -H "X-Auth-Key: $CFAPIKEY" \
  -H "Content-Type: application/json" \
  --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
done

# 删除 IPs 文件收拾干净
 rm -rf /data/wwwlogs/black.txt

上面的脚本我已经放在我的下载中心,可以提供给大家下载使用,代码如下:

wget https://do.wzfou.net/shell/attack-ip.sh
chmod +x /qicmd/cfblockip.sh
./cfblockip.sh

wget https://do.wzfou.net/shell/attack-ip.sh
chmod +x /qicmd/attack-ip.sh
./attack-ip.sh

wget https://do.wzfou.net/shell/cf-block-attack-ip.sh
chmod +x /qicmd/cf-block-attack-ip.sh
./cf-block-attack-ip.sh

最后,设置一个定时任务,让脚本每过一分钟检测一次(请根据需要来调整,关于定时任务的使用参考:Linux Crontab命令定时任务基本语法

* * * * * /bin/bash /root/cf-block-attack-ip.sh > /tmp/ou1t.log 2>&1

自动添加恶意IP到CloudFlare防火墙的效果如下:

Cloudflare自动拉黑恶意IP到防火墙

二、Cloudflare自动切换5秒盾脚本

网站:

  1. https://github.com/Machou/Cloudflare-Block

当你的服务器受到攻击时,系统负载就会爆增,利用脚本自动检测系统负载,当压力超过一定的值时就可以切换为” I’m Under Attack! “模式了。操作步骤如下:

#下载
cd /root && git clone https://github.com/Machou/Cloudflare-Block.git DDoS

#打开Cloudflare.sh,修改配置
API_KEY			You're Global API Key (https://dash.cloudflare.com/profile)
MAIL_ACCOUNT		Email of your Cloudflare account
DOMAIN			Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

#设置定时任务
crontab -e

*/1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minute if protection is not enabled
*/20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled

脚本默认的是检测系统负载为10,启动” I’m Under Attack! “模式,你以根据需要来调整。如下图:

Cloudflare自动切换5秒盾脚本

完整的脚本代码如下:

#!/bin/bash


# $1 = 1min, $2 = 5min, $3 = 15min
loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')


# load is 10, you can modify this if you want load more than 10
maxload=10


# Configuration API Cloudflare
# You're Global API Key (https://dash.cloudflare.com/profile)
api_key=
# Email of your account Cloudflare
email=
# Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)
zone_id=     


# create file attacking if doesn't exist
if [ ! -e $attacking ]; then
  echo 0 > $attacking
fi

attacking=./attacking


hasattack=$(cat $attacking)


if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ]; then

  if [[ $hasattack = 0 && $1 = 0 ]]; then

    # Active protection
    echo 1 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
            -H "X-Auth-Email: $email" \
            -H "X-Auth-Key: $api_key" \
            -H "Content-Type: application/json" \
            --data '{"value":"under_attack"}'
  fi

  else
    if [[ $hasattack = 1 && $1 = 1 ]]; then

    # Disable Protection
    echo 0 > $attacking
    curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
            -H "X-Auth-Email: $email" \
            -H "X-Auth-Key: $api_key" \
            -H "Content-Type: application/json" \
            --data '{"value":"high"}'
  fi
fi

exit 0

三、总结

Cloudflare是一个非常好用的防御DDos和CC攻击的工具,免费版本的Cloudflare结合API可以实现更加灵活的功能,对于普通的防御足够自己使用了。

Cloudflare防护也有一定的问题,那就是启用了Cloudflare后获取到用户的IP都是Cloudflare CDN节点的IP,我们还需要在服务器配置中做进一步的优化。

文章出自:挖站否 https://wzfou.com/cloudflare-cc/,部分内容参考自 9sep 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。


分享到:
Avatar for Qi
关于站长(Qi),2008年开始混迹于免费资源圈中,有幸结识了不少的草根站长。之后自己摸爬滚打潜心学习Web服务器、VPS、域名等,兴趣广泛,杂而不精,但愿将自己经验与心得分享出来与大家共勉。
已有 23 条评论
  1. Avatar for Stellvia Stellvia

    # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.txt,这里wzfou.com为了测试设置了2,你需要改成其它的数字

    不好打搅了 请问该处修改是在何处进行修改

    2021年4月7日 14:54 回复
    • Avatar for Qi Qi

      $1>2,把这个2换成大一点的就行。

      2021年4月7日 15:09 回复
      • Avatar for Stellvia Stellvia

        了解了 谢谢~

        2021年4月8日 08:32 回复
  2. Avatar for 4-eveR.ゝ 4-eveR.ゝ

    想和您请教一下,使用cf-block-attack-ip.sh这个脚本,周期每1分钟执行一次,log_ip_top10没有是1分钟周期IP日志,是全部累加中的…..请教大神如何解决[太开心]

    2020年3月14日 12:44来自QQ1 回复
  3. Avatar for liao liao

    学习了

    2019年5月25日 00:161 1 回复
  4. Avatar for SUMMER SUMMER

    思路是好的,只是一遇到真正的CC攻击时,估计进程会瞬间高负载,还有可能挂掉,那么日志是记录不了的。之后的骚操作有可能进行不下去。。

    2019年4月19日 01:373 3 回复
    • Avatar for Qi Qi

      是的,只能防一点小的,大的话只能是硬抗了。

      2019年4月21日 17:354 4 回复
  5. Cloudflare自动拉黑恶意IP这个脚本默认是1分钟内60次访问么?

    2019年4月15日 23:514 2 回复
  6. Avatar for 克劳德 克劳德

    大佬能不能教教我怎么来做同样的云锁负载开启到高防御的脚本呢?
    云锁也是不会自动开启验证码模式,只能手动调整,常开高又影响收录
    要是也能根据CPU负载之类的判断自动开启验证码模式就好了[挤眼]

    2019年4月11日 00:152 回复
  7. 居然还有这种骚操作,神奇

    2019年4月1日 16:57 回复
  8. Avatar for Mat Mat

    站长,你的域名wzfou.com似乎DNSSEC配置有点问题,很多地方解析失败了。

    2019年3月23日 17:13 回复
    • Avatar for Qi Qi

      是的,ns1太贵了,我给它关闭了。现在我又切换到谷歌的DNs了。应该DNSSEc应该是恢复正常了。

      2019年3月25日 10:25 回复
  9. Avatar for 克劳德 克劳德

    请问下系统负载,单核CPU情况下的maxload=10,是不是应该改为maxload=1

    2019年3月22日 18:02 回复
    • Avatar for Qi Qi

      10有点大了,改成5以下的就可以。1又太小了。

      2019年3月25日 10:28 回复
      • Avatar for 克劳德 克劳德

        他这个maxload指的是负载么?还是10就是百分百1就是百分之一

        2019年3月25日 19:46 回复
        • Avatar for Qi Qi

          是的,不过一般来说1个CPU对应1个负载就已经差不多了,如果单CPU的话,建议负载设置为1左右。

          2019年3月26日 15:15 回复
          • Avatar for 你好 你好

            还是没明白,这个maxload的1是100%,还是1%?

            2021年11月27日 20:10 回复
            • Avatar for Qi Qi

              是的,是压力负载。

              2021年11月28日 22:30 回复
          • Avatar for 你好 你好

            百度了下,明白load的含义了[good]

            2021年11月27日 20:16 回复
  10. Avatar for 糇

    小站,手动开启足矣。

    2019年3月22日 09:02 回复
  11. cloudflare的防护效果还不错
    搭配脚本更能灵活地保护站点

    2019年3月22日 04:11来自移动端 回复
    • Avatar for 夏目贵志 夏目贵志

      我之前都是用DDoS deflate 防护的,感觉QI的这个好像更好用一点

      2019年3月24日 06:38来自移动端 回复
      • Avatar for Qi Qi

        这个自动化好一点。

        2019年3月25日 10:25 回复