fail2ban核心是实时解析ssh认证日志、匹配失败模式后调用防火墙自动封禁,依赖日志路径准确(如ubuntu用/auth.log、centos用/secure)、配置置于jail.local、合理设maxretry=3、findtime=10m、bantime=1h,并需匹配实际防火墙后端验证生效。

核心是用 fail2ban 实时解析 SSH 认证日志,匹配失败模式后调用防火墙自动封禁。它不依赖人工响应,而是靠日志+规则+动作三者联动,在攻击发生几秒内完成拦截。
确保 fail2ban 正确监听真实日志路径
fail2ban 不会“自己猜”日志在哪,必须手动对齐:
- Ubuntu/Debian 系统:logpath = /var/log/auth.log
- RHEL/CentOS/Rocky 8+:logpath = /var/log/secure
- 若启用了 journald 且未落盘日志,需改 backend = systemd,并确认 journalctl -u ssh | grep "Failed" 能看到记录
- 配置写在 /etc/fail2ban/jail.local 中,不要改 jail.conf,避免升级覆盖
设置合理触发阈值防误封也防漏判
大规模扫描常表现为短时间高频、多 IP、低重试次数(如每个 IP 只试 3–5 次就换),因此参数要兼顾灵敏与稳健:
- maxretry = 3:3 次失败即响应,适合识别扫段行为
- findtime = 10m:10 分钟滑动窗口,比固定周期更适应持续性扫描
- bantime = 1h:封 1 小时足够打断自动化脚本节奏;可设为 86400(1 天)或 -1(永久)应对已确认恶意 IP
- ignoreip = 127.0.0.1/8 ::1 203.0.113.55:务必填入你日常管理的公网或跳板机 IP,防止被锁死
匹配实际防火墙后端并验证封禁生效
fail2ban 只是“发号施令”,真正拦住连接的是底层防火墙。常见失灵原因就是动作没执行成功:
- 查当前用的封禁方式:sudo fail2ban-client get sshd banaction
- 若返回 iptables-multiport,但系统无 iptables 命令 → 安装 sudo apt install iptables(Debian)或 sudo dnf install iptables(RHEL)
- 若返回 firewallcmd-ipset(firewalld 场景),但 firewalld 未运行 → 启动 sudo systemctl start firewalld
- 云服务器(如 AWS EC2、阿里云 ECS)通常禁用本地 iptables,此时需改用自定义 action 调用 API,或直接依靠安全组+fail2ban 日志告警做人工干预
- 验证是否真封了:sudo iptables -L f2b-sshd -n(iptables)或 sudo nft list chain inet fail2ban filter_input | grep sshd(nftables)
配合基础加固提升整体防护水位
fail2ban 是“最后一道自动防线”,不是万能补丁。必须前置降低攻击面:
- 把 SSH 改到高位端口(如 22222),可过滤掉 90% 的通用扫描器
- 关闭密码登录:PasswordAuthentication no,强制使用密钥认证
- 禁止 root 远程登录:PermitRootLogin no,只允许普通用户 + sudo
- 限制可登录用户:AllowUsers deploy admin,缩小攻击目标范围











