## 适用场景
网站一上线,日志里立刻热闹起来:爆破后台路径的、扫已知漏洞的、撞 SSH 密码的,来自全球各地的 IP 轮番试探。手工看日志封 IP 永远追不上节奏,fail2ban 把这件事自动化:它持续盯日志,按规则匹配失败特征,同一来源超阈值就调用防火墙封禁一段时间,到期自动解封。整套机制不需要改业务代码,是恶意扫描的标准应对。顺云云服务器装好系统后建议尽早部署。
## 两个 jail 配置示例
配置写在 jail.local,不要直接改 jail.conf,那是软件自带的默认文件,升级会被覆盖。SSH 防爆破的最小配置:
[sshd] enabled = true maxretry = 5 findtime = 600 bantime = 3600
含义:十分钟内失败五次,封一小时。网站侧再配一个盯着 Nginx 日志的规则,比如后台路径的 401 与 403:
[nginx-auth] enabled = true filter = nginx-auth logpath = /var/log/nginx/error.log maxretry = 3 findtime = 300 bantime = 7200
内置的 nginx 系过滤器覆盖认证失败、恶意爬虫指纹、首页爆破等常见模式,按需启用即可;有自定义攻击特征时写一个过滤器文件配正则,几行就能接入。
## 白名单保命
封禁规则最大的风险是把自己锁在门外:输错几次密码、脚本调试连续失败,管理员 IP 被封只能干瞪眼。所以每个 jail 都配 ignoreip,把办公出口 IP 与常用跳板地址写进去:
ignoreip = 127.0.0.1/8 办公网出口IP
出口 IP 不固定的团队,至少把稳定的服务器互访网段加上,保底有一条路能进去。远程办公入口多的话,把 maxretry 稍微放宽、依赖更长的观察窗口,宁可慢一点也不误伤自己人。
## 验证与运维
上线前先验证:fail2ban-client status 看 jail 列表与计数,故意输错密码触发一次封禁,确认防火墙规则里出现封禁链,再手工解封走一遍流程。日常用 fail2ban-client status sshd 查看当前被封列表,被封 IP 的地理分布与频次本身就是威胁情报。封禁时长与阈值定期回顾:攻击者换 IP 很快,长期封禁意义有限,重点是挡住单点的高频爆破;真被大流量盯上,封禁只是辅助,升级到高防线路才是正解。