SSH por HTTPS com proxytunnel e nginx

15

Estou tentando configurar uma conexão ssh sobre https usando o nginx. Eu não encontrei nenhum exemplo de trabalho, então 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 "-" "-"
    
por Thermionix 31.01.2012 / 02:20

3 respostas

9

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. Proxytunnel é capaz de se conectar ao Nginx, mas a partir daí ele para. Os autores do NFAx da AFAIF não têm planos de suportar pedidos de proxy de reencaminhamento, uma vez que gostam de ser especializados em servir HTTP muito bem. O Apache tem módulos para todo o resto, dando a você 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 (ouvindo 127.0.0.1:443), SSH ou OpenVPN. Certifique-se de deixar sslh escutar no endereço IP público, e não em 0.0.0.0 que se sobrepõe a 127.0.0.1:433 onde o Nginx está escutando.

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

    
por 09.10.2012 / 16:42
0

Eu nunca vi esse tipo de configuração e duvido que possa funcionar, porque o nginx espera poder tratar a conexão de entrada como HTTP e falar com o upstream com HTTP. Por que você quer fazer proxy através do nginx?

    
por 26.03.2012 / 02:54
0

Essa é uma pergunta antiga, mas ainda assim real: -)

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

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

Mas, para o Nginx, existe uma solução sem o sslh Eu acho que na forma de módulo Nginx customizado que implementa o HTTP CONNECT: link

Ao usar isso, você deve ser capaz de usar em sua configuração ssh apenas ProxyCommand corretamente.

    
por 22.06.2017 / 13:03