Ubuntu Fail2ban 配置速查
Fail2ban 自动封禁暴力破解 SSH 的 IP。本速查针对已升级 OpenSSH 9.8+ 的服务器,核心配置仅需一次性写入 /etc/fail2ban/jail.d/custom.local,包含 sshd-session 兼容、逐级惩罚与惯犯监狱。
适用系统:Ubuntu 20.04 / 22.04 / 24.04(OpenSSH 9.8+,进程名为
sshd-session)
目录
1. 安装
sudo apt update && sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban # 确认 active (running)2. 一键配置(生产推荐)
2.1 设置变量
MGMT_IP="10.0.0.1" # 改为你的管理机 IP,支持 CIDR,多个用空格分隔
SSH_PORT="22" # 改为实际 SSH 端口2.2 写入完整配置
sudo tee /etc/fail2ban/jail.d/custom.local > /dev/null << EOF
# /etc/fail2ban/jail.d/custom.local
# 生产环境 Fail2ban 完整配置(适配 OpenSSH 9.8+ sshd-session)
[DEFAULT]
# ==================== 自定义白名单变量 =====================
project_management_ips = $MGMT_IP
# ===================== 基础行为参数 ========================
bantime = 10m
findtime = 30m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 %(project_management_ips)s
# ==================== 递增惩罚 + 随机时长 ===================
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 24w
bantime.rndtime = 10m
# ==================== sshd jail 专用配置 ===================
[sshd]
enabled = true
port = $SSH_PORT
backend = systemd
journalmatch = _SYSTEMD_UNIT=ssh.service
filter = sshd[_daemon=sshd(?:-session)?]
banaction = iptables-multiport
bantime.overalljails = true
# ==================== recidive 监狱(惯犯监狱) ===============
[recidive]
enabled = true
backend = auto
filter = recidive
logpath = /var/log/fail2ban.log
findtime = 1d
maxretry = 3
bantime = 12w
ignoreip = 127.0.0.1/8 ::1 %(project_management_ips)s
EOF2.3 检查语法并重载
sudo fail2ban-client -t && echo "语法正确"
sudo systemctl reload fail2ban
sudo fail2ban-client status预期输出包含:
Status
|- Number of jail: 2
`- Jail list: recidive, sshd
3. 验证与管理
3.1 查看 sshd jail 状态
sudo fail2ban-client status sshd预期输出示例:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=ssh.service
|- Actions
| |- Currently banned: 0
| |- Total banned: 0
| `- Banned IP list:
3.2 实时监控日志
sudo tail -f /var/log/fail2ban.log3.3 手动封禁/解封
# 封禁
sudo fail2ban-client set sshd banip 1.2.3.4
# 解封
sudo fail2ban-client set sshd unbanip 1.2.3.4
# 查询某 IP 是否被封
sudo fail2ban-client get sshd banned | grep 1.2.3.43.4 查看当前 iptables 规则
sudo iptables -L f2b-sshd -v -n4. 常见场景
场景 1:换项目时修改管理网段
sudo sed -i 's/^project_management_ips = .*/project_management_ips = 192.168.1.0\/24/' \
/etc/fail2ban/jail.d/custom.local
sudo systemctl reload fail2ban
sudo fail2ban-client get sshd ignoreip # 确认白名单已更新场景 2:修改 SSH 端口
sudo sed -i 's/^port\s*=.*/port = 2222/' /etc/fail2ban/jail.d/custom.local
sudo systemctl reload fail2ban
sudo fail2ban-client status sshd # 确认端口已变更场景 3:临时解除所有封禁
# 停止 fail2ban(自动清空 iptables 规则)
sudo systemctl stop fail2ban
# 重启后规则重新生效
sudo systemctl start fail2ban场景 4:测试封禁是否生效
从另一台机器故意输错密码 6 次:
# 在目标服务器上
sudo fail2ban-client status sshd
# 应看到 Currently failed 和 Currently banned 增加场景 5:查看某 IP 的封禁历史
zgrep "1.2.3.4" /var/log/fail2ban.log* | grep Ban5. 排查
| 现象 | 原因 | 解决 |
|---|---|---|
fail2ban-client status 只有 1 个 jail | [recidive] 配置有误 | 检查 backend = auto 是否设置 |
| 多次失败但未触发封禁 | _daemon 不匹配 OpenSSH 9.8+ | 确认 filter = sshd[_daemon=sshd(?:-session)?] |
journalmatch 报错 | systemd backend 未启用 | 确认 backend = systemd 且 journalctl -u ssh 有日志 |
| 封禁后仍能登录 | port 与实际 SSH 端口不一致 | 检查 `ss -tlnp |
| 重载后白名单未生效 | 语法错误或变量未展开 | fail2ban-client get sshd ignoreip 确认实际值 |
recidive 不工作 | backend = systemd 继承到 recidive | recidive 节必须显式设 backend = auto |
| 修改配置后未生效 | 未执行 reload | systemctl reload fail2ban,不要用 restart |
| 自己被封禁 | 管理 IP 未加白名单 | 从控制台/BMC 登录后解封并修正 ignoreip |