Answers:
使用ssh是最简单的解决方案。
ssh -g -L 8001:localhost:8000 -f -N user@remote-server.com
这会将您工作站上的本地端口8001转发到remote-server.com端口8000上的本地主机地址。这
-g
意味着允许网络上的其他客户端连接到工作站上的端口8001。否则,只有工作站上的本地客户端可以连接到转发的端口。
-N
意味着我要做的就是转发端口,不要启动shell。
-f
表示成功建立SSH连接并登录后进入后台。
端口8001将为许多连接保持打开状态,直到ssh死亡或被杀死。如果您碰巧在Windows上,出色的SSH客户端PuTTY也可以做到这一点。使用8001作为本地端口,使用localhost:8000和目标,并在设置中添加本地端口转发。与PuTTY成功连接后,可以添加它。
user@remote-server.com
办?绝对不需要端口转发,但是ssh要求使用此参数,而且还要尝试在此处进行连接。并将此讨厌的选项设置为主机名后,它会输出…port 22: Connection refused
(不,我没有使用22端口)。除非我丢失了某些内容,否则该命令显然是行不通的。
user@remote-server.com
只是一个示例,您不应从字面上理解它。您必须用要连接的计算机名称和此计算机上的用户名替换它。建立ssh连接需要此信息。只有在建立ssh连接后,才能通过此连接转发端口。
-N
并不意味着没有SSH连接。它只是意味着do not execute a remote command
(请参见手册页)。该<user>@<host>
参数是必需的,因为这确实会打开SSH连接<host>
(对于OP来说是localhost
),并通过该SSH隧道转发所需的端口。这是解决OP问题的一种方法,但不是最简单的方法。要在不使用ssh的情况下转发到localhost,您可以在StephaneChazelas中使用socat
或netcat
,而不
随着socat
在服务器上:
socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000
默认情况下,socat
它将在计算机上的任何IPv4或IPv6地址(如果支持)上侦听TCP端口8001。您可以通过将其替换tcp-listen
为tcp4-listen
或来将其限制为IPv4 / 6 tcp6-listen
,或者通过添加来将其限制为特定的本地地址,bind=that-address
。
与要代理的连接套接字相同,可以使用任何地址localhost
代替tcp
,如果希望将地址解析限制为IPv4或IPv6地址,则可以替换为tcp4
或tcp6
。
请注意,对于在端口8000上侦听的服务器,连接将显示为来自代理(如果是localhost
,则为localhost
),而不是来自原始客户端。您需要使用DNAT方法(但是这需要超级用户特权),服务器才能知道谁是客户端。
使用传统方式nc
是最简单的解决方案:
nc -l -p 8001 -c "nc 127.0.0.1 8000"
此版本的文件nc
位于netcat-traditional
Ubuntu 的软件包中。(您必须update-alternatives
致电或致电nc.traditional
。)
请注意,与ssh相比,它未加密。如果您在一台主机之外使用它,请记住这一点。
netcat-openbsd
吗?
nc
命令在第一个远程连接后结束。-k
如果需要保持运行,请添加。
nc: cannot use -p and -l
在CentOS 6.4上。有没有解决的办法?
默认情况下,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
ss -tan
或所示netstat -tan
。
在ServerFault上引用David Spillett的答案
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
如果要将输入端口绑定到所有接口。
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>
service iptables save
service iptables restart
dport
(进入)nc -v localhost 2345
,我得到了Connection refused
。我在iptables中不是很好,但是我猜dport必须有一个监听应用程序。
根据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的帖子上留下答案,但是我还没有声誉。
这是在服务器上建立两个udp端口的新方法:https : //github.com/9crk/udpeer
udpeer 8001 8002
去测试:
nc -u xxxx.com 8001
nc -u xxxx.com 8002