Đảo ngược cổng hầm


59

Tôi cần cho ai đó xem một trang web đang chạy trên máy cục bộ của tôi vào ngày mai. Thông thường tôi sẽ thực hiện điều này bằng cách chuyển tiếp cổng trên bộ định tuyến cục bộ của mình nhưng nhờ lỗi phần cứng và sự thay thế của nó là khủng khiếp, bộ định tuyến hiện tại của tôi không cho phép tôi chuyển tiếp cổng.

Quá bế tắc với sự chậm trễ này và không muốn đẩy toàn bộ sự việc lên một máy chủ phù hợp, tôi có một ý tưởng điên rồ: Tôi có thể chuyển tiếp cổng của mình sang một máy chủ bên ngoài qua SSH không?

Tôi đã thực hiện việc đào cổng trước đây nhưng tôi thường làm đúng cách:

  • Tôi kết nối với một hộp từ xa và yêu cầu cổng 12345 xuất hiện trên máy cục bộ của tôi tại cổng 12345.
  • Tôi bắt đầu một cái gì đó trên P12345 trên máy từ xa
  • Tôi có thể truy cập nó qua localhost: 12345

Những gì tôi muốn làm:

  • Kết nối với một PC từ xa và yêu cầu rằng P12345 cục bộ của nó lấy các thứ từ P12345 cục bộ của tôi (qua đường hầm)
  • Tôi bắt đầu một cái gì đó trên máy tính cục bộ của tôi trên P12345
  • Những người khác có thể truy cập từ xa: 12345 và xem localhost của tôi: 12345

Câu trả lời:


96

Lệnh để chuyển tiếp cổng 80 từ máy cục bộ của bạn ( localhost) đến máy chủ từ xa trên cổng 8000 là:

ssh -R 8000:localhost:80 oli@remote-machine

Điều này đòi hỏi một tinh chỉnh bổ sung trên máy chủ SSH, thêm các dòng vào /etc/ssh/sshd_config:

Match User oli
   GatewayPorts yes

Tiếp theo, tải lại cấu hình bằng cách thực thi máy chủ sudo reload ssh.

Cài đặt GatewayPorts yeskhiến SSH liên kết cổng 8000 trên địa chỉ ký tự đại diện, do đó, nó trở nên khả dụng đối với địa chỉ công khai của remote-machine( remote-machine:8000).

Nếu bạn cần có tùy chọn không ràng buộc mọi thứ trên địa chỉ ký tự đại diện, hãy đổi GatewayPorts yesthành GatewayPorts clientspecified. Vì sshmặc định liên kết với địa chỉ loopback, bạn cần chỉ định một khoảng trống bind_addressđể liên kết địa chỉ ký tự đại diện:

ssh -R :8000:localhost:80 oli@remote-machine

Cái :trước 8000là bắt buộc nếu GatewayPortsđược đặt thành clientspecifiedvà bạn muốn cho phép truy cập công khai remote-machine:8000.

Đoạn trích thủ công có liên quan:

ssh (1)

-R [bind_address:] port: host: hostport
Chỉ định rằng cổng đã cho trên máy chủ (máy chủ) từ xa sẽ được chuyển tiếp đến máy chủ và cổng đã cho ở phía cục bộ. Điều này hoạt động bằng cách phân bổ một ổ cắm để nghe cổng ở phía xa và bất cứ khi nào kết nối được thực hiện với cổng này, kết nối sẽ được chuyển tiếp qua kênh bảo mật và kết nối được thực hiện để lưu trữ cổng máy chủ từ máy cục bộ. Theo mặc định, ổ cắm nghe trên máy chủ sẽ chỉ bị ràng buộc với giao diện loopback. Điều này có thể được ghi đè bằng cách chỉ định một bind_address. Một bind_address trống, hoặc địa chỉ '*', chỉ ra rằng ổ cắm từ xa sẽ lắng nghe trên tất cả các giao diện. Chỉ định một bind_address từ xa sẽ chỉ thành công nếu tùy chọn GatewayPorts của máy chủ được bật (xem sshd_config (5)).

sshd_config (5)

Cổng
kết nối Chỉ định liệu máy chủ từ xa có được phép kết nối với cổng được chuyển tiếp cho máy khách hay không. Cổng Gateway có thể được sử dụng để chỉ định rằng sshd sẽ cho phép chuyển tiếp cổng từ xa liên kết với các địa chỉ không vòng lặp, do đó cho phép các máy chủ khác kết nối. Đối số có thể là 'không' để buộc chuyển tiếp cổng từ xa chỉ khả dụng cho máy chủ cục bộ, 'có' để buộc chuyển tiếp cổng từ xa liên kết với địa chỉ ký tự đại diện hoặc 'clientpecified' để cho phép khách hàng chọn địa chỉ mà việc chuyển tiếp bị ràng buộc. Mặc định là 'không'.

Xem thêm:


7
GatewayPortslà viên đạn ma thuật ở đây. Tôi thích rằng bạn đã tìm thấy một phiên bản có thể cho phép tôi giới hạn kỹ thuật khá mạnh mẽ này đối với một số người dùng nhất định.
Oli

1
Điều khiến tôi bối rối là GatewayPorts phải được đặt trên máy chạy lệnh ssh thực tế để khởi tạo đường hầm ngược (cục bộ). Trong suy nghĩ của tôi, một cách hợp lý hơn là đầu kia (từ xa) sẽ xử lý nơi chấp nhận kết nối từ đó, vì đó là nơi bạn kết nối và được chuyển hướng từ đó. Mất nhiều thời gian để có được điều đó.
Ars Magika

2
@ArsMagika Tôi không chắc là tôi có hiểu bạn không. Cổng nối phải được đặt trên máy chủ SSH, không phải trên máy cục bộ của bạn chạy sshlệnh. Nó cấu hình xem các máy khách khác có thể giao tiếp với các cổng được chuyển tiếp trên máy chủ hay không.
Lekensteyn

Nhược điểm của giải pháp này: bạn mất khả năng xác định địa chỉ IP của khách hàng trong nhật ký truy cập của máy chủ web. Bất cứ cách nào để giải quyết phiền toái đó là tốt?
Twonky

@Twonky Nếu bạn không cần biết chính xác địa chỉ IP của máy khách (chỉ là địa chỉ từ xa chứ không phải "localhost") và máy chủ cục bộ của bạn đang lắng nghe địa chỉ ký tự đại diện (nghĩa là chấp nhận kết nối từ bất kỳ địa chỉ nào), sau đó bạn có thể thử chuyển tiếp đến -R :8000:127.0.1.1:80(hoặc bất kỳ 127.x.x.xđịa chỉ nào khác ). Nếu không, không, bạn sẽ không thể tìm hiểu địa chỉ IP từ xa.
Lekensteyn

14

Nếu máy chủ có GatewayPorts no, bạn có thể đạt được kết quả tương tự bằng cách thực thi ssh -g -L 8001:localhost:8000 oli@remote-machinetrên máy chủ khi bạn đã thực hiện ssh -Rlệnh trên máy khách. Điều này sẽ làm cho cổng loopback 8000 trên máy chủ có thể truy cập được trên tất cả các giao diện trên cổng 8001.

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.