适用场景与准备工作
把服务器放到公网上,SSH 的 22 端口几乎立刻就会开始被扫描:安全日志里刷屏的 "Failed password for root/invalid user" 记录,就是暴力破解的典型特征。Fail2ban 的作用是实时监控系统日志,发现某个 IP 在短时间内多次登录失败后,自动调用防火墙把它封禁一段时间,把"发现攻击再手动封 IP"变成自动化。它是站长最基础、也最容易被忽视的一道自动防护,尤其适合没有专职运维的个人服务器和中小企业服务器。
开始之前需要准备:一台 Linux 服务器(CentOS、Rocky Linux、AlmaLinux、Debian、Ubuntu 均可)、root 或 sudo 权限、确认自己的管理 IP(办公网或家庭宽带出口 IP,可在浏览器搜索"IP"查看)。建议同时保留云厂商控制台的 VNC 或救援模式作为兜底登录方式,防止配置失误把自己关在门外。重要提醒:防火墙相关配置存在误封风险,操作前先备份原配置文件,并评估对业务的影响;如果是生产环境服务器,强烈建议先在一台测试机上完整走一遍流程。
第一步:安装 Fail2ban
Fail2ban 在多数发行版中都可以直接通过包管理器安装。CentOS、RHEL、Rocky Linux、AlmaLinux 需要先启用 EPEL 软件源,因为 Fail2ban 不在基础仓库中:
# CentOS / RHEL / Rocky Linux / AlmaLinux
dnf install -y epel-release
dnf install -y fail2ban
Debian 和 Ubuntu 则直接安装即可:
# Debian / Ubuntu
apt update
apt install -y fail2ban
安装完成后,执行 fail2ban-client --version 确认版本。不同发行版默认集成的版本和内置 jail 略有差异,具体参数以本机版本和 Fail2ban 官方文档为准,本文涉及的配置项均为长期稳定的通用选项。
第二步:配置 SSH 防护策略
Fail2ban 的配置目录是 /etc/fail2ban/,其中 jail.conf 是官方默认文件,软件升级时可能被覆盖,因此约定俗成的做法是不修改它,而是把自定义配置写入 /etc/fail2ban/jail.local,后者的优先级高于 jail.conf。
用编辑器创建 /etc/fail2ban/jail.local,写入以下内容:
[DEFAULT]
# 白名单 IP,务必填入自己的管理 IP,多个用空格分隔
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
# 封禁时长
bantime = 10m
# 统计时间窗口
findtime = 10m
# 窗口内容许的最大失败次数
maxretry = 5
[sshd]
enabled = true
几个关键参数的含义:bantime 是单次封禁的时长;findtime 是统计失败次数的时间窗口;maxretry 是窗口内允许的最大失败次数,超过即触发封禁;ignoreip 是永不封禁的白名单,一定要填入自己的管理 IP,这是避免把自己锁在门外的关键。稳妥的做法是先把 bantime 设为 10 分钟到 1 小时,观察几天确认没有误伤正常用户后,再逐步延长。
部分最小化安装的系统没有 rsyslog,/var/log/secure 或 /var/log/auth.log 并不存在,此时 jail 会因找不到日志而无法启动。遇到这种情况,在 [sshd] 段中显式指定 backend = systemd,让 Fail2ban 直接从 systemd journal 读取 SSH 日志即可。
如果希望让"被封了又回来"的 IP 受到更严厉的惩罚,可以参考官方 recidive 示例配置长效封禁,追加到 jail.local 末尾:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 1w
findtime = 1d
maxretry = 5
它的含义是:同一个 IP 在一天内被 Fail2ban 封禁达到 5 次,就升级为封禁一周。bantime 的时长可以根据服务器承受的攻击强度调整。

第三步:启动服务并验证防护效果
配置完成后,启动服务并设置开机自启:
systemctl enable --now fail2ban
systemctl status fail2ban
随后用 fail2ban-client 查看 jail 是否正常运行:
# 查看已启用的 jail 列表,正常应看到 sshd
fail2ban-client status
# 查看 sshd jail 的详细状态:当前封禁的 IP、历史封禁数、失败次数
fail2ban-client status sshd
验证防护是否生效有两种常用方式。第一种是用另一台机器故意输错 SSH 密码,次数超过 maxretry 后观察该 IP 是否出现在封禁列表中;第二种是用 fail2ban-regex 测试过滤器能否正确匹配日志中的失败记录:fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/sshd.conf(Debian/Ubuntu 的日志路径为 /var/log/auth.log)。日常管理中,手动封禁和解封的命令分别是 fail2ban-client set sshd banip 1.2.3.4 和 fail2ban-client set sshd unbanip 1.2.3.4;每次修改配置后,执行 systemctl restart fail2ban 或 fail2ban-client reload 使配置生效。
验证期间有一个细节要注意:保持一个已经登录的 SSH 会话不要关闭。万一配置有误把自己封了,还能通过这个会话或云控制台的 VNC 执行解封命令,不至于彻底失去服务器控制权。
常见问题(FAQ)
1. 执行 fail2ban-client status 看不到 sshd,怎么办?说明 jail 没有成功启动,多数是配置语法问题。查看 /var/log/fail2ban.log 中的报错信息,常见原因是 jail.local 中分节名拼写错误、enabled 的取值写法不对,或文件没有放在 /etc/fail2ban/ 目录下。修正后执行 systemctl restart fail2ban 再观察。
2. 服务启动失败,提示日志文件不存在?这是最小化安装系统缺少 rsyslog 导致的。在前文的 [sshd] 配置段中加入 backend = systemd,或把 logpath 指向系统中真实存在的日志文件。判断标准很简单:用 journalctl 或 tail 能查到 sshd 的登录失败日志,Fail2ban 就能读到。
3. 自己的 IP 被误封了怎么处理?通过云厂商控制台的 VNC 或救援模式登录服务器,执行 fail2ban-client set sshd unbanip 你的IP 解封,然后检查 jail.local 的 ignoreip 是否包含了管理 IP。在延长 bantime 之前,建议先连续几天用 fail2ban-client status sshd 观察封禁记录,确认没有正常用户被误伤。
4. IP 已经在封禁列表,为什么还能连上服务器?按顺序排查三层:先用 fail2ban-client status sshd 确认该 IP 确实处于封禁状态;再检查防火墙规则是否真正写入,执行 iptables -L -n 或 firewall-cmd --list-rich-rules 查看是否有对应的 DROP/REJECT 规则;最后检查云厂商控制台的安全组,安全组位于 Fail2ban 管不到的外层,如果安全组放行了该 IP 的 22 端口,封禁规则就不会生效,需要在控制台同步调整。
总结
Fail2ban 的核心价值是把重复的防护动作自动化:一次配置,长期生效。按照本文的流程——安装软件、编写 jail.local、配置 ignoreip 白名单、启动验证——即可为服务器加上第一道自动防护,日志里刷屏的暴力破解记录会明显减少。
最后强调两点:其一,Fail2ban 是基础防护而非万能方案,不能替代 SSH 密钥登录、强密码、系统及时更新和最小化端口暴露,这些措施应当配合使用;其二,凡涉及防火墙和登录通道的配置都存在误封风险,操作前备份配置、保留兜底登录方式、拿不准的参数以官方文档为准,才是稳妥的运维习惯。












暂无评论内容