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秒盾。

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

  1. 五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机

  2. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题

  3. 启用HSTS并加入HSTS Preload List让网站Https访问更加安全-附删除HSTS方法


一、Cloudflare自动拉黑恶意IP

1.1 找出恶意IP

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

  1. #/bin/bash

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

  3. logfile=/data/wwwlogs/

  4. last_minutes=1

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

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

  7. echo $start_time

  8. #结束时间现在

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

  10. echo $stop_time

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

  12. echo $cur_date

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

  14. 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

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

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

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

  18. for line in $ip

  19. do

  20. echo $line >> $logfile/black.txt

  21. echo $line

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

  23. done


1.2 批量添加IP到防火墙

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

  1. #!/bin/bash

  2. # Author: Zhys

  3. # Date : 2018

  4. # 填Cloudflare Email邮箱

  5. CFEMAIL="freehao123@gmail.com"

  6. # 填Cloudflare API key

  7. CFAPIKEY="xxxxxxxxxxxxxxxx"

  8. # 填Cloudflare Zones ID 域名对应的ID

  9. ZONESID="xxxxxxxxxxxxxxxxxxxx"

  10. # /data/wwwlogs/black.txt存放恶意攻击的IP列表

  11. # IP一行一个。

  12. IPADDR=$(</data/wwwlogs/black.txt)

  13. # 循环提交 IPs 到 Cloudflare 防火墙黑名单

  14. # 模式(mode)有 block, challenge, whitelist, js_challenge

  15. for IPADDR in ${IPADDR[@]}; do

  16. echo $IPADDR

  17. curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules"

  18. -H "X-Auth-Email: $CFEMAIL"

  19. -H "X-Auth-Key: $CFAPIKEY"

  20. -H "Content-Type: application/json"

  21. --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'

  22. done

  23. # 删除 IPs 文件收拾干净

  24. rm -rf /data/wwwlogs/black.txt


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

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

  1. #/bin/bash

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

  3. logfile=/data/wwwlogs/

  4. last_minutes=1

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

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

  7. echo $start_time

  8. #结束时间现在

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

  10. echo $stop_time

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

  12. echo $cur_date

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

  14. 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

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

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

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

  18. for line in $ip

  19. do

  20. echo $line >> $logfile/black.txt

  21. echo $line

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

  23. done

  24. # 填Cloudflare Email邮箱

  25. CFEMAIL="freehao123@gmail.com"

  26. # 填Cloudflare API key

  27. CFAPIKEY="xxxxxxxxxxxxxxxxxxxxxxxx"

  28. # 填Cloudflare Zones ID 域名对应的ID

  29. ZONESID="xxxxxxxxxxxxxxxxxxxxxxxxxxx"

  30. # /data/wwwlogs/black.txt存放恶意攻击的IP列表

  31. # IP一行一个。

  32. IPADDR=$(</data/wwwlogs/black.txt)

  33. # 循环提交 IPs 到 Cloudflare 防火墙黑名单

  34. # 模式(mode)有 block, challenge, whitelist, js_challenge

  35. for IPADDR in ${IPADDR[@]}; do

  36. echo $IPADDR

  37. curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules"

  38. -H "X-Auth-Email: $CFEMAIL"

  39. -H "X-Auth-Key: $CFAPIKEY"

  40. -H "Content-Type: application/json"

  41. --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'

  42. done

  43. # 删除 IPs 文件收拾干净

  44. rm -rf /data/wwwlogs/black.txt


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

  1. wget https://www.ucblog.net/shell/attack-ip.sh

  2. chmod +x /qicmd/cfblockip.sh

  3. ./cfblockip.sh

  4. wget https://www.ucblog.net/shell/attack-ip.sh

  5. chmod +x /qicmd/attack-ip.sh

  6. ./attack-ip.sh

  7. wget https://www.ucblog.net/shell/cf-block-attack-ip.sh

  8. chmod +x /qicmd/cf-block-attack-ip.sh

  9. ./cf-block-attack-ip.sh


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

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


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

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

网站:

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


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

  1. #下载

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

  3. #打开Cloudflare.sh,修改配置

  4. API_KEY You're Global API Key (https://dash.cloudflare.com/profile)

  5. MAIL_ACCOUNT Email of your Cloudflare account

  6. DOMAIN Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

  7. #设置定时任务

  8. crontab -e

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

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


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

完整的脚本代码如下:

  1. #!/bin/bash

  2. # $1 = 1min, $2 = 5min, $3 = 15min

  3. loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')

  4. # load is 10, you can modify this if you want load more than 10

  5. maxload=10

  6. # Configuration API Cloudflare

  7. # You're Global API Key (https://dash.cloudflare.com/profile)

  8. api_key=

  9. # Email of your account Cloudflare

  10. email=

  11. # Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)

  12. zone_id=

  13. # create file attacking if doesn't exist

  14. if [ ! -e $attacking ]; then

  15. echo 0 > $attacking

  16. fi

  17. attacking=./attacking

  18. hasattack=$(cat $attacking)

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

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

  21. # Active protection

  22. echo 1 > $attacking

  23. curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level"

  24. -H "X-Auth-Email: $email"

  25. -H "X-Auth-Key: $api_key"

  26. -H "Content-Type: application/json"

  27. --data '{"value":"under_attack"}'

  28. fi

  29. else

  30. if [[ $hasattack = 1 && $1 = 1 ]]; then

  31. # Disable Protection

  32. echo 0 > $attacking

  33. curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level"

  34. -H "X-Auth-Email: $email"

  35. -H "X-Auth-Key: $api_key"

  36. -H "Content-Type: application/json"

  37. --data '{"value":"high"}'

  38. fi

  39. fi

  40. exit 0


三、总结

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

Cloudflare防护也有一定的问题,那就是启用了Cloudflare后获取到用户的IP都是Cloudflare CDN节点的IP,我们还需要在服务器配置中做进一步的优化。
    A+
发布日期:2019年3月22日  所属分类: 实用技术
标签: