SSH sur HTTPS avec proxytunnel et nginx

15

J'essaie de configurer une connexion ssh sur https en utilisant nginx. Je n'ai trouvé aucun exemple de travail, donc toute aide serait appréciée!

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

Configuration Nginx sur le serveur;

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

Réponses:

10

Nginx ne prend pas en charge les demandes de proxy de transfert (la méthode HTTP CONNECT), c'est pourquoi vous obtenez la réponse «Bad request» de Nginx. Proxytunnel est capable de se connecter à Nginx, mais à partir de là, il s'arrête. AFAIF les auteurs de Nginx n'ont pas l'intention de prendre en charge les demandes de proxy de transfert, car ils aiment être très spécialisés dans le service HTTP. Apache a des modules pour tout le reste, vous donnant la liberté d'utiliser ces fonctionnalités exotiques.

Vous pouvez regarder sslh , qui peut multiplexer le trafic entrant au port 443 vers Nginx (écoute à 127.0.0.1:443), SSH ou OpenVPN. Assurez-vous de laisser sslhécouter à l'adresse IP publique et non pas 0.0.0.0car cela chevauche l' 127.0.0.1:433endroit où Nginx écoute.

Une autre option consiste à utiliser Squid, mais je n'y ai aucune expérience.

vdboor
la source
0

Je n'ai jamais vu ce genre de configuration et je doute que cela puisse fonctionner, car nginx s'attend à pouvoir traiter la connexion entrante comme HTTP et parler à l'amont avec HTTP. Pourquoi voulez-vous effectuer un proxy via nginx?

mgorven
la source
2
Cela devrait être possible - proxytunnel est utilisé pour tunneler les sessions SSH via des proxy HTTP (S), voici la configuration pour configurer cela en utilisant apache
Thermionix
Apache semble fonctionner comme un proxy HTTP réel là-bas, ce que je ne pense pas que nginx supporte (uniquement le proxy inverse).
mgorven
0

C'est une vieille question, mais toujours d'actualité :-)

Comme d'autres l'ont mentionné, cette configuration n'est guère disponible en raison du manque de méthode HTTP CONNECT disponible dans Nginx.

REMARQUE: le serveur Web Apache prend en charge cette configuration.

Mais, pour Nginx, il existe une solution sans SSL, je pense sous la forme d'un module Nginx personnalisé qui implémente HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

En l'utilisant, vous devriez pouvoir utiliser correctement dans votre configuration ssh uniquement ProxyCommand.

kensai
la source