SSH sobre HTTPS con proxytunnel y nginx

15

Estoy tratando de configurar un ssh a través de la conexión https usando nginx. No he encontrado ningún ejemplo de trabajo, por lo que agradecería cualquier ayuda.

~$ 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 config en el 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
fuente

Respuestas:

10

Nginx no admite solicitudes de proxy de reenvío (el método HTTP CONNECT), por lo que obtiene la respuesta "Solicitud incorrecta" de Nginx. Proxytunnel puede conectarse a Nginx, pero desde allí se detiene. AFAIF, los autores de Nginx no tienen planes de admitir solicitudes de proxy de reenvío, ya que les gusta estar especializados en servir HTTP realmente bien. Apache tiene módulos para todo lo demás, dándole la libertad de usar esas características exóticas.

Puede mirar sslh , que puede multiplexar el tráfico entrante en el puerto 443 a Nginx (escuchando en 127.0.0.1:443), SSH u OpenVPN. Asegúrate de dejar sslhescuchar en la dirección IP pública, y no 0.0.0.0cuando se superpone con el lugar 127.0.0.1:433donde Nginx está escuchando.

Otra opción es usar Squid, pero no tengo experiencia allí.

vdboor
fuente
0

Nunca he visto este tipo de configuración y dudo que pueda funcionar, porque nginx espera poder tratar la conexión entrante como HTTP y hablar con HTTP en sentido ascendente. ¿Por qué quieres usar proxy a través de nginx?

mgorven
fuente
2
Debería ser posible: el proxytunnel se usa para tunelizar sesiones SSH a través de proxy HTTP (S). Aquí está la configuración para configurar esto usando apache
Thermionix
Apache parece estar operando como un proxy HTTP real allí, lo que no creo que sea compatible con nginx (solo proxy inverso).
mgorven
0

Esta es una pregunta antigua, pero sigue siendo real :-)

Como otros mencionaron, esta configuración difícilmente estará disponible debido a la falta de método HTTP CONNECT disponible en Nginx.

NOTA: el servidor web Apache admite esta configuración.

Pero, para Nginx hay una solución sin sslh, creo en forma de módulo Nginx personalizado que implementa HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Al usar esto, debería poder usar en su configuración ssh solo ProxyCommand correctamente.

kensai
fuente