![给定一个 SSH 隧道 ABC,如何排除 B?](https://linux22.com/image/96197/%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%20SSH%20%E9%9A%A7%E9%81%93%20ABC%EF%BC%8C%E5%A6%82%E4%BD%95%E6%8E%92%E9%99%A4%20B%EF%BC%9F.png)
我已经使用 3 台机器 ( A
、B
、C
) SSH 设置一段时间了。和A
都是C
我想要连接的两个不同 LAN 上的机器,并且B
是我自己的带有公共地址的盒子。
在机器上A
我这样做:
ssh -p 443 -f -N -R 1987:localhost:22 hostname-of-B
在机器上C
我有这个~/.ssh/config
:
Host hostB
User user-of-B
HostName hostname-of-B
Host hostA
User user-of-A
ProxyCommand ssh -o 'GatewayPorts yes' -q hostB nc -q0 localhost 1987
所以我可以从C
到连接A
:
ssh hostA
这个设置工作得很好,直到我不得不切换B
到另一台互联网连接较差的机器。现在,A
尽管C
连接良好,但一切都超级慢。
C
所以我想知道在建立从到 的A
初始连接后是否可以建立从到 的B
直接连接。这样就可以消除等式并再次加快连接速度。A
C
B
答案1
不,这是不可能的。您需要一些公开的内容来转发。或者对于一台服务器对另一台服务器的每个连接的可见性。
答案2
如果您有任何其他具有公共 ssh 访问权限的机器 X,您可能可以避免速度慢的 B。这可以是您家里的机器,也可以是非常便宜的租用的具有良好连接的公共虚拟机。
在 C 上,您可以打开从 X 回到 C 的反向隧道:
ssh -Nf -R 10022:localhost:22 user-of-X@hostname-of-X
然后在 A 上通过 X 添加另一个“hop-config”
Host hostAviaX
User user-of-X
ProxyCommand ssh -o 'GatewayPorts yes'-q hostB nc -q0 localhost 10022
在 A 上ssh hostAviaX
应该可以工作。
注意如果 A 是你的在您控制路由器的网络中的客户端计算机上,您可以启用端口转发,以便 A 具有公共 ssh 访问权限。在这种情况下,您不需要另一个 X,您可以替换上面示例中的 X == A。