Đảo ngược đường hầm SSH


8

Tôi đang cố gắng chuyển tiếp lưu lượng truy cập web từ một máy chủ từ xa đến máy cục bộ của mình để kiểm tra một số tích hợp API (tropo, paypal, v.v.). Về cơ bản, tôi đang cố gắng thiết lập một cái gì đó tương tự như những gì tunnlr.com cung cấp.

Tôi đã khởi tạo đường hầm ssh bằng lệnh

$ssh –nNT –R :7777:localhost:5000 user@server

Sau đó tôi có thể thấy rằng máy chủ hiện đang lắng nghe trên cổng 7777 với

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

Vì vậy, nó hoạt động tốt. Yêu cầu curl thực sự được phục vụ từ máy cục bộ.

Bây giờ, làm cách nào để cho phép server.com:8888 được chuyển qua đường hầm đó?

Tôi đã thử sử dụng nginx như vậy:

upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    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;
  }
}

Từ nhật ký lỗi nginx tôi thấy:

[error] 11389#0: *1 connect() failed (111: Connection refused)

Tôi đã xem xét việc thử sử dụng iptables, nhưng không có tiến triển gì. iptablescó vẻ như là một giải pháp tao nhã hơn là chạy nginx chỉ để đào hầm. Bất kỳ trợ giúp nào cũng được đánh giá rất cao. Cảm ơn!

EDIT (thêm thông tin máy chủ)

Chi tiết máy chủ: Ubuntu 10.10 maverick (cài đặt chuẩn)

EDIT (tùy chọn nginx)

Các tùy chọn nginx hoạt động bằng cách thay đổi 0.0.0.0:7777 thành 127.0.0.1:7777 như @Marcel G đề xuất. Vẫn đang tìm giải pháp không nginx mặc dù.

EDIT (cập nhật về giải pháp cuối cùng)

Như @sciurus đã chỉ ra, hãy đảm bảo rằng GatewayPorts yestrong tệp sshd_config của bạn. Ban đầu tôi có dòng này trong tệp cấu hình, nhưng tôi cần phải phát hành /etc/init.d/ssh reloadthay vì restart(ít nhất là có vẻ như vậy trên ubfox).

Lệnh cuối cùng được sử dụng trên máy cục bộ: ssh -nNT -R '*:8888:localhost:5000' user@server

Sau đó, máy chủ sẽ cho biết nó đang nghe trên *: 8888 với lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)

Câu trả lời:


9

Không cần sử dụng nginx.

Trong cấu hình ssh daemon của bạn (cần là / etc / ssh / sshd_config ), đặt GatewayPorts vào clientpecified và tải lại nó. Điều này là cần thiết cho các hệ thống khác để có thể kết nối với đường hầm của bạn. Không có nó, chỉ các chương trình chạy trên máy chủ của bạn mới có thể sử dụng nó.

Bây giờ tất cả những gì bạn cần làm là sửa đổi lệnh ssh của bạn để nghe trên cổng 8888 thay vì cổng 7777. Điều này có thể trông giống như

ssh -nNT -R '*:8888:localhost:5000' user@server

Dấu hoa thị bảo sshd lắng nghe cổng 8888 trên tất cả các giao diện, thay vì chỉ giao diện loopback. Điều này sẽ thất bại nếu bạn không thay đổi GatewayPorts .


Ok, tôi đã chuyển sang đề nghị của bạn và khi tôi curl http://server.com:8888, tôi nhận được lỗi curl: (7) couldn't connect to host. Tôi vẫn có thể cuộn cục bộ localhost: 8888 từ vỏ máy chủ và nó chạm vào máy cục bộ.
chris

btw, tôi đã dừng nginx trước khi thử lệnh mới mà bạn cung cấp.
chris

@chris là GatewayPorts được kích hoạt trong sshd_config của máy chủ của bạn? Nếu không, kích hoạt nó. Sau khi bắt đầu đường hầm, hãy chắc chắn rằng ssh đang lắng nghe nhiều hơn chỉ là địa chỉ loopback; bạn có thể thay thế netstat và grep bằng lsof -i tcp:8888.
sciurus

Tuyệt vời! Vì vậy, tôi đã có GatewayPorts yestrong sshd_config và tôi nghĩ rằng tôi chỉ thực hiện khởi động lại /etc/init.d/ssh, nhưng lần này tôi đã làm reload. Tôi không chắc sự khác biệt là gì, nhưng bây giờ nó hoàn toàn hoạt động !! Cảm ơn một triệu @sciurus.
chris

1

Tôi thứ hai câu trả lời của sciurus nhưng nếu vì lý do nào đó bạn cần sử dụng nginx ... tôi đoán là định nghĩa ngược dòng của bạn bị hỏng.

Cách bạn tạo đường hầm ngược ssh của mình, nó chỉ lắng nghe trên localhost (127.0.0.1 và :: 1), vì vậy bạn có thể muốn thử đưa ra định nghĩa ngược dòng sau:

upstream tunnel {
    server 127.0.0.1:7777;
}

Chỉ để ghi lại: Tôi chưa bao giờ tự cấu hình nginx nên đây chỉ là dự đoán.


Cảm ơn! Điều này thực sự làm cho nó hoạt động. Nếu có thể tôi vẫn không thích sử dụng nginx chỉ để hoạt động đào hầm, nhưng thật tốt khi biết rằng điều đó là có thể
chris
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.