nginx 防御自动化扫描需构建“识别—拦截—反制”闭环:先通过 ua、路径、http 方法分层过滤;再从 error.log 提取扫描痕迹;最后用 fail2ban 实时封禁高频恶意 ip。

配置 Nginx 防御自动化扫描工具,核心不是堵死所有路径,而是让扫描行为变得低效、高成本、易暴露。重点在于分层拦截:从请求入口(UA、方法、路径)提前过滤,从日志源头(error.log)精准识别,再通过 fail2ban 实时封禁,形成“识别—拦截—反制”闭环。
拦截可疑 User-Agent 和空 UA
多数扫描器(zgrab、sqlmap、nmap、fofa 爬虫)会暴露特征 UA,Nginx 可在全局高效拦截:
- 在 http 块中定义映射变量,统一管理黑名单:
default 0;
"~*zgrab|nmap|sqlmap|masscan|fofa|bot|spider|crawler|scan" 1;
"~*(^$|^\s*$|^-$)" 1;
}
- 在目标 server 块顶部(
location /之前)加入判断:
return 403 "Access denied."; # 返回带提示的 403,便于日志区分
}
- 配合 log_format 记录拦截状态,方便后续分析:
禁止访问高危路径与敏感文件
Nginx 第一道防线应直接阻断常见扫描目标,避免请求进入后端或留下 access.log 干扰:
- 屏蔽点开头的隐藏文件(如
.env、.git):
return 404;
}
- 禁止下载备份类、配置类、日志类文件(返回 444 直接断连,不发响应):
return 444;
}
- 限制 HTTP 方法,仅允许业务必需的动词:
return 405;
}
从 error.log 主动发现扫描器
真正批量扫路径的工具(如暴力遍历 /.env、/phpmyadmin/)会在 error.log 留下稳定痕迹,比 access.log 更可靠:
- 典型日志行:
[error] open() "/www/site/public/.env" failed (2: No such file or directory), client: 192.168.32.11, request: "GET /.env HTTP/1.1" - 提取关键字段:
client(IP)、request中的路径(含.env、backup、install等关键词)、server(确认是否本虚拟主机) - 这是 fail2ban 的黄金输入源——配置 jail 监控 error.log,正则匹配失败路径并自动封禁
用 fail2ban 实时封禁高频扫描 IP
人工查日志滞后,fail2ban 是成熟可靠的自动化封禁方案:
- 日志路径设为对应站点的
your-domain.com.error.log(不是 access.log) - filter 正则示例:
open\(\) ".*?(\.env|\.git|backup|install|phpmyadmin|wp-admin)\b.*?failed \(2: No such file or directory\) - 触发策略建议:3 分钟内命中 5 次,封禁 1 小时(兼顾压制力与防误伤)
- 启用 jail 后重启 fail2ban,确保规则生效











