![将远程 tcp 端口转发到本地端口](https://linux22.com/image/211168/%E5%B0%86%E8%BF%9C%E7%A8%8B%20tcp%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%88%B0%E6%9C%AC%E5%9C%B0%E7%AB%AF%E5%8F%A3.png)
该设备不断尝试连接到特定已知端口上的远程服务器。
在远程服务器上,除了开放的 TCP 端口之外什么都没有。
我想将远程服务器的端口转发到我的电脑并打开 TCP 服务器来读取数据。
最终,我想使用Python来实现这一点,
但与此同时,我尝试使用ssh来执行此操作:ssh -N -R 10000:localhost:10000 username@hostname
,
在我这边(我的电脑),我尝试打开一个套接字(使用python)来监听端口10000,并尝试打开赫拉克勒斯模拟TCP服务器,但是,我没有收到任何数据。
显然,缺少了一些东西,那是什么?
ps 在远程服务器上打开 TCP 服务器将获取数据,
但我需要控制来自我的电脑的连接。
答案1
以下是相关部分-R
在ssh
的手册页中:
-R [bind_address:]port:host:hostport
[...]
默认情况下,服务器上的 TCP 监听套接字将仅绑定到环回接口。这可以通过指定bind_address来覆盖。一个空的bind_address,或者地址'*',表示远程套接字应侦听所有接口。
GatewayPorts
仅当启用服务器选项时,指定远程绑定地址才会成功(请参阅sshd_config(5)
)。
远程服务器上的监听套接字仅监听本地主机因此来自 UNIT 的连接被拒绝(即:它是“关闭的”)。
因此,如果服务器已经允许,则只需使用它即可:
ssh -N -R :10000:localhost:10000 username@hostname
请注意:
前面有“一个空的绑定地址”(也可以使用实际的远程服务器面向 UNIT 的 IP 地址)。这应该改进为:
ssh -o ExitOnForwardFailure=yes -N -R :10000:localhost:10000 username@hostname
以防止错误地运行两次。
但默认情况下通常不允许使用这种类型的绑定地址,远程服务器的sshd配置为GatewayPorts
应该改变。在远程服务器上,配置文件通常/etc/ssh/sshd_config
应修改为具有如下所示的(未注释的)条目:
GatewayPorts clientspecified
并且应该重新加载 ssh 守护进程以使用其新配置。