it-swarm-vi.com

Cách đơn giản để tạo một đường hầm từ một cổng địa phương đến một cổng khác?

Tôi có một máy chủ phát triển, chỉ có thể truy cập từ 127.0.0.1:8000, không phải 192.168.1.x: 8000. Là một cách nhanh chóng, có một cách để thiết lập một cái gì đó để nghe trên một cổng khác (giả sử, 8001) để từ mạng cục bộ tôi có thể kết nối 192.168.1.x: 8001 và nó sẽ tạo đường hầm lưu lượng giữa máy khách và 127.0 .0.1: 8000?

83
waitinforatrain

Sử dụng ssh là giải pháp dễ nhất.

ssh -g -L 8001: localhost: 8000 -f -N [email protected]

Điều này chuyển tiếp cổng cục bộ 8001 trên máy trạm của bạn đến địa chỉ localhost trên cổng 8000-server.com.
[.__.] -g có nghĩa là cho phép các máy khách khác trong mạng của tôi kết nối với cổng 8001 trên máy trạm của tôi. Mặt khác, chỉ các máy khách cục bộ trên máy trạm của bạn có thể kết nối với cổng được chuyển tiếp.
[.__.] -N có nghĩa là tất cả những gì tôi đang làm là chuyển tiếp cổng, không khởi động Shell.
[.__.] -f có nghĩa là rẽ nhánh vào nền sau khi kết nối và đăng nhập SSH thành công.
[.__.] Cổng 8001 sẽ mở cho nhiều kết nối, cho đến khi ssh chết hoặc bị giết. Nếu bạn tình cờ có mặt trên Windows, ứng dụng khách SSH tuyệt vời PuTTY cũng có thể làm điều này. Sử dụng 8001 làm cổng cục bộ và localhost: 8000 và đích và thêm chuyển tiếp cổng cục bộ trong cài đặt. Bạn có thể thêm nó sau khi kết nối thành công với PuTTY.

48
penguin359

Với socat trên máy chủ:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

Theo mặc định, socat sẽ lắng nghe TCP cổng 8001 trên bất kỳ địa chỉ IPv4 hoặc IPv6 (nếu được hỗ trợ) trên máy. Bạn có thể giới hạn nó thành IPv4/6 bằng cách thay thế tcp-listen với tcp4-listen hoặc là tcp6-listen hoặc đến một địa chỉ cụ thể bằng cách thêm ,bind=that-address.

Tương tự đối với ổ cắm kết nối mà bạn đang ủy quyền, bạn có thể sử dụng bất kỳ địa chỉ nào thay cho localhost và thay thế tcp bằng tcp4 hoặc là tcp6 nếu bạn muốn hạn chế độ phân giải địa chỉ đối với địa chỉ IPv4 hoặc IPv6.

Lưu ý rằng đối với máy chủ nghe trên cổng 8000, kết nối sẽ xuất hiện như đến từ proxy (trong trường hợp localhost, đó sẽ là localhost), không phải máy khách gốc. Bạn cần sử dụng phương pháp tiếp cận DNAT (nhưng yêu cầu đặc quyền siêu người dùng) để máy chủ có thể cho biết ai là khách hàng.

105
Stéphane Chazelas

Sử dụng nc truyền thống là giải pháp đơn giản nhất:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Phiên bản nc này nằm trong netcat-traditional gói trên Ubuntu. (Bạn phải update-alternatives hoặc gọi nó là nc.traditional.)

Lưu ý rằng trái ngược với ssh, điều này không được mã hóa. Hãy ghi nhớ điều đó nếu bạn sử dụng nó bên ngoài một Host.

50
not-a-user

OpenBSD netcat có sẵn theo mặc định trên Linux và cả trên OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Một cách khác hoạt động trên bash OS X là sử dụng ống hai chiề . Nó có thể hoạt động trên các Unix khác:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
27
Mark A.

Trích dẫn một David Spillett 's câu trả lời trên ServerFault

rinetd nên thực hiện công việc và nhị phân Windows cho nó có thể có từ http://www.boutell.com/rinetd/ (đối với bất kỳ ai đang tìm kiếm điều tương tự trong Linux, rinetd nằm trong kho lưu trữ tiêu chuẩn của mọi phân phối vì vậy có thể được cài đặt với "apt-get install rinetd" hoặc "yum install rinetd" hoặc tương tự)

Nó là một nhị phân đơn giản có một tệp cấu hình ở định dạng

bindaddress bindport connectaddress connectport

Ví dụ:

192.168.1.1 8001 127.0.0.1 8000

hoặc là

0.0.0.0 8001 127.0.0.1 8000

nếu bạn muốn liên kết cổng đến với tất cả các giao diện.

4
psychowood
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
Santanu Dey

Đây là một cách mới để tạo đường hầm hai cổng udp trên máy chủ: https://github.com/9crk/udpeer

udpeer 8001 8002

Để kiểm tra:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
9crk

Dựa trên câu trả lời của Mark A. , tôi đã phải tạo một Tweak nhỏ để nó hoạt động cho máy Mac của tôi (ít nhất là trên macOS Mojave Phiên bản 10.14.4)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

Đó là tuyên bố printf có vẻ rất quan trọng. Nếu không, lệnh netcat để kết nối với cổng 8000 sẽ không bao giờ thực sự cố gắng kết nối và lệnh netcat để nghe trên cổng 8001 sẽ không bao giờ thực sự nghe trên cổng 8001. Nếu không có printf, mỗi khi tôi cố gắng kết nối với cổng 8001 tôi sẽ nhận được kết nối từ chối.

Giả định của tôi là netcat bằng cách nào đó phải chặn stdin (có thể nó đang cố đọc nó vì lý do nào đó) trước khi thực sự thực hiện bất kỳ hoạt động nào của Socket. Như vậy, nếu không có câu lệnh printf ghi đến fifo a, lệnh netcat sẽ không bao giờ bắt đầu nghe trên cổng 8001.

Lưu ý: Tôi đã để lại câu trả lời trên bài đăng của Mark, nhưng tôi chưa có danh tiếng.

0
Daniel K