内容提要
本文介绍在CDN场景下为Vaultwarden配置fail2ban防暴力破解。通过Docker部署Vaultwarden并记录登录日志,配置fail2ban筛选失败IP,利用Nginx map文件实现封禁,在网关层阻断恶意请求,避免CDN隐藏源站导致iptables失效的问题。
延伸解读
CDN场景下iptables失效的替代方案
在CDN或WAF场景下,用户请求经过CDN节点转发,源站iptables无法直接封禁用户真实IP。本文通过fail2ban配合Nginx map文件,在网关层实现封禁,是一种有效的替代方案。这种思路也适用于其他需要基于真实IP进行访问控制的场景,如防止恶意爬虫或DDoS攻击。
日志配置与fail2ban的联动
Vaultwarden通过config.env设置日志级别为warn并指定日志文件,fail2ban读取该日志文件匹配失败登录记录。配置时需确保日志路径映射正确,且fail2ban的filter正则与日志格式匹配。若日志格式变化,需同步调整filter,否则可能导致封禁失效。
Nginx map封禁的注意事项
Nginx通过include map文件实现封禁,map文件由fail2ban动态更新并触发reload。需注意map文件路径与Nginx配置一致,且reload操作需确保Nginx配置正确。此外,使用RealIP模块从X-Forwarded-For获取真实IP时,需信任CDN的代理头,否则可能误封或漏封。
Q&A
在CDN环境下,为什么不能直接用iptables封禁暴力破解的IP?
因为用户请求经过CDN节点转发,源站看到的IP是CDN节点的IP,而不是用户的真实IP,所以iptables封禁用户IP无效。
如何在CDN场景下为Vaultwarden配置fail2ban来防止暴力破解?
通过Docker部署Vaultwarden并配置日志输出,然后配置fail2ban筛选登录失败日志,利用自定义action将封禁IP写入Nginx的map文件,并在Nginx配置中根据map文件返回403,从而在网关层阻断恶意请求。
Vaultwarden的Docker部署中,如何配置日志输出以便fail2ban读取?
在config.env中设置LOG_FILE=/log/vaultwarden.log和LOG_LEVEL=warn,并在docker-compose.yaml中将容器内的/log目录映射到宿主机的/var/log/vaultwarden/,这样登录失败日志会写入宿主机文件。
fail2ban的filter配置文件(如vaultwarden.local)的作用是什么?
filter配置文件用于定义从Vaultwarden日志中匹配登录失败IP的正则表达式,例如匹配'Username or password is incorrect'并提取IP地址。
fail2ban的action配置文件(如vaultwarden.local)是如何实现封禁的?
action配置文件定义了ban和unban操作,主要是将封禁IP以Nginx map格式写入指定的map文件(如vaultwarden_blocked_ips.map),然后执行Nginx reload使配置生效。
在Nginx配置中,如何利用map文件实现封禁用户IP?
在Nginx的http块中,使用map指令根据$remote_addr(用户真实IP)从map文件(vaultwarden_blocked_ips.map)中获取封禁标记,然后在location块中判断如果标记非空则返回403。
如何测试fail2ban是否成功封禁了暴力破解的IP?
可以通过Web界面连续输入3次错误密码,然后使用命令`fail2ban-client status vaultwarden`查看封禁状态,如果显示Banned IP list中包含该IP,则说明封禁成功。
如何手动封禁或解封某个IP?
使用命令`fail2ban-client set vaultwarden banip <IP>`封禁指定IP,使用`fail2ban-client set vaultwarden unbanip <IP>`解封。