![如何在两台机器上的localhost和localhost之间进行端口转发?](https://linux22.com/image/71889/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%A4%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84localhost%E5%92%8Clocalhost%E4%B9%8B%E9%97%B4%E8%BF%9B%E8%A1%8C%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%EF%BC%9F.png)
我有一台本地机器 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.1
ssh地址呢?
我对 ssh 很陌生,所以如果问题不清楚,请随时指出,我会尽力弄清楚。
答案1
中指定的地址-L
由远程主机 (B) 使用。因此,难怪 A 和 B 之间实际上有一条通过 的隧道-L 5000:127.0.0.1:5000
。当您连接到 A 上的 TCP 端口 5000 时,该连接将转发到127.0.0.1:5000
B 上。
另一方面也-R 5001:127.0.0.1:5001
可以,因为地址是由本地主机 (A) 解析的,而您的目的地是 A。当您连接到 B 上的 TCP 端口 5001 时,连接将转发到127.0.0.1:5001
A 上。
请注意,默认情况下,两个-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 是您想要将连接发送到的任何端口。