Fail2Ban 是一个用于保护服务器的安全工具。它会扫描系统日志,识别多次认证失败、爆破登录、异常访问等行为,然后临时封禁对应 IP。

项目地址:https://github.com/fail2ban/fail2ban

它最常见的用途是保护 SSH。比如某个 IP 在短时间内多次尝试错误密码,Fail2Ban 可以自动把这个 IP 加入防火墙规则,阻止它继续连接。

工作原理

Fail2Ban 的核心逻辑很简单:

  1. 读取服务日志,比如 /var/log/auth.log 或 systemd journal。
  2. 使用 filter 匹配失败登录、认证错误等日志模式。
  3. 达到阈值后触发 jail 规则。
  4. 调用 firewall backend 封禁 IP。
  5. 到达封禁时间后自动解封。

它不是用来替代强密码、密钥登录或双因素认证的工具,而是降低暴力扫描和重复攻击的噪音。

安装

Debian / Ubuntu:

sudo apt update
sudo apt install fail2ban

RHEL / Rocky Linux / AlmaLinux:

sudo dnf install fail2ban

Arch Linux:

sudo pacman -S fail2ban

安装后启用并启动服务:

sudo systemctl enable --now fail2ban

查看服务状态:

systemctl status fail2ban

配置 SSH 防护

不要直接修改 /etc/fail2ban/jail.conf,建议创建或修改 jail.local。这样升级软件包时不会覆盖自己的配置。

创建配置文件:

sudo vim /etc/fail2ban/jail.local

基础 SSH 配置示例:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port = ssh
backend = systemd

参数含义:

  • bantime:封禁时长。
  • findtime:统计失败次数的时间窗口。
  • maxretry:允许失败次数。
  • enabled:是否启用这个 jail。
  • backend:日志读取方式,使用 systemd 的系统可以设为 systemd

修改配置后重启:

sudo systemctl restart fail2ban

常用命令

查看 Fail2Ban 状态:

sudo fail2ban-client status

查看某个 jail 的状态:

sudo fail2ban-client status sshd

手动封禁 IP:

sudo fail2ban-client set sshd banip 203.0.113.10

手动解封 IP:

sudo fail2ban-client set sshd unbanip 203.0.113.10

查看日志:

sudo journalctl -u fail2ban

或者:

sudo tail -f /var/log/fail2ban.log

白名单

如果有固定办公 IP 或跳板机 IP,可以加入白名单,避免误封。

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.20

如果使用动态公网 IP,不建议随便把宽泛网段加入白名单。白名单范围越大,防护效果越弱。

注意事项

Fail2Ban 适合防御低成本扫描和暴力尝试,但不要只依赖它。

更稳妥的 SSH 安全基线:

  • 禁用 root 直接登录。
  • 使用 SSH key 登录。
  • 禁用密码登录。
  • 保持系统和 OpenSSH 更新。
  • 只开放必要端口。
  • 对管理入口做最小暴露。

示例 SSH 配置项:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

改 SSH 配置前,建议先保留一个已登录的 session,确认新连接可用后再断开旧连接,避免把自己锁在服务器外。

总结

Fail2Ban 是一层实用的服务器防护。它通过日志分析和防火墙封禁,减少 SSH、Web 服务、邮件服务等入口上的重复攻击。

对于公网 Linux 服务器,最小配置可以从 sshd jail 开始。后续如果部署了 Nginx、Apache、Postfix 等服务,再按需要增加对应 jail。