Fail2Ban 是一款由 Python 开发的入侵防御软件, 可以保护服务器免受暴力破解的攻击. Fail2Ban 可以扫描系统日志文件, 对异常登录过多的 IP 进行禁止. 自动更新防火墙规则 (比如 iptables), 在指定的时间内拒绝特定的 IP 地址的请求. 常用来防止暴力破解 SSH.
安装 Fail2Ban
# 对于 Ubuntu, Debian
sudo apt install -y fail2ban
# 对于 CentOS, Fedora
sudo yum install -y epel-release
sudo yum install -y fail2ban
# 开启 Fail2Ban 服务
systemctl enable --now fail2ban配置 Fail2Ban
Fail2Ban 默认的配置文件为 /etc/fail2ban/jail.conf.
通过 cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 生成自定义规则.
常见参数:
- enabled - 表示是否开启监控服务
- port - 监控服务的端口号
- filter - 启用的日志过滤器, 引用位于 /etc/fail2ban/filter.d 目录中的文件
- logpath - 监控服务的日志文件路径 (传统日志文件, 例如 /var/log/auth.log)
- backend - 日志后端 (例如 systemd, polling, auto)
- journalmatch - systemd 日志过滤条件 (可选, 不写也能用, 但更精确/省资源)
- ignoreip - 白名单 IP/网段 (忽略这些来源的失败记录)
- maxretry - 最大失败重试次数 (maxretry attempts)
- findtime - 统计失败次数的时间范围
- bantime - 禁止 IP 地址的持续时间 (支持 s/m/h/d, 也可直接写秒数)
防止 SSH 暴力破解
编辑 /etc/fail2ban/jail.local. 一般按日志来源选择: 有传统日志文件用 logpath, 只有 journald 则用 systemd backend.
下面给出两种常见写法, 选择其一即可.
1) 传统日志文件 (有 /var/log/auth.log 或 /var/log/secure)
[sshd]
enabled = true
# 当前 SSH 端口号
port = 22
filter = sshd
# Ubuntu/Debian
logpath = /var/log/auth.log
# CentOS/RHEL
# logpath = /var/log/secure
maxretry = 3 # 最大失败次数
findtime = 5m # 计数时间范围 (该时间内累计失败次数, 也可直接写秒数)
bantime = 1h # 封禁时长 (支持 s/m/h/d, 也可直接写秒数)2) systemd 日志 (精简系统或没有 auth.log 的情况更通用)
[sshd]
enabled = true
# 当前 SSH 端口号 (多端口可写多个)
port = 22,20000
filter = sshd
backend = systemd
maxretry = 3 # 最大失败次数
findtime = 5m # 计数时间范围 (该时间内累计失败次数, 也可直接写秒数)
bantime = 24h # 封禁时长 (支持 s/m/h/d, 也可直接写秒数)重启 Fail2Ban systemctl restart fail2ban, 使配置生效.
此时, 如果故意输错超过 maxretry 次, 该 IP 会被封禁, SSH 连接会被拒绝或超时, 需等 bantime 到期或手动解封后才能重试.
IP 白名单 (可选)
如果需要放行特定来源, 把 ignoreip 写到 /etc/fail2ban/jail.local 即可. 写在 [DEFAULT] 表示对所有 jail 生效, 写在 [sshd] 表示只对 SSH 生效. 支持单 IP、CIDR、IPv6, 多个条目用空格分隔. 示例:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16 10.0.0.0/8其他相关命令
# 查看生成的 iptables 规则, `Chain f2b-sshd` 为 Fail2Ban 生成的规则
iptables -nL
# 测试配置
fail2ban-client -t
# 查看 Fail2Ban 日志 (调试用)
tail -n15 /var/log/fail2ban.log
# 如果没有该文件, 可用:
# journalctl -u fail2ban -n 50 -f
# systemd 日志实时查看 (按需替换关键字)
journalctl -kf | grep "sshd"
# 重启/重载
systemctl restart fail2ban # 重启服务 (已封禁的 IP 可能会被清空)
systemctl reload fail2ban # 重新加载配置 (保留封禁列表)
# 查看全部 jail 列表与总览
fail2ban-client status
# 查看 `sshd` 服务的状态
fail2ban-client status sshd
# 手动删除/添加 Ban IP 规则
fail2ban-client set sshd unbanip x.x.x.x
fail2ban-client set sshd banip x.x.x.x结语
即使更改了 SSH 的默认端口, 也可能被扫描到. 关键还是用密钥登录或强密码, 并配合 Fail2Ban 做自动封禁.
另外, 如果系统有传统日志文件, 可以用 tail -f /var/log/auth.log 查看 SSH 登录日志.
如果是 systemd 日志, 则用 journalctl -fu ssh (Debian/Ubuntu) 或 journalctl -fu sshd (CentOS/RHEL).