Làm thế nào để làm cho đường hầm ssh mở cho công chúng?


174

Vâng, tham khảo lại câu hỏi này , tôi đang chạy lệnh

ssh -R 8080:localhost:80 -N root@example.com

trên máy Mac. Tuy nhiên, cảng đang được đào hầm không hoạt động công khai. Tôi đang chạy một lệnh như vậy để làm cho nó để cổng cục bộ có thể được mở trên máy tính từ xa. Và nó hoạt động khi mở cổng trên localhost trên máy tính từ xa, nhưng khi tôi cố truy cập địa chỉ IP công cộng của máy tính từ xa từ máy tính cục bộ của tôi thì cổng dường như không mở. Làm cách nào để đặt đường hầm công khai trên IP cho mọi người truy cập?

EDIT: Có vẻ như nếu phía từ xa chỉ liên kết trên localhost thay vì tất cả các giao diện.

EDIT 2: Máy khách là Mac OS X 10.6 và máy chủ là Linux Mint, nhưng cả hai đều là OpenSSH.


IP công cộng có nghĩa là gì? Nếu bạn đang cố gắng kết nối với một máy tính cục bộ thông qua bộ định tuyến và thông qua Internet, hầu hết các bộ định tuyến sẽ không cho phép loopback như vậy.
harrymc

Câu trả lời:


351

Nếu bạn kiểm tra trang man cho ssh, bạn sẽ thấy rằng cú pháp để -Rđọc:

-R [ bind_address :] port : host : hostport

Khi bind_addressđược bỏ qua (như trong ví dụ của bạn), cổng chỉ bị ràng buộc trên giao diện loopback. Để làm cho nó liên kết với tất cả các giao diện, sử dụng

ssh -R \*:8080:localhost:80 -N root@example.com

hoặc là

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

hoặc là

ssh -R "[::]:8080:localhost:80" -N root@example.com

Phiên bản đầu tiên liên kết với tất cả các giao diện riêng lẻ. Phiên bản thứ hai tạo ra một ràng buộc chung chỉ dành cho IPv4, có nghĩa là cổng có thể truy cập được trên tất cả các giao diện thông qua IPv4. Phiên bản thứ ba có thể tương đương về mặt kỹ thuật với phiên bản đầu tiên, nhưng một lần nữa, nó chỉ tạo ra một liên kết duy nhất ::, có nghĩa là cổng có thể truy cập thông qua IPv6 và qua IPv4 thông qua các địa chỉ IPv6 được ánh xạ IPv4 (không hoạt động trên Windows, OpenBSD) . (Bạn cần các trích dẫn vì [::]có thể được hiểu là một quả địa cầu khác.)

Lưu ý rằng nếu bạn sử dụng sshdmáy chủ OpenSSH , GatewayPortstùy chọn của máy chủ cần được bật (được đặt thành yeshoặc clientspecified) để điều này hoạt động (kiểm tra tệp /etc/ssh/sshd_configtrên máy chủ). Mặt khác (giá trị mặc định cho tùy chọn này là no), máy chủ sẽ luôn buộc cổng chỉ bị ràng buộc trên giao diện loopback.


12
OH MY THIÊN CHÚA LÀM VIỆC !!!!! Tôi đã thực hiện chính xác 1 triệu lần đó !! Tôi chỉ quên rằng *trong bash sẽ cung cấp các tệp và tôi cần\*
Trevor Rudolph

4
Vâng, đó chính xác là lý do tại sao tôi luôn thích 0.0.0.0- chỉ có IPv4, nhưng nó sẽ làm hầu hết thời gian :)
Stefan Seidel

34
GatewayPorts đã giải quyết vấn đề của tôi.
Sunry

4
GatewayPorts = yes (trên cấu hình sshd từ xa) cũng đã sửa nó cho tôi
Phil_1984_

3
"GatewayPorts yes" đã làm nên ngày của tôi, cảm ơn @StefanSeidel
karser

37

Biên tập:

-g hoạt động cho các cổng chuyển tiếp cục bộ, nhưng những gì bạn muốn là một cổng chuyển tiếp ngược / từ xa, thì khác.

Những gì bạn muốn là điều này .

Về cơ bản, trên example.com, thiết lập GatewayPorts=clientspecifiedtrong /etc/ssh/sshd_config.

--- câu trả lời trước (không chính xác) ---

Sử dụng tùy chọn -g. Từ trang người đàn ông của ssh:

-g     Allows remote hosts to connect to local forwarded ports.

dường như không hoạt động ... nó khởi động nhưng tôi không thể kết nối từ xa
Trevor Rudolph

2
Hãy thử chạy netstat -elnpttừ một tty riêng để tìm ra cổng nào bị ràng buộc với địa chỉ nào. Không có -g, một cổng nên bị ràng buộc 127.0.0.1:PORT. Với -g, nó nên được ràng buộc 0.0.0.0:PORT, mà làm cho nó có thể truy cập từ xa.
snapshoe


2
GatewayPorts=clientspecifiedhoặcGatewayPorts clientspecified
Trevor Rudolph

và tôi có thêm nó vào máy khách hay remote không?
Trevor Rudolph

14

Đây là câu trả lời của tôi để hoàn thành:

Tôi đã kết thúc việc sử dụng ssh -R ...để tạo đường hầm và sử dụng socattrên đó để chuyển hướng lưu lượng truy cập mạng đến 127.0.0.1:

đường hầm liên kết với 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

xã hội: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Tùy chọn khác là làm một đường hầm chỉ cục bộ trên đó, nhưng tôi thấy điều này chậm hơn nhiều

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


Tôi thích thực tế là tôi không phải đối phó với cấu hình sshd và tôi có thể làm tất cả mà không cần sudo. Thêm vào đó tôi học được rằng socat tồn tại. Cảm ơn!
BrutusCat

+ lên bạn đi tốt ạ. Tôi đã cố gắng nói ssh liên kết với 0.0.0.0 nhưng không thành công .. sau đó thấy cú pháp *, đã thử, không có xúc xắc. Tôi tưởng tượng nó có thể là một loại tính năng bảo mật trên sshd config hoặc thứ gì đó không cho phép. Cuối cùng đã thấy bài này và socatlàm việc tuyệt vời. Siêu hữu ích, bỏ cái này vào túi sau của tôi;]
Jaime

10

Bạn cũng có thể sử dụng chuyển tiếp gấp đôi nếu bạn thắng đượctet hoặc có thể thay đổi / etc / ssh / sshd_config.

Đầu tiên chuyển tiếp đến cổng tạm thời (ví dụ 10080) trên thiết bị loopback trên máy từ xa, sau đó sử dụng chuyển tiếp cục bộ ở đó để chuyển hướng cổng 10080 đến 80 trên tất cả các giao diện:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
Điều này thực sự hoạt động để bỏ qua các quy tắc chuyển tiếp!
Michael Schubert

Yêu giải pháp này. Cách giải quyết tuyệt vời khi bạn không muốn thay đổi cấu hình trên máy
Grezzo

8

Sử dụng tùy chọn "cổng cổng".

ssh -g -R REMOTE_PORT:HOST:PORT ...

Để sử dụng điều đó, có lẽ bạn cần thêm " GatewayPorts yes" vào máy chủ của mình /etc/ssh/sshd_config.


Trên thực tế điều này đã làm việc. Những gì tôi làm là tôi sử dụng một thể hiện EC2 làm công cụ chuyển tiếp đến máy chủ REST của mình. Bằng cách này, tôi không cần phải gắn máy chủ của mình vào DMZ và tôi không cần IP công cộng. Thật thú vị, với phiên bản EC2 đầu tiên tôi tạo, ssh -R remote_port: localhost: port xxx @ ec2xxx hoạt động tốt nhưng sau đó tôi phải tạo một phiên bản khác sau đó vì một số lý do và từ đó trở đi, tôi luôn nhận được: kết nối từ chối. Đã sử dụng tcpdump để xem xét những gì tôi đang nhận và không có nhiều thông tin. -g cộng với GatewayPorts đã làm điều đó.
ET

1

Jump host là một bổ sung khá gần đây cho OpenSSH. Điều này yêu cầu truy cập SSH vào trung gian, nhưng sẽ hoạt động mà không cần cấu hình bổ sung.

ssh -J root@example.com remoteuser@localhost -p 8080

Lệnh này hướng dẫn SSH trước tiên kết nối với root@example.com, và sau đó, từ máy đó, bắt đầu kết nối với cổng 8080 tại localhost(nghĩa là cổng được chuyển từ máy chủ nhảy sang máy chủ từ xa) dưới remoteusertên người dùng.


0

Nếu bạn muốn đặt cấu hình trong bạn ~/.ssh/configthay vì sử dụng các tham số dòng lệnh, bạn có thể thử một cái gì đó như

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Hãy nhớ rằng tường lửa của máy chủ từ xa cho phép kết nối tới 8080 và đảm bảo rằng GatewayPortstùy chọn /etc/ssh/sshdcấu hình của bạn không được đặt thànhno

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.