Nginx默认不支持HTTPS正向代理,因其原生不处理CONNECT方法;必须编译加载ngx_http_proxy_connect_module模块,配置专用server块监听普通端口(如3128),启用proxy_connect指令并限制proxy_connect_allow 443 563,配合resolver、访问控制、扩展日志等满足安全审计要求。

不能直接用默认Nginx配HTTPS正向代理。它原生不支持CONNECT方法,而这是HTTPS出网必须的底层机制——浏览器或yum等工具访问https://地址时,第一步就是发CONNECT请求建隧道。没这个能力,所有HTTPS流量都会失败(常见报错:ERR_TUNNEL_CONNECTION_FAILED 或 405 Method Not Allowed)。
必须加装 ngx_http_proxy_connect_module 模块
这是实现合规、可审计的HTTPS正向代理的前提。仅靠 proxy_pass + ssl_certificate 的配置,本质是反向代理写法,会让Nginx充当TLS终结点,既暴露内网客户端真实意图,也破坏端到端加密,不符合安全审计要求。
- 从 GitHub 获取 ngx_http_proxy_connect_module 源码,并确认其与你使用的 Nginx 版本兼容
- 下载对应 Nginx 源码包,应用模块提供的补丁(如 patch -p1 < connect.patch)
- 编译时显式启用:
./configure --with-http_ssl_module --add-module=./modules/ngx_http_proxy_connect_module - 安装后验证:
nginx -V 2>&1 | grep -o connect应输出含 connect 字样
监听专用端口并启用 CONNECT 处理
HTTPS正向代理需独立 server 块,监听普通端口(如 3128 或 8080),不配 SSL 证书——因为隧道是透传的,Nginx 不解密也不重签。
- 配置中必须包含
proxy_connect指令,激活隧道能力 - 用
proxy_connect_allow 443 563;限制只允许连标准 HTTPS/SSL 端口,防滥用 - 指定 DNS 解析器,如
resolver 114.114.114.114 valid=30s;,避免因 DNS 导致连接失败 - 不要配
ssl_certificate,否则会触发 HTTP 421 错误或握手异常
满足安全审计的关键增强项
纯联通只是起点,审计要求的是“谁、何时、访问了哪个域名、是否成功”。Nginx 默认日志不记录 CONNECT 目标,需手动扩展。
- 在 log_format 中加入
$request_body无意义(CONNECT 无 body),应使用$http_host和$request提取 CONNECT 行,例如:log_format proxy_log '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_user_agent"'; - 添加访问控制:用
allow/deny限定只有内网 IP 可连代理端口;或结合 geo 指令做 IP 分组管理 - 引入白名单机制:用 map 指令配合 include 文件,动态控制允许访问的域名,例如只允许 yum.repo 或 Docker Hub 域名
- 开启 access_log 并定期轮转,确保日志留存满足审计周期(如 180 天)
客户端配置与验证要点
内网主机必须显式设置代理,且协议必须为 http://(不是 https://),即使目标是 HTTPS 网站。
- Linux 系统级:设置
export http_proxy="http://nginx-ip:3128"和export https_proxy="http://nginx-ip:3128" - yum:在 /etc/yum.conf 中添加
proxy=http://nginx-ip:3128 - 验证命令:
curl -x http://nginx-ip:3128 https://httpbin.org/ip,返回外网出口 IP 即通 - 检查 Nginx access_log,应看到类似
"CONNECT httpbin.org:443 HTTP/1.1" 200的记录


















