Proxytunnel ve nginx ile HTTPS üzerinden SSH


15

Ben nginx kullanarak https bağlantısı üzerinden bir ssh kurmaya çalışıyorum. Herhangi bir çalışma örneği bulamadım, bu yüzden herhangi bir yardım takdir edilecektir!

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

Sunucuda Nginx yapılandırması;

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

Yanıtlar:


10

Nginx, ileri proxy isteklerini (HTTP CONNECT yöntemi) desteklemez, bu nedenle Nginx'ten "Kötü istek" yanıtı alırsınız. Proxytunnel Nginx'e bağlanabilir, ancak oradan durur. AFAIF, Nginx yazarlarının ileri düzey proxy isteklerini destekleme planları yoktur, çünkü HTTP'yi gerçekten iyi sunma konusunda uzmanlaşmak isterler. Apache'nin her şey için modülleri vardır, bu egzotik özellikleri kullanma özgürlüğü verir.

443 numaralı bağlantı noktasından gelen trafiği Nginx (127.0.0.1:443 dinleme), SSH veya OpenVPN ile çoğaltabilecek sslh'ye bakabilirsiniz . Nginx'in dinlediği yerle çakıştığından sslh, herkese açık IP adresinden dinlemenize izin verin .0.0.0.0127.0.0.1:433

Başka bir seçenek Squid kullanıyor, ama orada hiçbir deneyimim yok.


0

Bu tür bir kurulum görmedim ve çalışabileceğinden şüpheliyim, çünkü nginx gelen bağlantıya HTTP gibi davranmayı ve HTTP ile yukarı akışla konuşmayı bekliyor. Neden nginx ile proxy yapmak istiyorsunuz?


2
Bu mümkün olmalıdır - ProxyTunnel HTTP (S) proxy üzerinden tünel SSH oturumları için kullanılır, burada kurulduğundan apache kullanarak bu yapılandırma
Thermionix

Apache orada gerçek bir HTTP proxy olarak çalışıyor gibi görünüyor, ki ben nginx destekliyor sanmıyorum (sadece ters proxy).
mgorven

0

Bu eski bir soru, ama yine de gerçek :-)

Diğerlerinin de belirttiği gibi, bu kurulum Nginx'te mevcut HTTP CONNECT yönteminden yoksun olduğu için mevcut değildir.

NOT: Apache web sunucusu bu kurulumu destekler.

Ancak, Nginx için sslh'siz bir çözüm var, HTTP CONNECT'i uygulayan özel Nginx modülü şeklinde düşünüyorum: https://github.com/chobits/ngx_http_proxy_connect_module

Bunu kullanarak ssh config sadece ProxyCommand düzgün kullanmak mümkün olmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.