fail2ban是日志驱动的自动响应系统,非防火墙本身;它监控frp等服务日志,识别高频失败连接ip,调用iptables/firewalld自动封禁,全程无需人工干预。

Fail2Ban 不是防火墙本身,而是一个日志驱动的自动响应系统。它通过持续读取服务日志(如 frp、SSH、Nginx),识别出短时间内大量失败连接或异常请求的 IP,再调用 iptables 或 firewalld 立即封禁——整个过程无需人工干预,响应快、门槛低、效果实。
明确监控目标:选对日志和匹配模式
Fail2Ban 能否起效,第一步取决于它是否“看得懂”你的服务日志。frp 默认日志格式较简洁,常见恶意行为表现为:
- 反复尝试建立连接但认证失败(如
auth failed或invalid token) - 空连接、半开连接、快速重连(日志中出现大量
client exit或connection closed且来源 IP 高频复现) - 非标准协议探测(如发送 HTTP 请求到 frp 的 TCP 端口)
你需要先确认 frps 日志路径(例如 /var/log/frps.log),再编写或选用适配的 filter 规则。官方 filter.d 目录下虽无 frp 内置规则,但可基于 sshd 或 nginx-http-auth 模板快速改写,核心是用正则精准捕获含 <host></host> 和失败标识的日志行。
配置专属“监狱”:定义封禁逻辑
在 /etc/fail2ban/jail.local 中新增一个 jail 区块,专用于 frp:
- enabled = true:启用该防护
- filter = frp-authfail:指向你自定义的过滤器文件名(不含 .conf 后缀)
- logpath = /var/log/frps.log:确保路径与 frps 实际日志一致,权限需允许 fail2ban 读取
- maxretry = 5:10 分钟内失败 5 次即触发封禁(可根据业务容忍度调整)
- findtime = 600:统计窗口设为 600 秒(10 分钟)
- bantime = 86400:封禁 24 小时,避免短期扫描反复试探
- ignoreip = 127.0.0.1/8 192.168.0.0/16:排除内网和本地地址,防止误封
注意:不要直接修改 jail.conf,所有自定义配置必须放在 jail.local 或 jail.d/*.local 中。
验证与启动:确保规则真正生效
配置写完不等于防护就位,必须验证两件事:
-
检查 filter 是否匹配:运行
fail2ban-regex /var/log/frps.log /etc/fail2ban/filter.d/frp-authfail.conf,确认输出中有“Lines: X ignored, Y matched, Z missed”且 matched 数大于 0 -
重启并查看状态:执行
sudo systemctl restart fail2ban,再用sudo fail2ban-client status frp-authfail查看当前封禁数和日志位置是否正确 -
观察防火墙规则:运行
sudo iptables -L -n | grep f2b-,应能看到类似f2b-frp-authfail的自定义链,说明动作已注入
若发现未封禁,常见原因包括日志路径错误、filter 正则未捕获真实日志内容、frps 未启用详细日志(需在 frps.ini 中设 log_level = 4)。
日常运维要点:防误封、可追溯、能联动
Fail2Ban 运行后不是一劳永逸,还需关注几个实用细节:
-
手动解封误封 IP:用
sudo fail2ban-client set frp-authfail unbanip 203.0.113.45即可即时放行 -
查看实时封禁列表:
sudo fail2ban-client status frp-authfail会列出所有被 ban 的 IP 和时间 -
开启邮件通知(可选):在 jail 区块中加入
action = %(action_mwl)s并配置destemail和 SMTP,每次封禁都会发警报 -
配合 recidive 监狱:启用默认的
[recidive]可对 24 小时内多次被封的 IP 执行长期封禁(如 1 周),应对顽固扫描器
它不复杂,但容易忽略日志权限、正则精度和状态验证这三个关键环节。











