如何在两台机器上的localhost和localhost之间进行端口转发?

如何在两台机器上的localhost和localhost之间进行端口转发?

我有一台本地机器 A,我想访问防火墙后面的机器 C。我可以访问与 C 位于同一网络上的机器 B,我想使用机器 B 作为 ssh 服务器在 A 和 C 之间建立隧道。

假设我们想在 A 和 C 之间创建两条链路。这可以通过端口转发来实现,例如

ssh -L IP_of_A:5000:IP_of_C:5000 -R IP_of_C:5001:IP_of_A:5001 IP_of_B

但是,我更喜欢127.0.0.1在上面的命令中使用真实的 IP 地址,而不是使用真实的 IP 地址,因为在上面的命令中使用真实的 IP 地址时,我的程序不知何故中断了。所以我希望它像

ssh -L IP_of_A:5000:127.0.0.1:5000 -R IP_of_C:5001:127.0.0.1:5001 IP_of_B

但似乎使用这个,隧道端口是在机器A和机器B之间,而不是机器A和机器C之间。

那么我们怎样才能将隧道设置在A和C之间,并且仍然使用127.0.0.1ssh地址呢?

我对 ssh 很陌生,所以如果问题不清楚,请随时指出,我会尽力弄清楚。

答案1

中指定的地址-L由远程主机 (B) 使用。因此,难怪 A 和 B 之间实际上有一条通过 的隧道-L 5000:127.0.0.1:5000。当您连接到 A 上的 TCP 端口 5000 时,该连接将转发到127.0.0.1:5000B 上。

另一方面也-R 5001:127.0.0.1:5001可以,因为地址是由本地主机 (A) 解析的,而您的目的地是 A。当您连接到 B 上的 TCP 端口 5001 时,连接将转发到127.0.0.1:5001A 上。

请注意,默认情况下,两个-L/-R侦听端口均已绑定localhost,因此它们只能分别从 A 和 B 中使用。如果要允许其他主机连接,请添加/bind_address部分。只需添加一个前导就足够了:-L-R:

ssh -L :5000:IP_of_C:5000 -R :5001:127.0.0.1:5001 IP_of_B

通过此设置,A 连接到127.0.0.1:5000,C 连接IP_of_B:5001

如果您希望在 A 和 C 上使用127.0.0.1,则需要在 A 和 C 之间建立(虚拟)直接 SSH 连接,这可以通过 SSH over SSH 隧道实现ProxyCommand。将以下内容放入~/.ssh/config

Host C
ProxyCommand ssh -q -W IP_of_C:22 IP_of_B

然后通过 1-hop 从 A 连接到 C ssh

ssh -L 5000:127.0.0.1:5000 -R 5001:127.0.0.1:5001 C

这次你不必添加bind_address部分,因为127.0.0.1用于两端的隧道连接。

答案2

据我了解,我认为您正在寻找的内容已在 StackExchange 的 ServerFault 站点上得到了解答:这里

由于这更多地涉及网络和网络/服务器管理工​​具,因此将来可能是提出此类问题的更好网站。

他们在那里专门讨论了如何设置一个隧道,以便从主机 A SSH 到主机 C,但您可以对任何 TCP 连接执行此操作。

在他们的示例中$PROXYHOST,主机 B$REMOTEHOST是主机 C,$SSHPORT主机 C 是您想要将连接发送到的任何端口。

相关内容