You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用NGINX配置HTTP CONNECT转SSH代理?配置失败求助

解决方案

该方案完全可行,你的NGINX配置存在两处关键错误:

错误点分析

  1. 缺少监听与SSL配置:ssh.example.org虚拟主机未配置SSL和监听端口,你用80端口测试,但基于HTTPS的SSH隧道需要443端口+有效SSL证书,否则无法正常建立加密隧道。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:06:01