使用proxytunnel和nginx通过HTTPS进行SSH


15

我正在尝试使用nginx通过https连接设置ssh。我还没有找到任何可行的示例,因此将不胜感激!

~$ 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 user@example.net
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 "-" "-"

Answers:


10

Nginx不支持转发代理请求(HTTP CONNECT方法),这就是为什么您从Nginx收到“错误请求”响应的原因。Proxytunnel可以连接到Nginx,但是从那里停止。AFAIF Nginx作者没有计划支持转发代理请求,因为他们希望真正专注于很好地服务于HTTP。Apache具有用于其他所有功能的模块,使您可以自由使用这些奇特的功能。

您可以查看sslh,它可以将端口443上的传入流量多路复用到Nginx(侦听127.0.0.1:443)、SSH或OpenVPN。请确保你让sslh听的公网IP地址,而不是0.0.0.0与重叠127.0.0.1:433,其中Nginx的是听。

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


0

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


2
应该有可能-proxytunnel用于通过HTTP(S)代理建立 SSH会话隧道,以下是使用apache进行配置的设置
Thermionix'3

Apache似乎在那里作为实际的HTTP代理运行,我认为nginx不支持(仅反向代理)。
mgorven 2012年

0

这是个老问题,但仍然是实际的:-)

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

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

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

通过使用此选项,您应该只能在ssh配置中仅使用ProxyCommand。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.