全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworksBGVM服务器主机交流
IP归属甄别会员请立即修改密码Sharktech防护
查看: 1416|回复: 9

【教程】CloudFlare+Fail2ban实现入门级CC防御

[复制链接]
发表于 2019-4-18 13:27:28 | 显示全部楼层 |阅读模式
本帖最后由 卡布奇诺 于 2019-4-19 17:06 编辑


Fail2ban的工作原理很简单:读取日志,使用正则表达式匹配IP地址,只要在规定时间内达到预先设置的访问次数,就会执行ban action。也可以设置在封禁一段时间之后,自动解除封禁。总之这是一款比较灵活的软件。

当我们没有使用CloudFlare的时候,通常会把匹配到的ip地址提交给本机的iptables,而使用了CloudFlare之后,我们就可以直接用api把IP地址提交给CloudFlare的防火墙。

下面简单说一下方法:

第一步,配置Nginx。Nginx在编译的时候一定要添加“--with-http_realip_module”模块,并且在http块或server块中引入“set_real_ip_from、real_ip_header”,这样才能把真实的访客IP传递进来。否则,日志里记录到的都是CloudFlare自己的IP。具体方法请看这篇文章:https://support.cloudflare.com/h ... %80%85%E7%9A%84-IP-

第二步,安装fail2ban。方法看这里:https://github.com/fail2ban/fail2ban,不要用apt/yum这些包管理器安装,包管理器中的版本太旧了,不支持ipv6。

第三步,配置fail2ban。

在“/etc/fail2ban”文件夹中新建“jail.local”文件,根据需要修改文件内容:
  1. [http-get-dos]
  2. enabled  = true
  3. filter   = http-get-dos
  4. action   = cloudflare-api
  5. logpath  = /home/wwwlogs/example.com.log    #Nginx日志位置
  6. maxretry = 60    #最大尝试次数
  7. findtime = 60    #设置多长时间(秒)内超过 maxretry 限制次数即被封锁
  8. bantime = 120    #非法 IP 被屏蔽时间(秒),-1 代表永远封锁
复制代码


在“/etc/fail2ban/action.d”文件夹中新建“cloudflare-api.conf”文件,修改文件最后三行:
  1. [Definition]
  2. actionstart =
  3. actionstop =
  4. actioncheck =
  5. actionban = curl -s -X POST "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules" \
  6.                  -H "X-Auth-Email: <cfuser>" \
  7.                  -H "X-Auth-Key: <cftoken>" \
  8.                  -H "Content-Type: application/json" \
  9.                  --data '{"mode":"block","configuration":{"target":"ip","value":"<ip>"},"notes":"CC Attack"}'
  10. actionunban = curl -s -X DELETE "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules/$( \
  11.                    curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<cfzoneid>/firewall/access_rules/rules?page=1&per_page=1&mode=block&configuration.target=ip&configuration.value=<ip>&match=all" \
  12.                    -H "X-Auth-Email: <cfuser>" \
  13.                    -H "X-Auth-Key: <cftoken>" \
  14.                    -H "Content-Type: application/json" | awk -F "[,:}]" '{for(i=1;i<=NF;i++){if($i~/'id'\042/){print $(i+1);}}}' | tr -d '"' | sed -e 's/^[ \t]*//' | head -n 1)" \
  15.               -H "X-Auth-Email: <cfuser>" \
  16.               -H "X-Auth-Key: <cftoken>" \
  17.               -H "Content-Type: application/json"
  18. [Init]
  19. name = default
  20. #上面的内容不需要修改,只需要改下面三行
  21. cfuser = CloudFlare注册邮箱
  22. cftoken = API KEY
  23. cfzoneid = CloudFlare Overview页的Zone ID
复制代码


在“/etc/fail2ban/filter.d”文件夹中新建“http-get-dos.conf”文件:
  1. [Definition]
  2. failregex = <HOST> -.*- .*HTTP/[123].* .* .*$
  3. ignoreregex =
复制代码



全部设置完成后,运行“fail2ban-client reload”重新加载配置文件。

说说这套系统的几个缺点:
第一就是CloudFlare的IP防火墙有延迟,新IP添加进去,大概半分钟左右才会生效。因此我建议在Nginx中设置limit_req_zone,防火墙生效之前能起到临时的防护。
第二,单位时间内的访问量一定要设置合理,网站第一次打开通常会加载大量静态文件,如果设置不合理,很可能会屏蔽正常访客。这里还有一个方法,就是在“http-get-dos.conf”文件中修改正则表达式,只匹配引起高负载的动态文件,这就需要各位自己发挥了。
第三,现在存在许多用户共用一个IP的情况,这就是为什么我说大站不要使用这个方法。当然,小博客无所谓啦。

最后,祝大家玩得愉快!

附上一个测试地址:测试完毕,删除(一分钟内访问超过60次会屏蔽10分钟,大家可以试一下)
发表于 2019-4-18 13:40:37 | 显示全部楼层
很牛逼,技术达人啊
发表于 2019-4-18 13:41:59 | 显示全部楼层
感谢分享

紫薯布丁
发表于 2019-4-18 13:42:44 来自手机 | 显示全部楼层
大佬,不用cdn本机屏蔽怎么操作?
发表于 2019-4-18 13:42:51 | 显示全部楼层
把自己屏蔽了
发表于 2019-4-18 18:13:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2019-4-18 18:24:28 | 显示全部楼层
宝塔里面不是有个防火墙 防御cc么
发表于 2019-4-18 18:31:08 | 显示全部楼层
fl20002 发表于 2019-4-18 13:42
大佬,不用cdn本机屏蔽怎么操作?


banaction = iptables-multiport

iptables就会直接reject-with-icmp-unreachable
 楼主| 发表于 2019-4-18 20:23:16 | 显示全部楼层
fl20002 发表于 2019-4-18 13:42
大佬,不用cdn本机屏蔽怎么操作?

本机防御还是CCKiller比较简单
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|全球主机交流论坛

GMT+8, 2020-4-5 21:31 , Processed in 0.948456 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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