不能。Fail2ban默认仅支持单IP封禁,底层iptables/nftables不原生支持CIDR;IP段级封禁需由Nginx通过geo+map+return实现,Fail2ban仅负责触发更新黑名单文件并重载Nginx。

Fail2ban 能不能直接封禁 IP 段(比如 192.168.0.0/16)?
不能。Fail2ban 默认只支持封禁单个 IP,底层调用的是 iptables 或 nftables 的 -s(source)匹配,不原生支持 CIDR 段。强行在 fail2ban.conf 或 jail 配置里写 192.168.0.0/16 会导致 fail2ban-client reload 失败,报错类似:Invalid ip address: 192.168.0.0/16。
真正能批量封禁 IP 段的,是 Nginx 自身的 geo + map + deny 机制,Fail2ban 只负责“发现并触发”,不能越俎代庖。
- Fail2ban 的定位是「基于日志的行为检测与临时封禁」,适合应对暴力破解、爬虫试探等短期攻击
- IP 段级封禁属于「前置访问控制」,必须由 Web 服务器(Nginx)在请求进入应用前就拦截
- 宝塔 9.0 默认用 Nginx,且支持自定义配置片段,这是最稳妥的落地路径
如何让 Fail2ban 触发后自动更新 Nginx 黑名单文件?
核心思路:Fail2ban 执行 actionban 时,调用一个 shell 脚本,把新封的 IP 追加进黑名单文件,并重载 Nginx。不依赖第三方插件,纯手动可控。
操作步骤:
- 新建黑名单文件:
/www/server/panel/vhost/blacklist/ip_blacklist.conf,内容为:deny 1.2.3.4;<br>deny 5.6.7.8;
- 在 Nginx 主配置(
/www/server/nginx/conf/nginx.conf)的http块顶部加入:include /www/server/panel/vhost/blacklist/ip_blacklist.conf;
- 创建更新脚本:
/www/server/panel/vhost/blacklist/update_blacklist.sh,权限设为755:#!/bin/bash<br>IP=$1<br>BLACKLIST="/www/server/panel/vhost/blacklist/ip_blacklist.conf"<br>if ! grep -q "^deny $IP;" "$BLACKLIST"; then<br> echo "deny $IP;" >> "$BLACKLIST"<br> /etc/init.d/nginx reload 2>/dev/null || true<br>fi
- 修改 Fail2ban 的 jail(如
nginx-http-auth),在[action]下指定:actionban = /www/server/panel/vhost/blacklist/update_blacklist.sh <ip>
注意:<ip></ip> 是 Fail2ban 内置变量,别手误写成 %ip% 或 ;脚本中用了 grep -q 避免重复写入;reload 失败也不中断流程(|| true)。
怎样高效导入已有恶意 IP 段(非单 IP)到 Nginx?
如果已有现成的 IP 段列表(例如从威胁情报平台导出的 1.1.1.0/24、2.2.0.0/16),不能丢给 Fail2ban,必须转成 Nginx 可识别格式,并避免配置爆炸。
Nginx 的 deny 不支持 CIDR,但可以用 geo 指令配合正则或范围匹配实现段级屏蔽——更推荐用 geo + map 方式,性能远高于百行 deny:
- 在
http块中添加:geo $bad_ip_range {<br> default 0;<br> 1.1.1.0/24 1;<br> 2.2.0.0/16 1;<br> 3.3.3.3 1;<br>} - 再加一段
map把 geo 结果映射为状态码:map $bad_ip_range $blocked {<br> 1 444;<br>} - 在 server 块里加:
if ($blocked) { return $blocked; }
这样,Nginx 在解析请求时就能毫秒级判断是否命中段规则。比逐行 deny 更省内存,也避免因配置过长导致 nginx -t 校验失败。
宝塔 9.0 下容易被忽略的三个坑
不是所有操作都能在宝塔 Web 界面完成,这几个点稍不注意就会白忙活:
- 宝塔「安全」页面里的「IP 黑名单」仅作用于面板自身(
BT-Panel),对网站 Nginx 流量完全无效 - Fail2ban 日志默认在
/var/log/fail2ban.log,但宝塔 9.0 的 Nginx 日志路径是/www/wwwlogs/your-site.error.log,jail 的logpath必须填对,否则永远不触发 - 执行
/etc/init.d/nginx reload时,如果配置语法错误,Nginx 会回退到旧配置但不报错——务必手动运行nginx -t验证,再看nginx -V 2>&1 | grep -o 'with-http_geo_module'确认geo模块已编译
IP 段封禁本质是「防御前置化」,Fail2ban 是探针,Nginx 是盾牌。两者衔接的关键不在功能多强,而在动作是否原子、路径是否可审计、失败是否可感知。


















