它是一款 Linux 系统下的入侵防御工具,核心作用是监控系统日志、识别恶意访问行为,并自动封禁对应的 IP 地址,常用于保护 SSH、FTP、Web 服务等。
一、核心工作原理
二、安装与基础配置(以 Debian/Ubuntu 为例)
1. 安装 Fail2ban
bash
运行
sudo apt update
sudo apt install fail2ban -y
2. 启动并设置开机自启
bash
运行
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
3. 核心配置文件说明
| /etc/fail2ban/fail2ban.conf | 全局配置(日志级别、默认封禁时长等,一般无需修改) |
| /etc/fail2ban/jail.conf | 预设规则模板(包含 SSH、Apache 等服务的默认配置) |
| /etc/fail2ban/jail.d/ | 自定义规则目录(推荐在此新建 .conf 文件覆盖默认配置,避免修改 jail.conf) |
三、快速配置 SSH 防护(最常用场景)
bash
运行
sudo nano /etc/fail2ban/jail.d/ssh.conf
ini
[sshd]
enabled = true # 开启防护
port = ssh # 防护的端口(默认22)
filter = sshd # 使用的规则过滤器(预设)
logpath = /var/log/auth.log # 监控的日志文件
maxretry = 3 # 最大失败次数
findtime = 600 # 统计时间窗口(10分钟)
bantime = 3600 # 封禁时长(1小时,0为永久封禁)
ignoreip = 127.0.0.1/8 # 忽略的IP(可添加自己的办公IP)
bash
运行
sudo systemctl restart fail2ban
四、常用命令
bash
运行
sudo fail2ban-client status sshd
bash
运行
sudo fail2ban-client set sshd unbanip 192.168.1.100
bash
运行
sudo fail2ban-client set sshd banip 192.168.1.100
五、常见问题与解决
- 封禁后无法访问自己的 IP:在 ignoreip 中添加自己的 IP,或者手动执行解封命令。
- 服务不生效:检查日志路径是否正确、防火墙是否正常运行(如 iptables -L 查看规则)。
- 适配不同防火墙:默认用 iptables,如需用 ufw,需在 jail.conf 中设置 banaction = ufw。
这份配置针对 Web 登录页面暴力破解(如 WordPress 后台、自定义登录页)和 404 洪水攻击,分别适配 Nginx 和 Apache 服务。
前置条件
一、 Nginx 防护配置
场景 1:防护 WordPress 登录页(wp-login.php)
bash
运行
sudo nano /etc/fail2ban/jail.d/nginx-wordpress.conf
ini
[nginx-wp-login]
enabled = true
port = http,https # 同时防护80和443端口
filter = nginx-wp-login # 对应filter目录下的规则文件
logpath = /var/log/nginx/access.log # Nginx访问日志路径,根据实际情况修改
maxretry = 5 # 5次失败尝试
findtime = 900 # 15分钟内
bantime = 3600 # 封禁1小时
ignoreip = 127.0.0.1/8 # 忽略本地IP,可添加自己的办公IP
bash
运行
sudo nano /etc/fail2ban/filter.d/nginx-wp-login.conf
写入以下内容(匹配 wp-login.php 的 403/401 错误):
ini
[Definition]
failregex = ^<HOST> -.*GET /wp-login.php.* (403|401)
ignoreregex =
场景 2:防护通用 Web 登录页(自定义 401 错误)
如果是自研登录页,以返回 401 Unauthorized 为例:
ini
[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 3
findtime = 600
bantime = 7200
ignoreip = 127.0.0.1/8
ini
[Definition]
failregex = ^<HOST> -.*POST /login.* 401
ignoreregex =
二、 Apache 防护配置
场景 1:防护 WordPress 登录页
bash
运行
sudo nano /etc/fail2ban/jail.d/apache-wordpress.conf
写入内容:
ini
[apache-wp-login]
enabled = true
port = http,https
filter = apache-wp-login
logpath = /var/log/apache2/access.log # Apache默认日志路径,根据实际修改
maxretry = 5
findtime = 900
bantime = 3600
ignoreip = 127.0.0.1/8
bash
运行
sudo nano /etc/fail2ban/filter.d/apache-wp-login.conf
写入正则匹配规则:
ini
[Definition]
failregex = ^<HOST> -.*GET /wp-login.php.* (403|401)
ignoreregex =
场景 2:防护 404 洪水攻击
针对大量请求不存在页面的攻击行为:
ini
[apache-404]
enabled = true
port = http,https
filter = apache-404
logpath = /var/log/apache2/access.log
maxretry = 20 # 短时间内20次404触发封禁
findtime = 300 # 5分钟窗口
bantime = 3600
ignoreip = 127.0.0.1/8
ini
[Definition]
failregex = ^<HOST> -.* 404
ignoreregex =
三、 生效与验证步骤
bash
运行
sudo systemctl restart fail2ban
bash
运行
# 查看所有启用的jail
sudo fail2ban-client status
# 查看某个具体规则的封禁IP(以nginx-wp-login为例)
sudo fail2ban-client status nginx-wp-login
四、 常见问题解决
- 检查日志路径是否正确:cat /var/log/nginx/access.log 确认日志正常生成
- 验证正则规则:fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-wp-login.conf
- 在 ignoreip 中添加该 IP
- 手动解封:sudo fail2ban-client set nginx-wp-login unbanip 你的IP


