可直接用 mirror 指令配合 map 条件判断异步镜像可疑请求至沙箱,主链路不受影响;关键识别字段包括异常 X-Forwarded-For、含扫描器特征的 User-Agent、典型攻击 URI 及非标方法或高频请求。

可以直接用 mirror 指令配合条件判断,把符合可疑特征的请求异步复制到沙箱系统,主链路完全不受影响。
识别可疑流量的关键字段
真实环境中,可疑请求常体现在以下可被 Nginx 解析的字段中:
-
HTTP 头字段:如
X-Forwarded-For中高频出现的异常 IP 段、User-Agent包含扫描器特征(sqlmap、nuclei、gobuster) -
URI 路径或参数:含
.php?cmd=、/wp-content/plugins/、../etc/passwd等典型攻击路径 -
请求方法与频率:非标准方法(
OPTIONS、PROPFIND)或单 IP 短时大量请求(需配合limit_req预标记)
配置带条件的镜像规则
不推荐用 if 嵌套在 location 中(有局限性),更稳妥的方式是使用 map 提前生成镜像开关变量:
map $request_uri $mirror_sandbox {
~*\.(php|jsp|asp)\?.*cmd= 1;
~*/wp-content/plugins/.* 1;
~*\.\./etc/passwd 1;
~*(sqlmap|nuclei|dirb) 1;
default 0;
}
<p>map $http_user_agent $mirror_sandbox_ua {
~*(sqlmap|nuclei|gobuster) 1;
default 0;
}</p><h1>合并判定</h1><p>map $mirror_sandbox$mirror_sandbox_ua $do_mirror {
"11" 1;
"10" 1;
"01" 1;
default 0;
}</p>
然后在目标 location 中启用镜像:
location / {
proxy_pass http://upstream_prod;
<pre class="brush:php;toolbar:false;"># 仅当判定为可疑时触发镜像
mirror /sandbox_mirror;
mirror_request_body on;
# 主请求不等待镜像结果,也不受其响应影响
}
沙箱接收端的配置要点
镜像请求必须由专用 location 接收,且严格限制为内部调用:
- 加
internal;指令,防止外部直接访问/sandbox_mirror - 显式拼接
$request_uri和传递原始头信息,便于沙箱还原上下文 - 建议添加标识头,如
X-Mirror-Source: suspicious,方便沙箱日志归类
示例:
location = /sandbox_mirror {
internal;
proxy_pass https://sandbox-backend$request_uri;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Mirror-Source "suspicious";
proxy_set_header X-Mirror-Time $msec;
}
生产环境注意事项
这类镜像用于安全分析,需特别关注:
-
隐私合规:镜像前应脱敏敏感字段(如
Cookie、Authorization、手机号、身份证号),可用proxy_hide_header或 Lua 模块处理 -
沙箱负载隔离:避免沙箱故障拖垮 Nginx,建议设置
proxy_next_upstream error timeout并配置独立 upstream -
日志可追溯:开启
log_format记录$do_mirror变量,便于回溯哪些请求被送入沙箱











