SSH qua HTTPS với proxytunnel và nginx


15

Tôi đang cố gắng thiết lập ssh qua kết nối https bằng nginx. Tôi đã không tìm thấy bất kỳ ví dụ làm việc, vì vậy bất kỳ trợ giúp sẽ được đánh giá cao!

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

Nginx config trên máy chủ;

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

Câu trả lời:


10

Nginx không hỗ trợ các yêu cầu proxy chuyển tiếp (phương thức HTTP CONNECT), đó là lý do tại sao bạn nhận được phản hồi "Yêu cầu xấu" từ Nginx. Proxytunnel có thể kết nối với Nginx, nhưng từ đó nó dừng lại. AFAIF các tác giả Nginx không có kế hoạch hỗ trợ các yêu cầu proxy chuyển tiếp, vì họ muốn được chuyên môn hóa trong việc phục vụ HTTP thực sự tốt. Apache có các mô-đun cho mọi thứ khác, cho bạn tự do sử dụng các tính năng kỳ lạ đó.

Bạn có thể xem sslh , có thể ghép lưu lượng truy cập đến tại cổng 443 sang Nginx (nghe tại 127.0.0.1:443), SSH hoặc OpenVPN. Hãy chắc chắn rằng bạn cho phép sslhnghe tại địa chỉ IP công cộng chứ không phải 0.0.0.0vì nó trùng với 127.0.0.1:433nơi Nginx đang nghe.

Một lựa chọn khác là sử dụng Squid, nhưng tôi không có kinh nghiệm ở đó.


0

Tôi chưa bao giờ thấy loại thiết lập này và tôi nghi ngờ rằng nó có thể hoạt động, bởi vì nginx hy vọng có thể coi kết nối đến là HTTP và nói chuyện ngược dòng với HTTP. Tại sao bạn muốn proxy qua nginx?


2
Nên có thể - proxytunnel được sử dụng để tạo các phiên SSH thông qua các proxy HTTP (S), Đây là thiết lập để định cấu hình này bằng cách sử dụng apache
Thermionix

Apache dường như đang hoạt động như một proxy HTTP thực tế ở đó, mà tôi không nghĩ rằng nginx hỗ trợ (chỉ ủy quyền ngược).
mgorven

0

Đây là câu hỏi cũ, nhưng vẫn còn thực tế :-)

Như những người khác đã đề cập, thiết lập này hầu như không có sẵn do thiếu phương pháp HTTP CONNECT có sẵn trong Nginx.

LƯU Ý: Máy chủ web Apache hỗ trợ thiết lập này.

Nhưng, đối với Nginx, có giải pháp mà không có sslh, tôi nghĩ ở dạng mô-đun Nginx tùy chỉnh thực hiện HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Bằng cách sử dụng này, bạn sẽ chỉ có thể sử dụng trong cấu hình ssh của mình đúng ProxyCommand.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.