该模块的功能 #
fail2ban 是守护者,它监视服务器的日志,一旦检测到恶意访问尝试(例如大量 SSH 密码失败),就会自动将肇事 IP 封禁一段时间。每个受监视的服务都组织在一个 jail 中(例如 sshd)。
fail2ban 模块让你在运行时掌控这些封禁,而无需记住 fail2ban-client 的语法:查询 jail 的状态,列出谁被封禁,核查某个具体 IP 是否被封锁,手动封禁或解封,在紧急情况下一次性全部解除封锁,并在变更后重载配置。
该模块作用于一个已安装并正在运行的 fail2ban。所有子命令都会查询或修改服务状态,因此需要 root 权限(使用 sudo)。如果你因为自己的 IP 而被挡在门外,请直接跳到紧急解除封锁。
常见任务 #
选择你想做的事。每个方案都已写好命令——只需把 IP 或 jail 换成你自己的,然后按复制。
1
查看状态与 jail
一眼确认 fail2ban 是否活动以及有多少被封禁。
用 ubuntu 用户通过 SSH 连接到你的服务器,并查询总体状态:
$ sudo imaxe fail2ban status想要机器可读的格式,用于脚本或面板?加上 --json:
$ sudo imaxe fail2ban status --jsonsshd)以及每个 jail 中被封禁的 IP 数量。2
查看哪些 IP 被封禁
列出活动的封禁,涵盖所有 jail 或某个具体 jail。
一次列出所有 jail 中所有被封禁的 IP:
$ sudo imaxe fail2ban banned只关心某一个 jail?把它作为参数指定:
$ sudo imaxe fail2ban banned sshd3
核查某个 IP 是否被封禁
查明某个具体地址在哪些 jail 中被封锁。
直接查询该 IP;它会告诉你这个 IP 在哪些 jail 中被封禁:
$ sudo imaxe fail2ban check 203.0.113.74
封禁或解封某个 IP
手动封锁一个滥用地址,或释放一个合法用户。
在某个具体 jail 中封禁一个 IP(如果只有一个 jail,会自动推断):
$ sudo imaxe fail2ban ban 203.0.113.7 --jail sshd封禁了合法的人?一次性把它从所有 jail 中解封:
$ sudo imaxe fail2ban unban 203.0.113.7imaxe fail2ban check 加以确认。5
全部解除封锁(紧急)
你被挡在门外了:释放所有 jail 中的所有 IP。
如果你自己的 IP 被困住,需要立刻恢复访问,就把它们全部解封。加上 --yes 可跳过确认:
$ sudo imaxe fail2ban unban-all --yes更改 jail 配置后,重载它以使其生效:
$ sudo imaxe fail2ban reloadunban-all这是对封禁的破坏性操作:它会让所有 IP 都不再被封锁,包括恶意的。只在紧急情况下用它恢复访问,之后用 imaxe fail2ban status 检查状态。
用法概要 #
imaxe fail2ban <subcomando> [<ip>|<jail>] [--jail JAIL] [flags]所有子命令都需要 root 权限(使用 sudo),因为它们通过 fail2ban-client 查询或修改 fail2ban 的状态。为 status、banned 或 check 加上 --json,即可获得适合脚本处理的机器可读输出。
子命令 #
| 子命令 | 功能 | 相关标志 |
|---|---|---|
| status | fail2ban 状态:是否活动、jail 以及每个 jail 中被封禁的 IP 数量。 | --json |
| banned | 列出被封禁的 IP(所有 jail 或某个具体 jail)。 | --json |
| check | 指出某个 IP 在哪些 jail 中被封禁。 | --json |
| ban | 在某个 jail 中手动封禁一个 IP。 | --jail |
| unban | 将一个 IP 从所有 jail 中解封。 | — |
| unban-all | 紧急:将所有 jail 中的全部 IP 解封。 | --yes |
| reload | 重载 fail2ban 配置(校验 jail.local)。 | — |
参数与标志 #
| 参数 / 标志 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| <ip> 必填 | string | — | 要操作的 IP。在 check、ban 和 unban 中为必填。 |
| <jail> | string | 全部 | 在 banned 中,要列出的具体 jail。不带参数则列出所有 jail。 |
| --jail | string | 自动 | 在 ban 中,封禁的目标 jail。如果只有一个 jail,会自动推断。 |
| --yes | bool | false | 在 unban-all 中,无需询问即确认(对封禁的破坏性操作)。 |
| --json | bool | false | 在 status/banned/check 中,将结果以 JSON 形式输出到 stdout。 |
文件与路径 #
| 路径 | 内容 |
|---|---|
| /etc/fail2ban/jail.local | fail2ban 的本地配置:活动的 jail、封禁时长和阈值。reload 所校验的正是它。 |
| /var/run/fail2ban/fail2ban.sock | 控制套接字,fail2ban-client 通过它与服务通信。 |
| /var/log/fail2ban.log | fail2ban 自身的日志:封禁、解封和重载。 |
退出码与日志 #
每次执行都会返回一个退出码,你可以用 echo $? 查看——便于在脚本中串联:
调试时实时跟踪日志:
$ sudo journalctl -u fail2ban -f
$ sudo tail -f /var/log/fail2ban.log故障排查 #
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 出现 SERVICE(退出码 3) | fail2ban 已停止或套接字无响应。 | 用 systemctl start fail2ban 启动服务后重试。 |
| 出现 JAIL(退出码 4) | --jail 指定的 jail 不存在,或存在多个而无法推断。 | 用 imaxe fail2ban status 查看各 jail,并在 --jail 中指定正确的那个。 |
| 出现 RELOAD(退出码 5) | jail.local 中存在语法错误。 | 修正 /etc/fail2ban/jail.local 后再次执行 reload。 |
| 我通过 SSH 被挡在门外 | 你自己的 IP 累计失败并在 sshd 中被封禁。 | 从另一条途径,用 unban 将其解封,或用 unban-all --yes 全部释放。 |
Fail2ban 模块遇到问题了?
把「imaxe <module> status --json」的输出发给我们,我们会尽快回复你。