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的情况,这就是为什么我说大站不要使用这个方法。当然,小博客无所谓啦。