使用 proxytunnel 和 nginx 通过 HTTPS 进行 SSH

使用 proxytunnel 和 nginx 通过 HTTPS 进行 SSH

我正在尝试使用 nginx 设置 ssh over https 连接。我还没有找到任何可行的示例,所以任何帮助都将不胜感激!

~$ cat .ssh/config
Host example.net
  Hostname example.net
  ProtocolKeepAlives 30
  DynamicForward 8118
  ProxyCommand /usr/bin/proxytunnel -p ssh.example.net:443 -d localhost:22 -E -v -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)"

~$ ssh [email protected]
Local proxy ssh.example.net resolves to 115.xxx.xxx.xxx
Connected to ssh.example.net:443 (local proxy)

Tunneling to localhost:22 (destination)
Communication with local proxy:
 -> CONNECT localhost:22 HTTP/1.0
 -> Proxy-Connection: Keep-Alive
 -> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)
 <- <html>
 <- <head><title>400 Bad Request</title></head>
 <- <body bgcolor="white">
 <- <center><h1>400 Bad Request</h1></center>
 <- <hr><center>nginx/1.0.5</center>
 <- </body>
 <- </html>
analyze_HTTP: readline failed: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host

服务器上的 Nginx 配置;

~$ cat /etc/nginx/sites-enabled/ssh 
upstream tunnel {
    server localhost:22;
}
server {
    listen 443;
    server_name ssh.example.net;

    location / {
            proxy_pass http://tunnel;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_redirect off;
    }

    ssl on;
    ssl_certificate /etc/ssl/certs/server.cer;
    ssl_certificate_key /etc/ssl/private/server.key;
}

~$ tail /var/log/nginx/access.log
203.xxx.xxx.xxx - - [08/Feb/2012:15:17:39 +1100] "CONNECT localhost:22 HTTP/1.0" 400 173 "-" "-"

答案1

Nginx 不支持正向代理请求(HTTP CONNECT 方法),这就是为什么您会从 Nginx 收到“错误请求”响应。Proxytunnel 能够连接到 Nginx,但从那里停止。据我所知,Nginx 作者没有计划支持正向代理请求,因为他们喜欢专门提供出色的 HTTP 服务。Apache 拥有其他所有模块,让您可以自由使用这些奇特的功能。

你可以看看安全组,它可以将端口 443 的传入流量多路复用到 Nginx(监听 127.0.0.1:443)、SSH 或 OpenVPN。请确保sslh在公网 IP 地址上监听,而不是开启,因为那与Nginx 监听的位置0.0.0.0重叠。127.0.0.1:433

另一个选择是使用 Squid,但我没有这方面的经验。

答案2

这是一个老问题,但仍然是现实:-)

正如其他人提到的,由于 Nginx 缺少 HTTP CONNECT 方法,因此此设置几乎不可用。

注意:Apache 网络服务器支持此设置。

但是,对于 Nginx,我认为有一个无需 sslh 的解决方案,即以实现 HTTP CONNECT 的自定义 Nginx 模块的形式: https://github.com/chobits/ngx_http_proxy_connect_module

通过使用它,您应该能够在 ssh 配置中正确使用 ProxyCommand。

答案3

我从未见过这种设置,我怀疑它能否工作,因为 nginx 期望能够将传入的连接视为 HTTP,并使用 HTTP 与上游通信。为什么要通过 nginx 进行代理?

相关内容