Nginx原生不支持正向代理,尤其HTTPS必须依赖CONNECT方法,而标准编译缺失该支持;即使加载第三方模块ngx_http_proxy_connect_module,仍存在无客户端认证、DNS解析依赖、不支持WebSocket等缺陷,生产环境应优先选用Squid或TinyProxy。

Nginx 本身不是为正向代理设计的,不推荐在生产环境用它做通用正向代理,尤其涉及 HTTPS 流量时。真正安全、稳定、可运维的内网出网方案,应优先选用 Squid、TinyProxy 或企业级代理网关。但若受限于环境必须用 Nginx,需明确前提、规避风险、按规范配置。
必须满足的三个硬性前提
- 外网服务器已开通互联网访问权限,且与内网主机网络可达(如能 ping 通、端口连通)
- 使用源码编译安装 Nginx,手动集成
ngx_http_proxy_connect_module模块(官方包不含该模块) - 客户端(内网机器)能主动配置代理地址(如
export http_proxy=http://192.168.0.97:3128),浏览器直连 HTTPS 站点需额外信任或配合插件,原生不兼容标准代理设置
HTTP 流量:简易 proxy_pass 方式(仅限测试/非浏览器场景)
适用于纯 HTTP 请求、命令行工具(如 curl、wget、yum 的部分 HTTP 源),不适用于现代浏览器或 HTTPS 网站。
server {
listen 8080;
resolver 114.114.114.114 ipv6=off;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_buffering off;
}
}⚠️ 注意:
- 此方式无法处理重定向跳转中的 Host 变更
- 不支持客户端认证(无用户名密码鉴权)
- DNS 解析依赖
resolver,若未配或失效,会报502 Bad Gateway - 内网机器需用
curl -x http://192.168.0.97:8080 http://example.com显式指定代理
HTTPS 流量:必须启用 CONNECT 隧道(唯一可行路径)
这是唯一能让浏览器、Docker、apt/yum 等工具正常走代理访问 https:// 地址的方式,核心是让 Nginx 能响应 CONNECT example.com:443 请求并透传 TCP 连接。
server {
listen 3128;
resolver 114.114.114.114 ipv6=off;
# 启用 CONNECT 方法支持
proxy_connect;
proxy_connect_allow 443 80; # 允许连接的目标端口
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
# 该 server 块不处理普通 location,只响应 CONNECT
# 所有非 CONNECT 请求将被忽略或返回 405
}✅ 正确使用方式:
- 内网 Linux 机器:
export http_proxy="http://192.168.0.97:3128" export https_proxy="http://192.168.0.97:3128" # 注意仍是 http://,不是 https:// curl -I https://httpbin.org/ip
- Docker:启动容器时加
--proxy http://192.168.0.97:3128 - yum/apt:需在 repo 配置中指定
proxy=http://192.168.0.97:3128
❌ 不支持的功能(务必知悉):
- WebSocket 隧道(如
wss://) - FTP、SOCKS、SMTP 等非 HTTP 协议
- 客户端证书双向认证(mTLS)
- 基于用户身份的细粒度访问控制(如某 IP 只能访问白名单域名)
安全加固建议(非可选,是底线)
-
限制允许连接的目标端口:
proxy_connect_allow 443 80 22,禁用高危端口如 23、1433、3389 -
配置白名单域名(需自定义 Lua 或外部脚本):Nginx 原生不支持域名级黑白名单,可结合
map+if做简单匹配,或用 OpenResty + Lua 实现动态校验 -
关闭无关模块与日志敏感字段:注释掉
server_tokens off;,避免泄露版本;log_format中不记录$request_body或cookie -
绑定监听地址:
listen 192.168.0.97:3128;,禁止0.0.0.0暴露到公网 -
配合防火墙:
iptables -A INPUT -p tcp --dport 3128 -s 172.211.216.0/24 -j ACCEPT,只允许可信内网段访问
不复杂但容易忽略


















