如何用NGINX配置HTTP CONNECT转SSH代理?配置失败求助
解决方案
该方案完全可行,你的NGINX配置存在两处关键错误:
错误点分析
- 缺少监听与SSL配置:
ssh.example.org虚拟主机未配置SSL和监听端口,你用80端口测试,但基于HTTPS的SSH隧道需要443端口+有效SSL证书,否则无法正常建立加密隧道。 proxy_connect_address配置错误:该指令用于反向代理场景下指定固定目标,而你的场景是让NGINX作为正向代理处理CONNECT请求,不需要硬编码目标,应让NGINX根据请求中的目标地址转发。
修正后的NGINX配置(NixOS)
nginx = { enable = true; recommendedProxySettings = true; recommendedTlsSettings = true; recommendedGzipSettings = true; recommendedBrotliSettings = true; recommendedZstdSettings = true; recommendedOptimisation = true; additionalModules = [ pkgs.nginxModules.http_proxy_connect_module_v24 ]; virtualHosts = { "example.org" = { root = "/var/www/example.org"; enableACME = true; forceSSL = true; }; "ssh.example.org" = { enableACME = true; forceSSL = true; extraConfig = '' # 启用CONNECT方法支持 proxy_connect; # 仅允许转发到SSH端口(对应Apache的AllowConnect 22) proxy_connect_allow 22; # 限制仅本地IP发起请求(对应Apache的Proxy权限规则) allow 127.0.0.1; deny all; ''; }; }; };
修正后的测试命令
因为改用HTTPS的443端口,测试命令需调整为:
proxytunnel.exe -v -q -p 127.0.0.1:54450 -r ssh.example.org:443 -d 127.0.0.1:22
关键配置说明
proxy_connect:启用NGINX对CONNECT方法的支持,这是实现正向代理隧道的核心。proxy_connect_allow 22:仅允许转发到22端口(SSH服务端口),比all更安全,对应Apache的AllowConnect 22。enableACME+forceSSL:确保子域名拥有有效SSL证书,满足基于HTTPS的SSH隧道加密需求。allow 127.0.0.1; deny all;:限制仅本地IP可发起代理请求,对应Apache的<Proxy>权限控制,提升安全性。
405错误原因
原配置中,ssh.example.org虚拟主机未正确处理HTTPS请求,且proxy_connect_address硬编码目标地址导致NGINX无法正确解析CONNECT请求的目标,最终返回“方法不允许”的405错误。修正后,NGINX会正确处理CONNECT请求并转发到指定的SSH端口。
内容的提问来源于stack exchange,提问作者FrostKiwi
相关产品推荐
相关产品推荐

