Nginx反向代理如何彻底隐藏源站信息,仅传递用户IP与User-Agent?
Nginx反向代理如何彻底隐藏源站信息,仅传递用户IP与User-Agent?
看起来你已经在做反向代理隐藏源站信息的工作了,但部分请求还是泄露了源站信息,咱们一步步来排查和优化配置,同时梳理可能泄露信息的其他渠道:
一、优化Nginx配置,确保关键头部被正确覆盖
你当前的配置已经处理了Referer、Origin和Cookie,但有几个关键遗漏和可以加强的点:
1. 明确传递用户真实的User-Agent
你没在配置里显式设置User-Agent,虽然Nginx默认会保留客户端的UA,但为了确保万无一失,最好明确添加:
proxy_set_header User-Agent $http_user_agent;
2. 处理现代浏览器的Fetch Metadata Headers
现代浏览器会发送Sec-Fetch-Site、Sec-Fetch-Mode、Sec-Fetch-Dest这些头部,它们会直接标明请求的来源类型(比如跨站、同站),这可能泄露源站信息,需要清空或覆盖:
proxy_set_header Sec-Fetch-Site ""; proxy_set_header Sec-Fetch-Mode ""; proxy_set_header Sec-Fetch-Dest "";
3. 确保IP传递的准确性
你的IP相关配置是对的,但要注意X-Forwarded-For会累加IP,如果你的代理前面还有其他反向代理,可能需要调整,但如果是直接面向用户的代理,当前配置没问题。
优化后的完整配置
location /rvsprx { # 强制设置请求来源为myapp proxy_set_header Referer "https://www.myapp.com"; proxy_set_header Origin "https://www.myapp.com"; # 传递用户真实IP和UA proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header User-Agent $http_user_agent; # 彻底清除Cookie相关信息 proxy_hide_header Set-Cookie; proxy_ignore_headers Set-Cookie; proxy_set_header Cookie ""; # 清除可能泄露源站的Fetch Metadata Headers proxy_set_header Sec-Fetch-Site ""; proxy_set_header Sec-Fetch-Mode ""; proxy_set_header Sec-Fetch-Dest ""; # 使用可靠DNS解析 resolver 8.8.8.8; # 动态代理到目标地址 proxy_pass $arg_dest; }
二、为什么部分请求还是会泄露源站信息?
可能的原因有这些:
- 浏览器安全策略:某些浏览器在跨域场景下,可能会强制发送真实的
Origin头部(比如针对POST请求),你可以尝试将Origin设置为空字符串来测试:proxy_set_header Origin "";(不过这可能导致部分外部服务器拒绝请求,需要根据实际情况调整)。 - 源站页面的CSP策略:如果嵌入你脚本的网站设置了严格的
Content-Security-Policy,可能会影响浏览器发送的Referer或其他头部,你可以在代理返回的响应中添加add_header Referrer-Policy "strict-origin-when-cross-origin";来统一控制Referer的发送规则。 - 未完全覆盖的自定义头部:有些网站会添加自己的自定义请求头部(比如
X-Site-ID、X-App-Version),这些头部会被Nginx默认传递,你需要通过proxy_set_header 头部名称 "";来清空它们。
三、除了Referer、Origin、Cookie,还有哪些信息可能泄露源站?
确实还有其他潜在的泄露点:
- Fetch Metadata Headers:前面提到的
Sec-Fetch-*系列头部,是现代浏览器的标准头部,必须处理。 - 自定义请求头部:如上面所说,源站页面可能添加的自定义头部,需要排查并清空。
- Referrer-Policy响应头:如果源站设置了宽松的Referrer-Policy,浏览器可能会发送完整的源站URL作为Referer,你需要在代理中统一设置响应头来控制。
- 请求的Referer自动补全:部分浏览器在Referer为空时,会自动补全当前页面的URL,所以强制设置Referer为你的myapp地址很关键。
四、调试建议
你可以用curl模拟源站的请求,查看代理实际发送的头部:
curl -H "Referer: https://somesite.com" -H "Origin: https://somesite.com" -H "Sec-Fetch-Site: cross-site" https://www.myapp.com/rvsprx?dest=https://www.externalserver.com/landing.html -I
同时结合外部服务器的日志,找出哪些头部还在泄露源站信息,再针对性处理。
备注:内容来源于stack exchange,提问作者fasenderos




