Fail2ban需日志、规则、防火墙协同生效;先确认SSH失败日志存在且路径正确(Ubuntu为/var/log/auth.log,CentOS为/var/log/secure),再安装启用,通过jail.local配置maxretry=1、bantime=1d实现“错一次封一天”,最后reload并验证iptables/nftables规则及ban状态。

Fail2ban 能自动封禁 SSH 密码试错的恶意 IP,但不是装完就生效——它依赖日志识别、规则匹配和防火墙执行三者协同。关键在于配置准确、路径对得上、命令能跑通。
确认 SSH 日志真实存在且含失败记录
Fail2ban 只能处理写进日志里的内容。Ubuntu/Debian 默认记在 /var/log/auth.log,CentOS/RHEL 默认是 /var/log/secure。先验证:
- 查看当前日志位置:
sudo grep -r "auth.*log\|secure" /etc/ssh/sshd_config /etc/rsyslog.conf 2>/dev/null - 检查有没有失败条目:
sudo tail -20 /var/log/auth.log | grep "Failed password"(Ubuntu)或sudo tail -20 /var/log/secure | grep "Failed"(CentOS) - 若无输出,说明日志没开启失败记录。需确保
/etc/rsyslog.conf中有authpriv.* /var/log/secure(RHEL)或对应auth.* /var/log/auth.log(Debian),然后重启服务:sudo systemctl restart rsyslog && sudo systemctl restart sshd
安装并启用 Fail2ban
- Ubuntu/Debian:
sudo apt update && sudo apt install fail2ban -y sudo systemctl enable --now fail2ban
- CentOS/RHEL(含 Rocky):
sudo yum install epel-release -y && sudo yum install fail2ban -y # 或 dnf(RHEL 8+):sudo dnf install fail2ban -y sudo systemctl enable --now fail2ban
配置 jail.local 实现“错一次封一天”
不要改 jail.conf,用 /etc/fail2ban/jail.local 或 /etc/fail2ban/jail.d/sshd.local:
cat > /etc/fail2ban/jail.local << 'EOF' [DEFAULT] ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 # 加入你信任的管理网段 loglevel = 3 logencoding = auto [sshd] enabled = true filter = sshd backend = systemd # 如果用 journalctl;否则设为 auto 或 polling findtime = 1d maxretry = 1 bantime = 1d port = ssh EOF
-
maxretry = 1表示只要在 1 天内出现 1 次失败就触发封禁 -
backend = systemd适用于默认使用journalctl记录 SSH 的系统(如较新 Ubuntu);若日志写文件,可改为auto并确保logpath正确(如logpath = /var/log/auth.log)
保存后必须重载:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
sudo systemctl reload fail2ban
验证封禁是否真生效
- 查看服务状态:
sudo systemctl status fail2ban - 查看 SSH 监狱状态:
sudo fail2ban-client status sshd(应显示Currently banned: X) - 检查 iptables/nftables 是否加了规则:
- iptables:
sudo iptables -L INPUT -n | grep f2b-sshd - nftables:
sudo nft list chain inet fail2ban filter_input 2>/dev/null | grep sshd
- iptables:
- 若规则为空,检查
banaction:sudo fail2ban-client get sshd banaction,再确认对应命令(iptables或nft)是否已安装并可用
误封可手动解封:
sudo fail2ban-client set sshd unbanip 203.0.113.42
不复杂但容易忽略细节。

















