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

2020年7月7日

一、Cloudflare自动拉黑恶意IP

1.1找出恶意IP

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

  1. #/bin/bash
  2. #日志文件,你需要改成你自己的路径
  3. logfile=/var/log/nginx/
  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/blog.world-alive.win-access.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>200)print $2}'`
  17. # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字
  18. # 记录下的IP需要进行过滤 , 以防误杀的情况;
  19. for line in $ip
  20. do
  21.     if [ $line = '127.0.0.1' ]; then
  22.         echo $line "This is while list"
  23.     else
  24.         echo $line >> $logfile/black.txt
  25.         echo $line
  26.     fi
  27.     # 这里还可以执行CF的API来提交数据到CF防火墙
  28. done

1.2批量添加IP到防火墙

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

  1. #!/bin/bash
  2. # Author:
  3. # Date : 2020
  4.  
  5. # 填Cloudflare Email邮箱
  6. CFEMAIL="*@gmail.com"
  7. # 填Cloudflare API key
  8. CFAPIKEY="***"
  9. # 填Cloudflare Zones ID 域名对应的ID
  10. ZONESID="***"
  11.  
  12. # /var/log/nginx/black.txt存放恶意攻击的IP列表
  13. # IP一行一个。
  14. IPADDR=$(
  15. # 循环提交 IPs 到 Cloudflare 防火墙黑名单
  16. # 模式(mode)有 block, challenge, whitelist, js_challenge
  17. for IPADDR in ${IPADDR[@]}; do
  18. echo $IPADDR
  19. curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  20. -H "X-Auth-Email: $CFEMAIL" \
  21. -H "X-Auth-Key: $CFAPIKEY" \
  22. -H "Content-Type: application/json" \
  23. --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
  24. done
  25.  
  26. # 删除 IPs 文件收拾干净
  27. rm -rf /data/wwwlogs/black.txt

 

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

 

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

  1. #/bin/bash
  2.  
  3. #日志文件,你需要改成你自己的路径
  4.  
  5. logfile=/var/log/nginx/
  6.  
  7. last_minutes=1
  8.  
  9. #开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
  10.  
  11. start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'
  12.  
  13. echo $start_time
  14.  
  15. #结束时间现在
  16.  
  17. stop_time=`date +"%Y-%m-%d %H:%M:%S"`
  18.  
  19. echo $stop_time
  20.  
  21. cur_date="`date +%Y-%m-%d`"
  22.  
  23. echo $cur_date
  24.  
  25. #过滤出单位之间内的日志并统计最高ip数,请替换为你的日志路径
  26.  
  27. tac $logfile/blog.world-alive.win-access.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
  28.  
  29. ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
  30.  
  31. ip=`cat $logfile/log_ip_top10 | awk '{if($1>200)print $2}'`
  32.  
  33. # 单位时间[1分钟]内单ip访问次数超过2次的ip记录入black.log,这里为了测试设置2,你需要改成其它的数字
  34.  
  35. for line in $ip
  36.  
  37. do
  38.     if [ $line = '127.0.0.1' ]; then
  39.         echo $line "This is while list"
  40.     else
  41.         echo $line >> $logfile/black.txt
  42.         echo $line
  43.     fi
  44.  
  45.     # 这里还可以执行CF的API来提交数据到CF防火墙
  46.  
  47. done
  48.  
  49. # 填Cloudflare Email邮箱
  50. CFEMAIL="[email protected]"
  51. # 填Cloudflare API key
  52. CFAPIKEY="3ea01ee35345eafdd19dcba46431171abbfe8"
  53. # 填Cloudflare Zones ID 域名对应的ID
  54. ZONESID="beace19622a33554b8164c07dc83d8a9"
  55.  
  56. # /var/log/nginx/black.txt存放恶意攻击的IP列表
  57. # IP一行一个。
  58. IPADDR=$(</var/log/nginx/black.txt)
  59.  
  60. # 循环提交 IPs 到 Cloudflare  防火墙黑名单
  61. # 模式(mode)有 block, challenge, whitelist, js_challenge
  62. for IPADDR in ${IPADDR[@]}; do
  63.     echo $IPADDR
  64.     curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONESID/firewall/access_rules/rules" \
  65.           -H "X-Auth-Email: $CFEMAIL" \
  66.             -H "X-Auth-Key: $CFAPIKEY" \
  67.               -H "Content-Type: application/json" \
  68.                 --data '{"mode":"block","configuration":{"target":"ip","value":"'$IPADDR'"},"notes":"CC Attatch"}'
  69. done
  70.  
  71. # 删除 IPs 文件收拾干净
  72. rm  -rf /var/log/nginx/black.txt

 

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

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

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

二、Cloudflare自动切换5秒盾脚本  (未测试)

网站: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.  
  4. #打开Cloudflare.sh,修改配置
  5. API_KEY You're Global API Key (https://dash.cloudflare.com/profile)
  6. MAIL_ACCOUNT Email of your Cloudflare account
  7. DOMAIN Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)
  8.  
  9. #设置定时任务
  10. crontab -e
  11.  
  12. */1 * * * * /root/DDoS/Cloudflare.sh 0 # check every 1 minute if protection is not enabled
  13. */20 * * * * /root/DDoS/Cloudflare.sh 1 # check every 20 minutes if protection is enabled

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

完整的脚本代码如下:

 
  1. #!/bin/bash
  2.  
  3.  
  4. # $1 = 1min, $2 = 5min, $3 = 15min
  5. loadavg=$(cat /proc/loadavg|awk '{printf "%f", $1}')
  6.  
  7.  
  8. # load is 10, you can modify this if you want load more than 10
  9. maxload=10
  10.  
  11.  
  12. # Configuration API Cloudflare
  13. # You're Global API Key (https://dash.cloudflare.com/profile)
  14. api_key=
  15. # Email of your account Cloudflare
  16. email=
  17. # Zone ID (https://dash.cloudflare.com/_zone-id_/domain.com)
  18. zone_id=
  19.  
  20.  
  21. # create file attacking if doesn't exist
  22. if [ ! -e $attacking ]; then
  23. echo 0 > $attacking
  24. fi
  25.  
  26. attacking=./attacking
  27.  
  28.  
  29. hasattack=$(cat $attacking)
  30.  
  31.  
  32. if [ $(echo "$loadavg > $maxload"|bc) -eq 1 ]; then
  33.  
  34. if [[ $hasattack = 0 && $1 = 0 ]]; then
  35.  
  36. # Active protection
  37. echo 1 > $attacking
  38. curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
  39. -H "X-Auth-Email: $email" \
  40. -H "X-Auth-Key: $api_key" \
  41. -H "Content-Type: application/json" \
  42. --data '{"value":"under_attack"}'
  43. fi
  44.  
  45. else
  46. if [[ $hasattack = 1 && $1 = 1 ]]; then
  47.  
  48. # Disable Protection
  49. echo 0 > $attacking
  50. curl -s -X PATCH "https://api.cloudflare.com/client/v4/zones/$zone_id/settings/security_level" \
  51. -H "X-Auth-Email: $email" \
  52. -H "X-Auth-Key: $api_key" \
  53. -H "Content-Type: application/json" \
  54. --data '{"value":"high"}'
  55. fi
  56. fi
  57.  
  58. exit 0

三、总结

Cloudflare是一个非常好用的防御DDos和CC攻击的工具,免费版本的Cloudflare结合API可以实现更加灵活的功能,对于普通的防御足够自己使用了。
Cloudflare防护也有一定的问题,那就是启用了Cloudflare后获取到用户的IP都是Cloudflare CDN节点的IP,我们还需要在服务器配置中做进一步的优化。

 

原文 https://www.yyob.com/300.html

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注