API中转流量镜像,复制一份请求到审计模型做安全检测
API中转流量镜像的本质是:在请求进入正式业务逻辑之前,额外复制一份原始请求交给审计模型做安全检测,而线上用户拿到的响应仍来自真实业务服务。
这样既能发现攻击行为,又不会因为审计逻辑阻塞主链路。
本文以最常用的 Nginx 中转为例,带你从零配置出可用的流量镜像,并验证检测效果。
先判断你的场景是否适合做镜像
如果你手里有一个 API 中转层(比如反代、网关),同时有独立的审计模型服务,想让它看到每一条请求但又不希望审计模型故障时拖垮业务,流量镜像就比“串行调用”更合适。
典型场景包括:
- 把所有写操作请求复制到 WAF 或安全模型进行二次检测
- 将用户请求备份到分析服务,用于离线审计
- 线上所有请求都要留证,但不想改动业务代码
需要准备一台安装好 Nginx 的服务器(Nginx 1.13 以上自带 mirror 模块,通常无需重新编译),以及一个能接收请求的审计服务地址,例如 http://192.168.1.10:9090/audit。
本文假设 Nginx 监听 80 端口,业务后端是 http://127.0.0.1:8080。
在 Nginx 里配置请求复制
先打开 Nginx 配置文件,建议在 server 块里单独写一个 /mirror 的 location,用来接收复制的请求,然后再在主接口上开启 mirror 指令。
下面是完整的最小配置片段:
server {
listen 80;
server_name api.example.com;
location /api {
mirror /mirror; # 开启镜像,子请求发给 /mirror
mirror_request_body on; # 复制 body,保证 POST 内容完整
proxy_pass http://127.0.0.1:8080;
}
location = /mirror {
internal; # 只允许内部调用,外部无法直接访问
proxy_pass http://192.168.1.10:9090/audit;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Original-URI $request_uri;
}
}
配置完成后执行 nginx -t 检查语法,再 nginx -s reload 重载。
此时访问 /api 的请求会同时发一份到审计服务,审计服务返回什么内容都不影响主请求,用户拿到的仍是业务后端的响应。
验证复制流量是否到达审计模型
如果你用的是审计模型自带的 Web 界面,直接看有没有新请求进入;
如果审计服务只有日志,就用 tail -f /var/log/audit/access.log 观察。
同时用 curl 打一条测试请求:
curl -X POST "http://api.example.com/api/login" \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"123456"}'
正常时业务接口立刻返回结果,审计服务后台也能看到同一条请求内容,且包含 POST body。
如果你发现审计服务收到请求较少,先检查 mirror_request_body on 是否生效——同时确认 Nginx 的错误日志里没有 “upstream timed out” 之类的记录。
避坑:别让镜像拖垮主业务
流量镜像不是万能方案,下面几个坑在线上很常见:
- 镜像请求会占用连接。Nginx 的 mirror 默认会等待子请求建立连接,如果审计服务响应慢,Nginx worker 连接数会升高。建议给审计服务配置比较短的
proxy_connect_timeout,比如proxy_connect_timeout 3s;,并合理调整 Nginx 的worker_connections。 - 审计服务必须是无状态的。复制请求只作检测用,不能影响业务数据;审计模型不要反过来写主业务库。
- 注意请求体大小限制。如果镜像请求的
proxy_pass没设client_max_body_size,大文件上传请求可能被审计端拒绝,导致 Nginx 报 413,间接影响主链路日志排查。 - 不要用 mirror 做精确计数。镜像子请求是异步处理的,极端情况下可能丢包,如果业务要求“每条必达”,建议改用消息队列或录制回放方案。
常见疑问补充
如果你用的是 APISIX、Kong 这类网关,也可以直接开启流量镜像插件,原理和上面的 Nginx 配置一样。
还有一种做法是在代码层用重放工具(如 GoReplay)抓到流量再转发给审计模型,适合无法修改 Nginx 配置的环境。
最后提醒一句:镜像请求里如果包含用户密码、token 等敏感信息,审计服务端要开启 HTTPS 传输,并控制日志保存权限,避免安全检测反而变成数据泄露点。
你按上面的配置操作一遍,确认审计模型能看到与线上一致的请求,再逐步放开到全量流量就行。
如果遇到子请求超时或日志偏差,优先检查审计服务自身处理速度,而不是盲目加大 Nginx 超时时间。