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

xsl*_*ass 1 ssh

我有一台本地计算机 A,我想访问位于防火墙后面的计算机 C。我可以访问机器B,它与C位于同一网络上,并且我想使用机器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
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢在上面的命令中使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

yae*_*shi 5

中指定的地址-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
Run Code Online (Sandbox Code Playgroud)

通过此设置,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
Run Code Online (Sandbox Code Playgroud)

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

ssh -L 5000:127.0.0.1:5000 -R 5001:127.0.0.1:5001 C
Run Code Online (Sandbox Code Playgroud)

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