正向代理核心是严格限制目标域名、控制客户端来源、防止任意转发;Nginx原生不支持,HTTPS必须依赖ngx_http_proxy_connect_module,并禁用$host动态转发以防SSRF和开放代理风险。

正向代理只允许访问白名单内企业内部系统,核心是“限制目标域名+控制客户端来源+防止任意转发”,不是简单加个 proxy_pass 就完事。Nginx 原生不支持正向代理,尤其 HTTPS 必须依赖 ngx_http_proxy_connect_module,但即使启用该模块,也不能直接用 $host 动态转发到任意地址——否则极易被利用为开放代理或触发 SSRF(服务端请求伪造)。
只放行指定内部域名(关键防线)
必须显式限定可访问的目标系统域名,禁止通配或变量拼接外部不可信地址。例如只允许访问 hr.internal.corp、finance.api.corp、gitlab.intra:
- 在
location /中用if检查$host,匹配失败则返回 403 - 避免写
proxy_pass http://$host$request_uri这类高危语句 - 推荐写法:
if ($host !~ ^(hr\.internal\.corp|finance\.api\.corp|gitlab\.intra)$) { return 403; }
限制客户端 IP 来源(双重校验)
仅允许可信办公网段发起代理请求,比如 10.20.0.0/16 或 192.168.100.0/24:
- 在
server块开头或location /内配置:allow 10.20.0.0/16;<br>allow 192.168.100.0/24;<br>deny all;
- 若前端有 SLB 或 CDN,需配合
set_real_ip_from+real_ip_header X-Forwarded-For,并用geo+if判断真实客户端 IP(因allow不支持变量) - 务必加上
allow 127.0.0.1,方便本地调试和健康检查
区分 HTTP 与 HTTPS 处理逻辑
HTTP 流量可用标准 proxy_pass,HTTPS 必须走 CONNECT 隧道,且要严格约束端口:
- HTTP 场景(如内网 HTTP 管理后台):
在location /中启用proxy_pass,并设置resolver解析内部 DNS - HTTPS 场景(如
https://hr.internal.corp):
需监听专用端口(如 3128),启用proxy_connect,并限制:proxy_connect_allow 443;
禁用其他端口(如 22、3389、25) - 对非 CONNECT 请求(GET/POST),统一返回 405:
if ($request_method !~ ^(CONNECT|GET|HEAD|POST)$) { return 405; }
附加安全加固项
防止绕过、日志可追溯、缓存可控:
- 关闭不必要的头部泄露:
proxy_hide_header Server; - 记录真实目标域名和客户端 IP:
log_format proxy_log '$remote_addr - $http_x_forwarded_for [$time_local] "$request" $host $status'; - 开启缓存仅针对内部系统响应(可选):
proxy_cache_valid 200 302 10m;,缓存路径需独立隔离 - 禁用
proxy_redirect,避免重定向跳转到外部地址


















