fail2ban使用说明

fail2ban 使用说明

这份文档整理的是服务器上 fail2ban 的常用基础配置,默认配合前面的 SSHnftables 使用。

你可以把它理解成:

  • nftables 负责基础防火墙规则
  • fail2ban 负责看日志,发现恶意来源后自动封 IP

0. fail2ban 配置流程图

flowchart TD
A[开始] --> B[安装 fail2ban]
B --> C[确认 SSH 和 nftables 已正常工作]
C --> D[清理不需要的 /etc/fail2ban/jail.d/*.local]
D --> E[写 default.local 和 sshd.local]
E --> F[执行 fail2ban-client -t]
F --> G{配置是否通过}
G -- 否 --> H[修正 default.local 或 sshd.local]
H --> F
G -- 是 --> I[重启并设置开机自启]
I --> J[查看 fail2ban-client status sshd]
J --> K[按需增加其他服务 jail]
K --> L[完成]

1. 它是怎么封 IP 的

完整链路很简单:

  1. fail2ban 读取日志
  2. filter 匹配失败事件
  3. 从日志里提取来源 IP
  4. findtime 时间窗口里统计失败次数
  5. 超过 maxretry 后触发封禁
  6. 调用 banaction
  7. 这里的 banaction = nftables-multiport,所以最终是通过 nftables 封 IP

所以它不是自己直接封 IP,而是:

  • jail 定义规则
  • filter 识别失败日志
  • banaction 调用防火墙执行封禁

2. 安装和启动

安装:

sudo apt update
sudo apt install fail2ban

启动并设置开机自启:

sudo systemctl enable fail2ban
sudo systemctl start 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]
banaction = nftables-multiport
banaction_allports = nftables-allports
backend = systemd
findtime = 10m
maxretry = 5
bantime = 1h
ignoreip = 127.0.0.1/8 ::1

后面的 jail,默认都会继承 [DEFAULT] 里的配置,也就是默认都会走 nftables 来封 IP。

4.2 SSH 配置

编辑:

vim /etc/fail2ban/jail.d/sshd.local

写入:

[sshd]
enabled = true
port = 22
maxretry = 5
findtime = 10m
bantime = 12h

如果你的 SSH 端口不是 22,就把 port = 22 改成真实端口。

5. sshd 要不要自己写 filter

一般不用。

sshd 这种常见服务,fail2ban 通常已经自带对应 filter,所以你只写 [sshd] 这个 jail 就行。
常见的自带 filter 通常在:

/etc/fail2ban/filter.d/sshd.conf

也就是说:

  • sshd 这种常见服务,一般直接用系统自带 filter
  • myapp 这种自定义服务,才通常需要你自己写 filter

6. 自定义服务完整示例

假设你的服务叫 myapp,监听 8080,日志文件是:

/var/log/myapp/error.log

日志内容类似这样:

2026-04-15 15:00:01 login failed from 1.2.3.4
2026-04-15 15:00:08 login failed from 1.2.3.4
2026-04-15 15:00:16 login failed from 1.2.3.4

6.1 写 jail

编辑:

vim /etc/fail2ban/jail.d/myapp.local

写入:

[myapp]
enabled = true
port = 8080
filter = myapp
logpath = /var/log/myapp/error.log
maxretry = 5
findtime = 600
bantime = 600

6.2 写 filter

编辑:

vim /etc/fail2ban/filter.d/myapp.conf

写入:

[Definition]
failregex = ^.*login failed from <HOST>.*$
ignoreregex =

这里 <HOST>fail2ban 用来匹配来源 IP 的占位符。

6.3 这套配置怎么工作的

它的逻辑就是:

  1. 监控 /var/log/myapp/error.log
  2. myapp.conf 去匹配失败日志
  3. 从匹配结果里提取 <HOST>
  4. 同一个 IP 在 600 秒内失败 5
  5. 触发 banaction
  6. 通过 nftables 封禁这个 IP 600

6.4 为什么只有 jail 不够

如果你只写:

[myapp]
enabled = true
port = 8080
logpath = /var/log/myapp/error.log
maxretry = 5
findtime = 600
bantime = 600

但没有 filter = myapp,也没有 /etc/fail2ban/filter.d/myapp.conf
fail2ban 不知道:

  • 哪种日志算失败
  • 失败日志里的 IP 在哪里

这种情况下它通常不会按预期封 IP。

7. 关键参数怎么理解

  • banaction = nftables-multiport
    封禁时用 nftables
  • backend = 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. 使用时最需要注意的事

  1. 先确认 SSH 和 nftables 已正常工作,再启用 fail2ban
  2. 如果 SSH 端口改了,sshd.local 里的 port 也要同步改
  3. sshd 通常直接用内置 filter,不用自己重写
  4. 自定义服务通常要同时写 jailfilter
  5. 永久封禁慎用,先短时间测试更稳

12. 最终要记住的核心点

  • 这里统一推荐用 /etc/fail2ban/jail.d/*.local
  • default.local 放全局默认项
  • sshd.local 放 SSH 规则
  • sshd 一般直接用系统自带 filter
  • 自定义服务通常要自己写 filter.d/*.conf
  • banaction = nftables-multiport 表示最终通过 nftables 封 IP