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
EOF

2.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.log

3.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.4

3.4 查看当前 iptables 规则

sudo iptables -L f2b-sshd -v -n

4. 常见场景

场景 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 Ban

5. 排查

现象原因解决
fail2ban-client status 只有 1 个 jail[recidive] 配置有误检查 backend = auto 是否设置
多次失败但未触发封禁_daemon 不匹配 OpenSSH 9.8+确认 filter = sshd[_daemon=sshd(?:-session)?]
journalmatch 报错systemd backend 未启用确认 backend = systemdjournalctl -u ssh 有日志
封禁后仍能登录port 与实际 SSH 端口不一致检查 `ss -tlnp
重载后白名单未生效语法错误或变量未展开fail2ban-client get sshd ignoreip 确认实际值
recidive 不工作backend = systemd 继承到 recidiverecidive 节必须显式设 backend = auto
修改配置后未生效未执行 reloadsystemctl reload fail2ban,不要用 restart
自己被封禁管理 IP 未加白名单从控制台/BMC 登录后解封并修正 ignoreip