什么是 Fail2Ban
Fail2Ban 是一个开源安全工具,通过分析系统日志(如 /var/log/auth.log)检测可疑行为——比如短时间内多次登录失败——然后自动更新防火墙规则,封禁攻击者的 IP 地址。
安装
# Debian/Ubuntu
apt-get install fail2ban -y
# CentOS/RHEL
yum install epel-release -y
yum install fail2ban -y
# 启动服务
systemctl start fail2ban
systemctl enable fail2ban
基础配置
创建本地配置文件(不要直接修改 jail.conf,升级时会被覆盖):
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 /etc/fail2ban/jail.local:
[DEFAULT]
# 封禁时长(秒),-1 表示永久封禁
bantime = 3600
# 检测时间窗口(秒)
findtime = 600
# 允许失败次数
maxretry = 5
# 白名单 IP(不会被封禁)
ignoreip = 127.0.0.1/8 192.168.1.0/24
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 3
保护 Nginx 认证
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
注意:需要在 Nginx 配置中启用 auth_basic 模块,Fail2Ban 才能检测到认证失败日志。
常用管理命令
# 查看整体状态
fail2ban-client status
# 查看 SSH 防护状态(包括已封禁 IP)
fail2ban-client status sshd
# 查看所有被封禁的 IP
fail2ban-client banned
# 手动封禁某个 IP
fail2ban-client set sshd banip 192.168.1.100
# 解封某个 IP
fail2ban-client set sshd unbanip 192.168.1.100
# 重新加载配置
fail2ban-client reload
验证效果
配置完成后,可以模拟暴力破解测试:
# 在另一台机器上连续输错密码 5 次
ssh user@target-server # 输错密码,重复 5 次
# 在目标服务器上查看是否被封禁
fail2ban-client status sshd
封禁后,攻击者的 IP 会出现在 Banned IP list 中,所有来自该 IP 的连接请求都会被防火墙丢弃。