nginx可通过限流、特征匹配、日志分析和轻量验证构建基础防护层:用limit_req限速,map+if拦截恶意请求,脚本分析日志动态封禁ip,并叠加js检测等策略提升精度。

利用 Nginx 实现对非法攻击的自动拦截,核心在于结合访问行为分析、请求特征识别与实时响应机制,不依赖外部 WAF 也能构建基础但有效的防护层。关键不是“完全阻止所有攻击”,而是快速识别高频恶意模式(如扫描、暴力破解、异常请求头)并实施限流或封禁。
基于请求频率的自动限流与封禁
Nginx 自带的 limit_req 和 limit_conn 模块可对 IP 或特定变量(如 User-Agent、URI)进行速率控制。合理配置能有效缓解暴力登录、目录扫描等行为。
- 在
http块中定义共享内存区域:limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;(每秒最多 10 个请求) - 在
server或location中启用限流:limit_req zone=perip burst=20 nodelay;(允许突发 20 个请求,超限直接返回 503) - 配合
fail_timeout可实现“触发后封禁一段时间”:多次超限后,该 IP 在指定时间内被拒绝服务
识别并拦截典型恶意请求特征
使用 map 指令提取请求中的风险信号(如可疑 URL 参数、异常头部、SQL 注入关键词),再通过 if + return 或 deny 实现即时拦截。
- 屏蔽含 SQL 注入特征的 URI:
if ($args ~ "(union\s+select|sleep\()") { return 403; } - 拦截常见扫描器 User-Agent:
if ($http_user_agent ~ "sqlmap|nikto|dirbuster") { return 403; } - 限制非常规 HTTP 方法(除 GET/HEAD/POST 外):
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; }
注意:if 在 location 外使用有局限,建议配合 map 提前归类风险等级,再统一处理。
结合日志分析实现动态 IP 封禁
Nginx 本身不支持运行时黑名单更新,但可通过外部脚本解析 access.log,将高频异常 IP 写入黑名单文件,再用 include 加载到配置中,最后重载 Nginx。
- 编写定时脚本(如每 5 分钟执行一次),统计 404、403、500 等错误码出现频次高的 IP
- 生成
blacklist.conf,内容形如:deny 192.168.1.100;<br>deny 203.0.113.45;
- 在 server 块中引入:
include /path/to/blacklist.conf; - 执行
nginx -s reload生效(需确保配置语法正确)
该方式轻量可控,适合中小流量站点,避免引入复杂组件。
增强可信度:区分真实用户与自动化工具
单纯靠 IP 或 UA 不可靠,可叠加简单验证逻辑提升拦截精度,减少误伤。
- 要求 JS 渲染环境才放行的页面,可在 location 中检查
$http_accept或$http_upgrade是否为空 - 对登录接口增加简单 token 验证(如 hidden 字段 + 时间戳哈希),Nginx 层校验签名有效性
- 利用
$sent_http_set_cookie或$cookie_jsid判断是否已通过前端 JS 初始化会话
这类策略不追求绝对安全,而是提高自动化攻击的成本,让真实用户无感,机器难以绕过。











