fail2ban使用说明
fail2ban 使用说明
这份文档整理的是服务器上 fail2ban 的常用基础配置,默认配合前面的 SSH 和 nftables 使用。
你可以把它理解成:
nftables负责基础防火墙规则fail2ban负责看日志,发现恶意来源后自动封 IP
0. fail2ban 配置流程图
flowchart TD |
1. 它是怎么封 IP 的
完整链路很简单:
fail2ban读取日志- 用
filter匹配失败事件 - 从日志里提取来源 IP
- 在
findtime时间窗口里统计失败次数 - 超过
maxretry后触发封禁 - 调用
banaction - 这里的
banaction = nftables-multiport,所以最终是通过nftables封 IP
所以它不是自己直接封 IP,而是:
jail定义规则filter识别失败日志banaction调用防火墙执行封禁
2. 安装和启动
安装:
sudo apt update |
启动并设置开机自启:
sudo systemctl enable fail2ban |
查看状态:
sudo systemctl status fail2ban |
3. 配置文件位置
这里统一只用目录化配置:
- 主配置参考:
/etc/fail2ban/jail.conf - 实际使用:
/etc/fail2ban/jail.d/*.local
一般不要直接改 jail.conf。
这里推荐的方式是:
- 全局默认项写到:
/etc/fail2ban/jail.d/default.local - SSH 写到:
/etc/fail2ban/jail.d/sshd.local - 其他服务各写各的
.local
如果是新机器初始化,可以先清理旧的目录化配置:
rm -rf /etc/fail2ban/jail.d/* |
注意:这会删除目录里原有的 .local 配置,只适合新机器,不适合已经有现成配置的服务器。
4. 最小可用配置
4.1 全局默认项
编辑:
vim /etc/fail2ban/jail.d/default.local |
写入:
[DEFAULT] |
后面的 jail,默认都会继承 [DEFAULT] 里的配置,也就是默认都会走 nftables 来封 IP。
4.2 SSH 配置
编辑:
vim /etc/fail2ban/jail.d/sshd.local |
写入:
[sshd] |
如果你的 SSH 端口不是 22,就把 port = 22 改成真实端口。
5. sshd 要不要自己写 filter
一般不用。
像 sshd 这种常见服务,fail2ban 通常已经自带对应 filter,所以你只写 [sshd] 这个 jail 就行。
常见的自带 filter 通常在:
/etc/fail2ban/filter.d/sshd.conf |
也就是说:
sshd这种常见服务,一般直接用系统自带 filtermyapp这种自定义服务,才通常需要你自己写 filter
6. 自定义服务完整示例
假设你的服务叫 myapp,监听 8080,日志文件是:
/var/log/myapp/error.log |
日志内容类似这样:
2026-04-15 15:00:01 login failed from 1.2.3.4 |
6.1 写 jail
编辑:
vim /etc/fail2ban/jail.d/myapp.local |
写入:
[myapp] |
6.2 写 filter
编辑:
vim /etc/fail2ban/filter.d/myapp.conf |
写入:
[Definition] |
这里 <HOST> 是 fail2ban 用来匹配来源 IP 的占位符。
6.3 这套配置怎么工作的
它的逻辑就是:
- 监控
/var/log/myapp/error.log - 用
myapp.conf去匹配失败日志 - 从匹配结果里提取
<HOST> - 同一个 IP 在
600秒内失败5次 - 触发
banaction - 通过
nftables封禁这个 IP600秒
6.4 为什么只有 jail 不够
如果你只写:
[myapp] |
但没有 filter = myapp,也没有 /etc/fail2ban/filter.d/myapp.conf,
那 fail2ban 不知道:
- 哪种日志算失败
- 失败日志里的 IP 在哪里
这种情况下它通常不会按预期封 IP。
7. 关键参数怎么理解
banaction = nftables-multiport
封禁时用nftablesbackend = systemd
从journald读日志,Debian / Ubuntu 常用findtime = 10m
10 分钟统计窗口maxretry = 5
10 分钟内失败 5 次触发封禁bantime = 1h
封禁 1 小时
也可以写成秒数:
bantime = 600 |
这表示封禁 600 秒,也就是 10 分钟。
如果你想永久封禁:
bantime = -1 |
这表示永久封禁,不自动解封。
永久封禁更容易误伤自己,建议先用短时间封禁测试。
8. 配置完成后怎么检查
先检查配置:
sudo fail2ban-client -t |
重启服务:
sudo systemctl restart fail2ban |
查看全部 jail:
sudo fail2ban-client status |
查看 SSH 状态:
sudo fail2ban-client status sshd |
如果是你自己的服务:
sudo fail2ban-client status myapp |
9. 常用命令
手动封禁一个 IP:
sudo fail2ban-client set sshd banip 1.2.3.4 |
手动解封一个 IP:
sudo fail2ban-client set sshd unbanip 1.2.3.4 |
查看日志:
sudo journalctl -u fail2ban -f |
如果系统启用了文件日志,也可以看:
tail -f /var/log/fail2ban.log |
10. 怎么检查 filter 对不对
自定义服务写完后,最好用这个命令测试:
sudo fail2ban-regex /var/log/myapp/error.log /etc/fail2ban/filter.d/myapp.conf |
它的作用是:
- 用你的 filter 去跑一遍日志
- 看哪些行匹配到了
- 确认是不是正确抓到了失败 IP
11. 使用时最需要注意的事
- 先确认 SSH 和
nftables已正常工作,再启用fail2ban - 如果 SSH 端口改了,
sshd.local里的port也要同步改 sshd通常直接用内置 filter,不用自己重写- 自定义服务通常要同时写
jail和filter - 永久封禁慎用,先短时间测试更稳
12. 最终要记住的核心点
- 这里统一推荐用
/etc/fail2ban/jail.d/*.local default.local放全局默认项sshd.local放 SSH 规则sshd一般直接用系统自带 filter- 自定义服务通常要自己写
filter.d/*.conf banaction = nftables-multiport表示最终通过nftables封 IP