配置 Fail2Ban 的 Jail 核心是定义监控规则、匹配条件和封禁动作 ,每个 Jail 对应一个防护场景(如 SSH、Apache),下面是 Ubuntu 系统下的分步实操指南,包含基础配置、参数详解和自定义案例。
一、Jail 配置的核心原则
- 不修改默认文件 :默认规则文件
/etc/fail2ban/jail.conf仅作参考,所有自定义配置放在/etc/fail2ban/jail.d/目录下,后缀为.conf,优先级更高。 - 一个场景一个 Jail :比如 SSH 防护单独写
sshd.conf,Apache 防护写apache.conf,便于管理。 - 配置结构固定 :每个 Jail 由 [Jail 名称] 开头,后跟参数键值对,格式为
参数 = 值。
二、Jail 核心参数详解(必配)
先搞懂每个参数的作用,才能灵活配置,以下是最常用的核心参数:
| 参数 | 作用 | 取值示例 | 关键说明 |
|---|---|---|---|
enabled |
是否启用该 Jail | true/false |
必须设为 true 才会生效 |
port |
防护的端口 | ssh/http,https/22,80,443 |
支持服务名或端口号,多个用逗号分隔 |
filter |
关联的过滤规则 | sshd/apache-auth |
对应 /etc/fail2ban/filter.d/ 下的规则文件 |
logpath |
监控的日志路径 | /var/log/auth.log |
支持通配符,如 /var/log/apache2/*.log |
maxretry |
最大失败次数 | 3/5 |
超过次数就触发封禁 |
bantime |
封禁时长(秒) | 3600/86400/-1 |
-1 表示永久封禁 |
findtime |
统计时间窗口(秒) | 600(10 分钟) |
比如 10 分钟内失败 3 次触发封禁 |
ignoreip |
白名单 IP / 网段 | 127.0.0.1 192.168.1.0/24 |
多个用空格分隔,不会被封禁 |
action |
触发后的动作 | %(action_)s/%(action_mw)s |
action_= 仅封禁;action_mw= 封禁 + 发邮件 |
三、基础配置案例:SSH 防护 Jail
SSH 是最常被暴力破解的服务,以此为例,手把手教你配置:
步骤 1:新建自定义 Jail 文件
bash
运行
sudo nano /etc/fail2ban/jail.d/sshd.conf
步骤 2:写入配置内容
ini
# 定义 Jail 名称,必须和 filter 名称对应(sshd)
[sshd]
# 启用该 Jail
enabled = true
# 防护的端口(ssh 对应 22 端口)
port = ssh
# 关联的过滤规则(/etc/fail2ban/filter.d/sshd.conf)
filter = sshd
# 监控的日志文件路径(SSH 日志默认路径)
logpath = /var/log/auth.log
# 15 分钟内(900秒)失败 3 次触发封禁
maxretry = 3
findtime = 900
# 封禁 24 小时(86400秒)
bantime = 86400
# 白名单:本地回环 + 内网网段
ignoreip = 127.0.0.1 192.168.0.0/24
# 动作:封禁 + 发送邮件告警(需安装 sendmail)
action = %(action_mw)s
# 邮件配置(可选)
sender = fail2ban@ubuntu-server.com
destemail = your-email@example.com
mta = sendmail
步骤 3:保存并生效配置
-
按
Ctrl+O→ 回车 →Ctrl+X保存退出。 -
重启 Fail2Ban 服务使配置生效: bash
运行
sudo systemctl restart fail2ban
步骤 4:验证配置是否生效
bash
运行
# 查看 sshd Jail 的状态
sudo fail2ban-client status sshd
输出包含 Jail list: sshd 和 Number of banned IPs: 0 即为配置成功。
四、进阶配置案例:自定义 Web 防护 Jail
针对 Web 服务的恶意扫描(如频繁 404 请求),自定义一个 Jail:
步骤 1:新建 Jail 文件
bash
运行
sudo nano /etc/fail2ban/jail.d/apache-badscan.conf
步骤 2:写入 Jail 配置
ini
# 自定义 Jail 名称
[apache-badscan]
enabled = true
port = http,https
# 关联自定义的过滤规则(下面会创建)
filter = apache-badscan
# 监控 Apache 访问日志
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 300
bantime = 1800
ignoreip = 127.0.0.1 192.168.1.0/24
步骤 3:创建对应的过滤规则文件
Jail 中的 filter = apache-badscan 对应 /etc/fail2ban/filter.d/apache-badscan.conf,需要手动创建:
bash
运行
sudo nano /etc/fail2ban/filter.d/apache-badscan.conf
写入正则规则(匹配频繁 404 请求):
ini
[Definition]
# 正则表达式:匹配日志中包含 " 404 " 的请求,<HOST> 代表客户端 IP
failregex = ^<HOST> -.*" (GET|POST).*" 404 .*$
# 忽略的正则(留空表示不忽略)
ignoreregex =
步骤 4:生效并测试
bash
运行
sudo systemctl restart fail2ban
# 测试过滤规则是否匹配日志
sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-badscan.conf
输出 Success, the total number of matches is ... 即为规则有效。
五、Jail 配置的常用操作
1. 启用 / 禁用某个 Jail
- 启用:修改对应 Jail 文件的
enabled = true - 禁用:修改为
enabled = false,重启服务生效
2. 查看所有已启用的 Jail
bash
运行
sudo fail2ban-client status
3. 调整封禁策略(临时生效)
无需修改配置文件,直接用命令调整:
bash
运行
# 临时将 sshd Jail 的封禁时间改为 1 小时
sudo fail2ban-client set sshd bantime 3600
# 临时将最大失败次数改为 5 次
sudo fail2ban-client set sshd maxretry 5
注意:临时修改重启服务后会失效,如需永久生效,需修改配置文件。
六、避坑指南
- 参数格式错误 :配置文件中
=前后必须有空格(如enabled = true,不是enabled=true),否则会导致服务启动失败。 - 日志路径错误 :确保
logpath指向的日志文件存在且 Fail2Ban 有权限读取(权限至少644)。 - 白名单未配置 :一定要将自己的 IP 加入
ignoreip,避免误封自己。 - 防火墙未启动 :Ubuntu 默认用
ufw,需确保sudo ufw enable,否则 Fail2Ban 无法封禁 IP。