Làm thế nào để chuyển tiếp một cổng từ máy này sang máy khác?


19

Hãy xem xét tình huống sau:

Ở nhà tôi, tôi có một bộ định tuyến (được kết nối với internet), máy chủ (S) và máy chính của tôi (M). S có thể truy cập từ internet (nó có IP tĩnh) và nó hoạt động 24/7, trong khi M thì không.

Đôi khi, tôi muốn làm cho một số ứng dụng (nghe trên một số cổng trên M, ví dụ 8888) có thể truy cập từ internet bên ngoài.

Vì thế, tôi muốn thiết lập một số cổng trên S (2222) để chuyển tiếp đến cổng 8888 của M, để bất kỳ ai truy cập S: 2222 đều cảm thấy như anh ta đang truy cập M: 8888.

Tôi đã thử sử dụng chuyển tiếp cổng ssh, nỗ lực tốt nhất của tôi là như sau:

ssh -L 2222:M:8888 -N M

Nhưng điều đó chỉ cho phép tôi truy cập cổng 2222 từ chính máy chủ chứ không phải từ các máy khác.

Có một số cách để làm điều đó đúng? Tốt hơn là, tôi muốn nó là một lệnh đơn giản, tôi có thể bắt đầu và tắt với ^ C khi tôi không cần chuyển tiếp nữa.


Hãy dùng thử localhost.run là trang web bạn có thể truy cập tại localhost.run Tôi nghĩ rằng có một cách để đưa sản phẩm của bạn ra khỏi đó ..
Angelena Neilsomt

Câu trả lời:


16

Vâng, điều này được gọi GatewayPortstrong SSH. Một đoạn trích từ ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

Và bạn có thể sử dụng localhostthay vì Mchuyển tiếp, khi bạn chuyển tiếp đến cùng một máy như bạn đang SSH - nếu tôi hiểu chính xác câu hỏi của bạn.

Vì vậy, lệnh sẽ trở thành thế này:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

và sẽ trông như thế này trong netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Bây giờ bất cứ ai truy cập vào máy này tại cổng 2222 TCP sẽ thực sự nói chuyện với localhost: 8888 như đã thấy trong máy M. Lưu ý rằng điều này không giống như chuyển tiếp đơn giản sang cổng 8888 của M.


1
Cảm ơn! Đó là công việc! Nhưng có một số điều kỳ lạ - vì một số lý do, đầu ra chứa dòng "bind: Địa chỉ đã được sử dụng". Điều đó có nghĩa là gì?
Rogach

1
Bạn đã có một số quá trình chạy trên cổng đó. Sử dụng cùng một netstatlệnh để tìm hiểu chính xác những gì. Có lẽ một SSH tương tự khác vẫn đang chạy trong nền và giết nó bằng cách sử dụng mạng lưới PID cho bạn biết.
gertvdijk

Điều thú vị là tôi đã thực hiện điều đó - không có quy trình nào trên các cổng đó, trên cả S và M. Nếu có một số, thì toàn bộ công trình có thể đã không hoạt động.
Rogach

10

Có một cách khác. Bạn có thể thiết lập chuyển tiếp cổng từ S: 2222 đến W: 8888 với iptables. Lệnh đơn:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

Trong đó 1.2.3.4 là địa chỉ IP của M. Nó được gọi là NAT (Dịch địa chỉ mạng).


1
Vì bạn chỉ thực hiện NAT đích ở đây (trái ngược với NAT nguồn), điều này sẽ chỉ hoạt động đáng tin cậy trong các tình huống cụ thể và có thể yêu cầu sửa đổi các bảng định tuyến. Để chuyển tiếp đến các máy ảo (M) chạy trên máy chủ (S), tuy nhiên, điều này có thể hoạt động tốt.
gertvdijk

Lệnh này nên được ban hành trên gateway. Tôi giả sử rằng S và M nằm trên cùng một mạng LAN. Nguồn NAT sẽ được thực hiện tự động bằng trình theo dõi kết nối trong các nhân Linux hiện đại. Tôi có cấu hình như vậy trong mạng văn phòng của tôi và nó hoạt động hoàn hảo. Tuy nhiên, có thể thực hiện lệnh cụ thể hơn (ví dụ: nói với iptables -i eth0 trong đó eth0 là giao diện bên ngoài).
Gevial

Nếu S và M ở trên cùng một mạng LAN, bạn không cần chuyển tiếp cổng ở đó, vì không có lưu lượng nào giữa chúng đi qua cổng.
gertvdijk

1
Yeap, nhưng kết nối với M: 8888 được làm từ Internet, tôi giả sử. Ai đó hình thành Internet -> S: 2222 -> Bộ định tuyến LAN M và S với iptables -> M: 8888
Gevial

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.