泉州师范学院论坛

 找回密码
 注册会员

扫一扫,访问微社区

查看: 18|回复: 0

宝塔Nginx+Cloudflare+Shell实现识别CC攻击IP 并记录拉黑功能

[复制链接]
剑指寒江 发表于 2019-9-6 04:09:07 | 显示全部楼层 |阅读模式
现在使用NGINX的人越来越多,而且配合CLOUDFLARE来使用防御功能的人也越来越多。目前经常有人说正被CC攻击困扰。
CC攻击的请求就是制造大量访问请求让你服务器处理不过来,从而无法对外服务。
既然知道原理,那么我们来针对性的,把日志中的攻击IP识别出来,并提交给防火墙去拉黑处理

这里我们最好别用自己服务器的防火墙去处理这些拉黑IP的操作,因为这样一来服务器虽然把这些IP拉黑,但是实际攻击者还是到了你门外,只是被挡在外面而已,在砸门的过程,还是需要消耗你服务器资源。

因此我们这里配合业界鼎鼎大名的CLOUDFLARE,CF使用ANYCASE网络,天生无惧DDOS,剩下的CC,因为CF有个IP防火墙功能,因此可以通过批量提交IP数据给CF从而让CF的防火墙将这部分访问你服务器的恶意攻击IP屏蔽。


1、首先配置网站使用CLOUDFLARE

这个就不累述,可以直接官网注册使用,使用DNS接入,也可以使用第三方提供的CNAME接入方式


2、配置宝塔的NGINX识别真实访客IP

这里我们使用宝塔,因为这个配置比较简单,其实其他NGINX原理是一样的。为什么需要识别真实访客IP,因为加上CF的CDN后,访客的访问是这样的过程:访客-》CDN->你的服务器  这样在你服务器看来跟他产生握手连接的都是CDN的IP

幸好CF免费提供一个HEADER标头,会将访客->CDN  这一步的访客IP记录下来,并传递到你的服务器,这个标头是HTTP_CF_CONNECTING_IP

这里介绍过,过程有部分一样

NGINX配置获取CloudFlare 下的访客真实IP并记录到日志

需要修改NGINX的配置文件,宝塔的nginx配置文件存放位置与一般nginx不一样,宝塔nginx配置文件位置:/www/server/nginx/conf/nginx.conf;
一般nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf

在http部分
  1. http
  2.     {
  3. }
复制代码
部分增加
  1. log_format  main  '$HTTP_CF_CONNECTING_IP [$fmt_localtime] "$request" '
  2.                   '$status $body_bytes_sent "$http_referer" '
  3.                   '$http_user_agent $request_time';
  4.         map $host $fmt_localtime {
  5.         default '';
  6.         }

  7.        log_by_lua_block {
  8.        ngx.var.fmt_localtime = ngx.localtime();
  9.        }
复制代码

主要是为了方便时间的格式阅读,这里把Nginx默认的日志显示的时间格式也给改了。
然后在网站记录的日志定义使用main这个日志格式,比如:
access_log  /www/wwwlogs/www.bnxb.com.log main;
3、配置SHELL脚本来执行读取攻击IP信息,并记录入某个TXT文件


  1. #/bin/bash
  2. #日志文件
  3. logfile=/www/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/bnxb.com.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print $0}}'
  15. | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10
  16. ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
  17. ip=`cat $logfile/log_ip_top10 | awk '{if($1>60)print $2}'`
  18. # 单位时间[1分钟]内单ip访问次数超过60次的ip记录入black.log
  19. for line in $ip
  20. do
  21. echo $line >> $logfile/black.txt
  22. echo $line
  23. # 这里还可以执行CF的API来提交数据到CF防火墙
  24. done
复制代码
这样就获得了一份black.txt文件,这个文件一行一个IP,可以直接通过我们的cdn.bnxb.com的批量导入防火墙记录功能,将这个记录中的IP全部屏蔽访问

或者你也可以让服务器通过CLOUDFLARE的API将这些攻击IP封杀
代码修改完如下:
  1. #/bin/bash
  2. # CF邮箱CFEMAIL="XXX@XXX.com"
  3. # Cloudflare API key,通过官方获取
  4. CFAPIKEY="xxxxxxxxxxxxxxxx"
  5. # zoneid 每个域名都有一个独立的ID
  6. zoneid="xxxxxxxxxxxxxxxxxxxx"
  7. #日志文件
  8. logfile=/www/wwwlogs/
  9. last_minutes=1
  10. #开始时间1分钟之前(这里可以修改,如果要几分钟之内攻击次数多少次,这里可以自定义)
  11. start_time= date +"%Y-%m-%d %H:%M:%S" -d '-1 minutes'
  12. echo $start_time
  13. #结束时间现在
  14. stop_time=`date +"%Y-%m-%d %H:%M:%S"`
  15. echo $stop_time
  16. cur_date="`date +%Y-%m-%d`"
  17. echo $cur_date
  18. #过滤出单位之间内的日志并统计最高ip数
  19. tac
  20. $logfile/bnxb.com.log | awk -v st="$start_time" -v et="$stop_time"
  21. '{t=substr($2,RSTART+14,21);if(t>=st && t<=et) {print
  22. $0}}'
  23. | awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10
  24. ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
  25. ip=`cat $logfile/log_ip_top10 | awk '{if($1>60)print $2}'`
  26. # 单位时间[1分钟]内单ip访问次数超过60次的ip记录入black.log
  27. for line in $ip
  28. do
  29. echo $line >> $logfile/black.txt
  30. echo $line
  31. curl -s -X POST "https://api.cloudflare.com/client/v4/user/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":"'$line'"},"notes":"CC attatck"}'
  32. done
复制代码
注意,我这里已经改成使用CF的全局防火墙,也就是提交的IP封锁,将对账户下全部域名都有效。
如果只想对本域名有效,就将
  1. https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules
复制代码
change into
  1. https://api.cloudflare.com/client/v4/zones/$zoneid/firewall/access_rules/rules
复制代码





泉州师院论坛域名: www.Qzubbs.com 手机浏览器照样访问。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

关于我们|免责声明|学校风景|企业招聘|二手市场|违规帐号|手机论坛|手机论坛|京ICP备10001858号|广告联系

Copyright 1958-2018 泉州大学 泉州师范学院 - 相聚西岸阳光,相遇、相识、相知;一起邂逅骄傲,梦想,未来!

GMT+8, 2019-9-18 16:06 , Processed in 0.045482 second(s), 9 queries , Gzip On, MemCached On.

快速回复 返回顶部 返回列表