SSH su HTTPS con proxytunnel e nginx


15

Sto cercando di impostare una connessione SSH su HTTPS utilizzando nginx. Non ho trovato esempi funzionanti, quindi qualsiasi aiuto sarebbe apprezzato!

~$ 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 config sul server;

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

Risposte:


10

Nginx non supporta le richieste proxy forward (il metodo HTTP CONNECT), motivo per cui si ottiene la risposta "Richiesta non valida" da Nginx. Proxytunnel è in grado di connettersi a Nginx, ma da lì si ferma. AFAIF, gli autori di Nginx non hanno in programma di supportare richieste proxy in avanti, in quanto amano essere specializzati nel servire l'HTTP davvero bene. Apache ha moduli per tutto il resto, dandoti la libertà di usare quelle caratteristiche esotiche.

Puoi guardare sslh , che può multiplexare il traffico in entrata sulla porta 443 verso Nginx (ascoltando 127.0.0.1:443), SSH o OpenVPN. Assicurati di consentire l' sslhascolto all'indirizzo IP pubblico e non 0.0.0.0attivo poiché si sovrappone al punto in 127.0.0.1:433cui Nginx è in ascolto.

Un'altra opzione è usare Squid, ma non ho esperienza lì.


0

Non ho mai visto questo tipo di installazione e dubito che possa funzionare, perché nginx prevede di essere in grado di trattare la connessione in arrivo come HTTP e di parlare con l'upstream con HTTP. Perché vuoi fare il proxy tramite nginx?


2
Dovrebbe essere possibile - proxytunnel viene utilizzato per eseguire il tunneling delle sessioni SSH tramite proxy HTTP (S), Ecco l'impostazione per configurarlo utilizzando apache
Thermionix

Apache sembra funzionare come un vero proxy HTTP lì, che non credo che nginx supporti (solo il proxy inverso).
mgorven

0

Questa è una vecchia domanda, ma ancora attuale :-)

Come altri hanno già detto, questa configurazione difficilmente sarà disponibile a causa della mancanza del metodo HTTP CONNECT disponibile in Nginx.

NOTA: il server Web Apache supporta questa configurazione.

Ma, per Nginx esiste una soluzione senza SSL, penso in forma di modulo Nginx personalizzato che implementa HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Usando questo dovresti essere in grado di usare correttamente nella configurazione di ssh solo ProxyCommand.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.