我习惯于使用 ssh 在 localhost 上转发远程服务端口,例如:
ssh -L 2181:localhost:2182 user@server
(将远程主机端口2182转发到本地端口2181)
现在,从我 ssh 到的机器上,我正在尝试访问 tcp 服务并将响应转发到我的本地机器:
local-machine:2181 <-- SSH --> remote-machine:2182 <-- netcat/named pipe --> service:2181
注意:我没有直接访问服务机器的权限,我只能通过我 SSH 连接的机器访问网络。
我试图将 netcat 与命名管道一起使用:
在远程机器上:
mkfifo fifo
nc -k -l 2182 <fifo | nc service 2181 >fifo
在本地机器上:
echo message | nc localhost 2181
但这似乎不起作用。
我也试过,在远程机器上
nc -k -l 2182 0<fifo | nc service 2181 1>fifo
没有运气
在远程机器上nc -k -l 2182
输出我从本地机器发送的消息:2181
如果我只是像这样简单地管道:nc -k -l 2182 | nc service 2181
我确实看到了远程机器上服务的响应。所以我可以一直到服务并回到远程机器,但它停在那里:
local-machine:2181 <-/- SSH --> remote-machine:2182 <-- netcat --> service:2181
所以我不明白为什么命名管道不会通过 ssh 连接将响应转发回我的本地机器。
echo message | nc localhost 2182
在远程机器上不会在本地机器上输出任何内容,因此由于某种原因它没有通过 SSH 实现。
知道为什么会这样以及如何解决吗?
感谢帮助。
(为清楚起见进行了编辑)注意:我需要这个,因为我只能通过 SSH 连接到一台机器,它是集群的一部分,并且该机器可以访问服务。我不想将服务暴露给外部,也不想每个服务容器都有一个 SSHD。
我被指出这样一个事实,一个人可以简单地做
ssh -L 2181:service:2181 user@remote-machine
将连接转发到
service
fromremote-machine
上的端口local-machine
。简单高效。
你可以使用 -R 来达到这个目的:
这将在 yourhost:7070 上打开一个端口,该端口转发到 localhost:8080
文档说