it-swarm.cn

创建从一个本地端口到另一本地端口的隧道的简单方法?

我有一个开发服务器,只能从127.0.0.1:8000而不是192.168.1.x:8000进行访问。作为一个快速的技巧,是否可以设置某种方法来监听另一个端口(例如8001),以便从本地网络连接192.168.1.x:8001,它将在客户端和127.0之间建立隧道传输。 .0.1:8000?

83
waitinforatrain

使用ssh是最简单的解决方案。

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

这会将您工作站上的本地端口8001转发到remote-server.com端口8000上的本地主机地址。
-g表示允许网络上的其他客户端连接到工作站上的端口8001。否则,只有工作站上的本地客户端可以连接到转发的端口。
-N表示我正在做的是转发端口,不要启动Shell。
-f表示在成功建立SSH连接并登录后进入后台。
端口8001将为许多连接保持打开状态,直到SSH死亡或被杀死。如果您碰巧在Windows上,出色的SSH客户端PuTTY也可以做到这一点。使用8001作为本地端口,使用localhost:8000和目标,并在设置中添加本地端口转发。与PuTTY成功连接后,可以添加它。

48
penguin359

在服务器上使用socat

_socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000
_

默认情况下,socat将在计算机上任何IPv4或IPv6地址(如果支持)上的TCP端口8001上进行侦听。您可以通过替换_tcp-listen_和_tcp4-listen_或_tcp6-listen_,或者通过添加_,bind=that-address_到特定的本地地址。

与您要代理的连接套接字相同,您可以使用任何地址代替localhost,并用_tcp4_或_tcp6_替换tcp将地址解析限制为IPv4或IPv6地址。

请注意,对于侦听端口8000的服务器,连接将显示为来自代理(对于localhost,它将是localhost),而不是原始客户端。您需要使用 DNAT方法 (但这需要超级用户特权),服务器才能知道谁是客户端。

105
Stéphane Chazelas

使用传统的nc是最简单的解决方案:

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

nc的此版本位于netcat-traditional封装在Ubuntu上。 (你必须 update-alternatives或称其nc.traditional。)

请注意,与ssh相比,它未加密。如果您在一台主机之外使用它,请记住这一点。

50
not-a-user

默认情况下,Linux和OS X上都可以使用OpenBSD netcat。

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

在OS X bash上有效的另一种方法是使用 双向管道 。它可能在其他Unix上运行:

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

在ServerFault上引用 David Spillettanswer

rinetd应该完成这项工作,并且可以从 http://www.boutell.com/rinetd/ 获得Windows二进制文件(对于在Linux下寻找相同内容的任何人,rinetd在几乎每个发行版的标准存储库,因此可以使用“ apt-get install rinetd”或“ yum install rinetd”或类似版本进行安装)

它是一个简单的二进制文件,采用以下格式的配置文件

bindaddress bindport connectaddress connectport

例如:

192.168.1.1 8001 127.0.0.1 8000

要么

0.0.0.0 8001 127.0.0.1 8000

如果要将输入端口绑定到所有接口。

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

这是在服务器上建立两个udp端口的新方法: https://github.com/9crk/udpeer

udpeer 8001 8002

去测试:

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

基于 Mark A。 的答案,我不得不做一个小的调整才能使其在Mac上运行(至少在macOS Mojave版本10.14.4上)

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

该printf语句似乎至关重要。否则,连接到端口8000的netcat命令将永远不会真正尝试连接,而监听端口8001的netcat命令也将永远不会真正监听端口8001。如果没有printf,每次尝试连接端口8001时,我都会得到连接拒绝连接。

我的假设是netcat必须在实际执行任何Socket操作之前以某种方式阻塞stdin(也许出于某种原因试图读取它)。这样,如果没有将printf语句写入fifo a,netcat命令将永远不会开始监听端口8001。

注意:我会在Mark的帖子上留下答案,但是我还没有声誉。

0
Daniel K