Fail2Ban 是一个用于保护服务器的安全工具。它会扫描系统日志,识别多次认证失败、爆破登录、异常访问等行为,然后临时封禁对应 IP。
项目地址:https://github.com/fail2ban/fail2ban
它最常见的用途是保护 SSH。比如某个 IP 在短时间内多次尝试错误密码,Fail2Ban 可以自动把这个 IP 加入防火墙规则,阻止它继续连接。
工作原理
Fail2Ban 的核心逻辑很简单:
- 读取服务日志,比如
/var/log/auth.log或 systemd journal。 - 使用 filter 匹配失败登录、认证错误等日志模式。
- 达到阈值后触发 jail 规则。
- 调用 firewall backend 封禁 IP。
- 到达封禁时间后自动解封。
它不是用来替代强密码、密钥登录或双因素认证的工具,而是降低暴力扫描和重复攻击的噪音。
安装
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。