fail2ban配合cloudflare cdn使用

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

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

问题一: 如何让fail2ban获取真实IP

想要通过fail2ban来封禁ip, 那么先要获取到用户(或黑客)的ip, 如果不进行处理, 那么大概率你获取到的是cloudflare请求你用的ip, 封禁这个ip是没有意义的…

我的服务架构是 cloudflare –> nginx –> 后端服务

在nginx上面配置

server {
  ...

  # 这里设置一下Real_IP变量, 用于存储真实IP
  set $Real_IP $http_x_forwarded_for;


  # 设置代理 Header
  proxy_set_header X-Real-IP $Real_IP;

  location / {
    proxy_pass http://xxx;
  }
}

后端也要配置打印在日志里的ip字段为 X-Real-IP, 如果读取的是Nginx日志, 那配置一下Nginx的日志格式即可.

问题2: 封禁了用户ip, 但是请求是通过cloudflare请求过来的, 封禁没有效果

可以使用jail配置

[vaultwarden]
enabled = true
filter = vaultwarden
logpath = /home/ubuntu/quickstart/vaultwarden/vaultwarden_data/vaultwarden.log
maxretry = 5
bantime = 1d
findtime = 1h
action = cloudflare

修改cloudflare 的action配置

/etc/fail2ban/action.d/cloudflare.conf

cftoken  =  cloudflare全局key
cfuser   =  你的邮箱

全部设置完成后,运行“fail2ban-client reload”重新加载配置文件,后续封禁是在cloudflare上封禁的, 可以在WAF-工具 查看。

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

posted @ 2024-07-22 01:31  xiaobingch  阅读(94)  评论(0编辑  收藏  举报