SSH przez HTTPS z proksytunelem i nginx

15

Próbuję skonfigurować połączenie ssh przez połączenie https przy użyciu nginx. Nie znalazłem żadnych działających przykładów, więc każda pomoc będzie mile widziana!

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

Konfiguracja Nginx na serwerze;

~$ 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
źródło

Odpowiedzi:

10

Nginx nie obsługuje przesyłania dalej żądań proxy (metoda HTTP CONNECT), dlatego otrzymujesz odpowiedź „Złe żądanie” od Nginx. Proxytunnel jest w stanie połączyć się z Nginx, ale stamtąd się zatrzymuje. AFAIF, autorzy Nginx nie planują obsługiwać żądań przesyłania dalej proxy, ponieważ lubią specjalizować się w obsłudze HTTP. Apache ma moduły do ​​wszystkiego, co daje swobodę korzystania z tych egzotycznych funkcji.

Możesz spojrzeć na sslh , który może multipleksować ruch przychodzący na porcie 443 do Nginx (nasłuchuje na 127.0.0.1:443), SSH lub OpenVPN. Upewnij się, że sslhzezwalasz na słuchanie pod publicznym adresem IP, a nie na, 0.0.0.0ponieważ pokrywa się to z 127.0.0.1:433miejscem, w którym nasłuchuje Nginx.

Inną opcją jest używanie Squid, ale nie mam tam doświadczenia.

vdboor
źródło
0

Nigdy nie widziałem tego rodzaju konfiguracji i wątpię, czy może ona działać, ponieważ nginx spodziewa się, że będzie w stanie traktować połączenie przychodzące jak HTTP i rozmawiać z nadrzędnym za pomocą HTTP. Dlaczego chcesz korzystać z proxy za pośrednictwem Nginx?

mgorven
źródło
2
Powinno być możliwe - proxytunnel służy do sesji tunel SSH poprzez HTTP (S) pełnomocnictw, Oto konfiguracja skonfigurować to przy użyciu apache
Thermionix
Wydaje się, że Apache działa tam jako rzeczywisty serwer proxy HTTP, co nie wydaje mi się, że obsługuje je nginx (tylko odwrotne proxy).
mgorven
0

To stare pytanie, ale wciąż aktualne :-)

Jak wspomnieli inni, ta konfiguracja jest prawie niedostępna z powodu braku metody HTTP CONNECT dostępnej w Nginx.

UWAGA: Serwer WWW Apache obsługuje tę konfigurację.

Ale dla Nginx istnieje rozwiązanie bez sslh Myślę, że w postaci niestandardowego modułu Nginx, który implementuje HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Korzystając z tego powinieneś być w stanie poprawnie używać w konfiguracji ssh tylko ProxyCommand.

kensai
źródło