技术指南

Fail2ban 上线指南:验证封禁而不锁死 SSH

在保留带外恢复和第二会话的前提下配置 Fail2ban,验证日志匹配、封禁与精确解封。

Fail2ban 读取认证日志,在同一来源反复失败时调用防火墙动作临时封禁。它能降低暴力尝试噪声,却不能修复弱密码、暴露的管理面、失效日志或已经被盗的密钥。部署顺序应是先收紧 SSH 和账号权限,再确认日志链路,最后用 Fail2ban 增加自动响应。

先避免把自己锁在门外

  • 确认 SSH 密钥登录可用,并在第二个终端保持已验证会话。
  • 准备云厂商串行控制台、VNC 或救援模式等带外入口。
  • 记录实际 SSH 端口、日志来源和当前防火墙后端。
  • 把固定管理地址加入 ignoreip 前先确认它不会被多人共享或频繁变化。

用 .local 覆盖而不是改 jail.conf

Fail2ban 项目的默认 `jail.conf` 明确建议把自定义放进 `jail.local` 或 `jail.d/*.local`,因为发行版升级可能覆盖默认文件。下面只启用 sshd jail,并采用保守阈值。日志后端、端口和 banaction 必须按当前发行版检查,不能从另一台机器照搬。

/etc/fail2ban/jail.d/sshd.local 示例
[DEFAULT]
# 替换为经过确认的管理网段;不要保留示例地址
ignoreip = 127.0.0.1/8 192.0.2.10
bantime = 10m
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port = ssh

先测试配置和日志匹配

Fail2ban 项目建议通过 `fail2ban-client` 与服务交互。先做配置测试,再重载服务并查看 jail 状态。测试失败时保留现有 SSH 会话,检查 systemd journal 或认证日志是否真的包含失败事件;日志路径错误时,封禁规则不会按预期工作。

配置测试、重载和状态检查
sudo fail2ban-client -t
sudo systemctl reload fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

做一次受控验证

  • 从非管理测试地址产生少量失败登录,不要对生产账号进行高并发尝试。
  • 确认 sshd jail 的失败计数和封禁列表变化,防火墙中出现对应动作。
  • 确认管理地址仍可连接,并验证合法密钥登录没有被错误计数。
  • 等待 bantime 后确认自动解封,检查日志时间、时区和轮转后仍持续匹配。

误封恢复

优先从仍在线的管理会话或带外控制台确认被封 IP 和 jail,再执行精确解封。不要清空整个防火墙,也不要永久停用所有保护来解决单个误封。解封后修正 ignoreip、日志过滤或代理后的真实来源识别,再重新测试。

将示例地址替换为确认被误封的单个地址
sudo fail2ban-client set sshd unbanip 192.0.2.10
sudo fail2ban-client status sshd

Fail2ban 之外仍要完成

  • 关闭密码登录和不需要的 root 远程登录,使用独立密钥并及时撤销离职/泄露密钥。
  • 在云防火墙限制管理端口来源,减少到达主机的攻击面。
  • 为认证异常、服务停止和封禁激增建立告警;Fail2ban 进程退出不能静默。
  • 定期检查发行版的过滤器与防火墙后端变化,升级后重复日志匹配测试。

返回知识库