防范nginx ssrf的核心是禁用动态proxy_pass,强制白名单化静态后端地址;通过map映射可信参数、拦截危险协议与内网地址、限制响应大小及超时,并剥离风险请求头。

防范 Nginx 代理后端引发的 SSRF,核心不是让 Nginx 去“发起请求”,而是切断攻击者通过前端输入操纵 proxy_pass 目标的路径——Nginx 本身不解析用户传入的 URL,也不动态拼接后端地址。所有代理目标必须硬编码、白名单化、静态可控。
禁止动态 proxy_pass 或变量拼接
SSRF 在 Nginx 层最直接的诱因是用不可信输入控制转发目标,例如:
❌ 错误写法:proxy_pass http://$arg_url; 或 proxy_pass http://$host$request_uri;
这类配置等于把代理逻辑完全交给攻击者。Nginx 不校验协议、不过滤内网地址、不识别 file:// 或 gopher:// 等危险 scheme,一旦启用,即构成高危 SSRF 面向通道。
✅ 正确做法:所有 proxy_pass 必须为固定地址,如:proxy_pass http://backend-api:8080/;
若需多后端路由,使用 map + 白名单域名或路径前缀,而非原始参数:
- 定义可信上游:
map $arg_backend $upstream { default "backend-default"; "user" "backend-user"; "payment" "backend-pay"; } - 再在 location 中使用:
proxy_pass http://$upstream; - 确保 map 的 key 仅限预设值,不接受任意字符串
严格限制可访问的目标地址范围
即使 proxy_pass 固定,若后端服务本身存在 SSRF(如调用外部 API 的业务逻辑),Nginx 可作为第一道网关做出口过滤:
- 用
location指令限定仅允许访问特定路径,避免通配符匹配暴露内部接口 - 对已知敏感路径显式拒绝:
location ~ ^/(metadata|internal|admin/api) { return 403; } - 结合 IP 白名单,仅允许后端服务访问指定外网域名:
allow 192.168.10.50; deny all;(放在后端 server 块中)
剥离并阻断危险协议与内网地址解析
Nginx 不解析 URL 协议,但可通过请求头和参数提前拦截典型 SSRF 载荷:
- 检查并拒绝含危险协议的参数:
if ($args ~* "(url=|dest=|target=).*?(file|gopher|ftp|http://127\.|https?://10\.|https?://172\.(1[6-9]|2[0-9]|3[0-1])|https?://192\.168\.)") { return 403; } - 禁用下划线字段解析(防止绕过):
underscores_in_headers off; - 移除可能被后端误用的头部:
proxy_hide_header X-Forwarded-Host; proxy_hide_header X-Original-URL;
配合超时与连接限制降低攻击影响
即便请求穿透到后端,也可通过 Nginx 限制其资源消耗,遏制 SSRF 扫描或数据窃取节奏:
- 设置短连接超时:
proxy_connect_timeout 3s; proxy_read_timeout 5s; - 限制单个请求最大响应体(防大文件回传):
proxy_buffering on; proxy_max_temp_file_size 1m; - 对高频异常请求限流:
limit_req zone=ssrf_attack burst=3 nodelay;(基于可疑参数触发)











