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

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

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.


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?


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.