SSH sobre HTTPS com proxytunnel e nginx

15

Estou tentando configurar uma conexão ssh over https usando nginx. Não encontrei nenhum exemplo de trabalho; portanto, qualquer ajuda seria apreciada!

~$ 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

Configuração do Nginx no servidor;

~$ 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 "-" "-"
Thermionix
fonte

Respostas:

10

O Nginx não suporta solicitações de proxy de encaminhamento (o método HTTP CONNECT), e é por isso que você obtém a resposta "Solicitação incorreta" do Nginx. O Proxytunnel pode se conectar ao Nginx, mas a partir daí ele para. Os autores do AFAIF, Nginx, não têm planos de oferecer suporte a solicitações de proxy de encaminhamento, pois gostam de ser especializados em servir HTTP muito bem. O Apache possui módulos para todo o resto, oferecendo a liberdade de usar esses recursos exóticos.

Você pode olhar para sslh , que pode multiplexar o tráfego de entrada na porta 443 para o Nginx (escutando 127.0.0.1:443), SSH ou OpenVPN. Certifique-se de deixar sslhescutar o endereço IP público, e não ligar, 0.0.0.0pois ele se sobrepõe ao 127.0.0.1:433local em que o Nginx está escutando.

Outra opção é usar o Squid, mas não tenho experiência lá.

vdboor
fonte
0

Nunca vi esse tipo de configuração e duvido que funcione, porque o nginx espera poder tratar a conexão recebida como HTTP e conversar com o upstream com HTTP. Por que você deseja fazer proxy através do nginx?

mgorven
fonte
2
Deve ser possível - ProxyTunnel é usado para sessões de túnel SSH através de HTTP (S) proxies, Aqui é a configuração para configurar isso usando apache
Thermionix
O Apache parece estar operando como um proxy HTTP real lá, o que não acho que o nginx suporte (apenas proxy reverso).
mgorven
0

Esta é uma pergunta antiga, mas ainda atual :-)

Como outros usuários mencionaram, essa configuração dificilmente estará disponível devido à falta do método HTTP CONNECT disponível no Nginx.

NOTA: O servidor da web Apache suporta essa configuração.

Mas, para o Nginx, existe uma solução sem sslh, eu acho que na forma do módulo Nginx personalizado que implementa o HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Ao usar isso, você poderá usar em seu ssh config apenas o ProxyCommand corretamente.

kensai
fonte