SSH über HTTPS mit Proxytunnel und Nginx

15

Ich versuche, eine SSH über https-Verbindung mit Nginx einzurichten. Ich habe keine funktionierenden Beispiele gefunden, daher wäre jede Hilfe dankbar!

~$ 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-Konfiguration auf dem 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 "-" "-"
Thermionix
quelle

Antworten:

10

Nginx unterstützt keine Forward-Proxy-Anforderungen (die HTTP-CONNECT-Methode), weshalb Sie die Antwort "Bad request" von Nginx erhalten. Proxytunnel kann eine Verbindung zu Nginx herstellen, stoppt jedoch von dort aus. AFAIF Die Nginx-Autoren haben nicht die Absicht, Forward-Proxy-Anfragen zu unterstützen, da sie gerne darauf spezialisiert sind, HTTP wirklich gut zu bedienen. Apache verfügt über Module für alles andere, sodass Sie diese exotischen Funktionen nutzen können.

Sie können sich sslh ansehen , das den eingehenden Datenverkehr an Port 443 auf Nginx (Abhören mit 127.0.0.1:443), SSH oder OpenVPN multiplexen kann. Stellen Sie sicher, dass Sie sslhdie öffentliche IP-Adresse abhören lassen und nicht "Ein", 0.0.0.0da diese sich mit der 127.0.0.1:433Abhörposition von Nginx überschneidet .

Eine andere Möglichkeit ist die Verwendung von Squid, aber ich habe dort keine Erfahrung.

vdboor
quelle
0

Ich habe diese Art von Setup noch nie gesehen und bezweifle, dass es funktionieren kann, da nginx erwartet, die eingehende Verbindung als HTTP zu behandeln und mit dem Upstream über HTTP zu kommunizieren. Warum möchten Sie durch Nginx Proxy?

mgorven
quelle
2
Es sollte möglich sein - Proxytunnel wird zum Tunneln von SSH-Sitzungen über HTTP (S) -Proxies verwendet. Hier ist das Setup , um dies mit Apache zu konfigurieren
Thermionix
Apache scheint dort als eigentlicher HTTP-Proxy zu funktionieren, was meiner Meinung nach nginx nicht unterstützt (nur Reverse-Proxying).
mgorven
0

Das ist eine alte Frage, aber immer noch aktuell :-)

Wie bereits erwähnt, ist dieses Setup aufgrund der fehlenden HTTP CONNECT-Methode in Nginx kaum verfügbar.

HINWEIS: Der Apache-Webserver unterstützt dieses Setup.

Aber für Nginx gibt es eine Lösung ohne SSL, denke ich in Form eines benutzerdefinierten Nginx-Moduls, das HTTP CONNECT implementiert: https://github.com/chobits/ngx_http_proxy_connect_module

Wenn Sie dies verwenden, sollten Sie in der Lage sein, in Ihrer ssh-Konfiguration nur ProxyCommand ordnungsgemäß zu verwenden.

Kensai
quelle