SSH melalui HTTPS dengan proxytunnel dan nginx

15

Saya mencoba mengatur koneksi ssh over https menggunakan nginx. Saya belum menemukan contoh yang berfungsi, jadi bantuan apa pun akan dihargai!

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

Konfigurasi nginx di 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
sumber

Jawaban:

10

Nginx tidak mendukung permintaan proxy maju (metode CONNECT HTTP), itulah sebabnya Anda mendapatkan respons "Permintaan buruk" dari Nginx. Proxytunnel dapat terhubung ke Nginx, tetapi dari sana ia berhenti. AFAIF penulis Nginx tidak memiliki rencana untuk mendukung permintaan proxy, karena mereka ingin mengkhususkan diri dalam melayani HTTP dengan sangat baik. Apache memiliki modul untuk semua hal lain, memberi Anda kebebasan untuk menggunakan fitur-fitur eksotis itu.

Anda dapat melihat sslh , yang dapat mengalikan lalu lintas masuk di port 443 ke Nginx (mendengarkan di 127.0.0.1:443), SSH atau OpenVPN. Pastikan Anda membiarkan sslhmendengarkan di alamat IP publik, dan tidak aktif 0.0.0.0karena tumpang tindih dengan 127.0.0.1:433tempat Nginx mendengarkan.

Pilihan lain menggunakan Squid, tapi saya tidak punya pengalaman di sana.

vdboor
sumber
0

Saya belum pernah melihat pengaturan seperti ini dan saya ragu itu bisa bekerja, karena nginx mengharapkan untuk dapat memperlakukan koneksi yang masuk sebagai HTTP dan berbicara dengan upstream dengan HTTP. Mengapa Anda ingin mem-proxy melalui nginx?

Mgorven
sumber
2
Seharusnya dimungkinkan - proxytunnel digunakan untuk menyalurkan sesi SSH melalui proxy HTTP (S), Berikut ini adalah pengaturan untuk mengonfigurasikan ini menggunakan apache
Thermionix
Apache tampaknya beroperasi sebagai proxy HTTP aktual di sana, yang menurut saya tidak mendukung nginx (hanya membalikkan proxy).
mgorven
0

Ini pertanyaan lama, tapi masih aktual :-)

Seperti yang disebutkan orang lain pengaturan ini hampir tidak tersedia karena kurangnya metode HTTP CONNECT yang tersedia di Nginx.

CATATAN: Server web Apache mendukung pengaturan ini.

Tapi, untuk Nginx ada solusi tanpa sslh saya pikir dalam bentuk modul Nginx khusus yang mengimplementasikan HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Dengan menggunakan ini, Anda harus dapat menggunakan ProxyCommand ssh config hanya dengan benar.

kensai
sumber