必须使用第三方模块 ngx_http_proxy_connect_module 才能在 nginx 正向代理中实现 connect 请求的用户名密码认证,原生 auth_basic 对 https 隧道无效;需源码编译添加模块,配置 proxy_connect、端口白名单及 bcrypt 加密密码文件,并叠加 ip 白名单与审计日志。

直接在标准 Nginx 中为正向代理配置有效的用户名密码认证,不能仅靠 auth_basic 指令实现。因为正向代理的核心——HTTPS 流量依赖的 CONNECT 请求,在原生 Nginx 中不触发常规 HTTP 处理流程,auth_basic 对其完全无效。若未做适配,攻击者可绕过认证直连隧道,导致代理被公开滥用。
必须启用支持 CONNECT 鉴权的模块
要让基础认证真正生效于正向代理连接阶段,需使用第三方模块 ngx_http_proxy_connect_module:
- 该模块在
CONNECT请求到达时介入,支持在建立隧道前执行 auth_basic 或自定义校验逻辑 - 官方 Nginx 编译包不包含此模块,必须从源码编译并显式添加:
--add-module=/path/to/ngx_http_proxy_connect_module - 验证是否加载成功:运行
nginx -V 2>&1 | grep -o connect,应有输出
正确配置带认证的 CONNECT 代理
在 server 块中启用模块并绑定认证,示例配置如下:
-
listen 3128;—— 指定代理监听端口(避免常用端口如 8080 被扫描) -
proxy_connect;—— 启用 CONNECT 方法支持(该指令由模块提供) -
proxy_connect_allow 443 993 995;—— 仅放行 HTTPS、IMAPS、SMTAPS 等业务必需端口,禁用 25、22、3389 等高危端口 auth_basic "Proxy Access Required";-
auth_basic_user_file /etc/nginx/.proxy_users;—— 密码文件需用htpasswd -B生成 bcrypt 加密格式(比 crypt 更安全)
强化访问控制与日志审计
认证只是第一道门,还需叠加网络层和行为层防护:
-
严格限制来源 IP:在 server 块内用
allow/deny白名单,例如:allow 192.168.20.0/24; deny all;,禁用allow all -
记录关键审计字段:自定义 log_format,确保日志含
$remote_addr(真实客户端IP)、$remote_user(认证用户名)、$http_host(CONNECT 目标域名)、$status和$request_time -
拒绝非 CONNECT 请求:添加
if ($request_method !~ ^(CONNECT)$) { return 405; },防止被误用为反向代理或缓存服务
替代方案:改用反向代理模式(更稳妥)
若无法编译定制模块,推荐放弃“透明正向代理”,转为客户端显式配置的反向代理模式:
- 客户端设置
http_proxy=http://proxy.example.com:8080/ - Nginx 接收普通 HTTP 请求(非 CONNECT),
auth_basic可完整生效 - 配合
proxy_pass http://$host$request_uri;+ 动态resolver实现目标转发 - 虽不兼容浏览器自动代理(PAC),但对 curl、wget、CI 工具等命令行场景完全可用,且安全性更高











