如何强制SSH隧道(或ProxyCommand)使用现有的主连接?

有三台机器A,B和C运行linux。 我有权限访问机器A和B,但不能访问C. A是我的本地机器,我想连接到C. C只能通过VPN上的ssh访问。 我不能直接从A连接到C,因为VPNstream量在A中被阻塞。我可以使用共享密钥通过ssh从A连接到B. 我在B运行openvpn,然后我可以通过SSH连接到C,但C不接受共享密钥。 我想直接scp文件,并从C到A,从A到C密码,所以我创build了一个在B的ssh主连接和在A的ssh隧道。但是我不能让隧道使用B中的主连接。我的问题是如何设置SSH以便使用B中现有的主连接从A连接到C?

我可以看到三种方法来实现这一点:

1.你可以在A上运行scp,而不是让ssh到另外一台主机上,然后在那里运行scp,你把ssh给B,然后在B上运行另一个ssh命令来连接到C,然后在那里运行服务器端scp。

看起来scp没有指定如何在远端调用scp的选项,但它有一个选项来指定如何在本地调用ssh。 这是-S选项旨在告诉它在哪里可以findssh

你可以做的是运行带有-S选项指向脚本的scp。 那么这个脚本将会ssh到B并在那里运行ssh,B上的ssh命令将会被调用,这个脚本中的所有scp选项都会被调用。

2.如果你可以pipe理在C上configuration一个authorized_keys文件,你可以让A直接向C进行身份validation。可能你所缺less的只是C上authorized_keys文件的正确权限。由于A不能直接连接到C,将代之以指定一个ProxyCommand,它将运行ssh -W从A连接到B.听起来就像在你的情况下,需要进入~/.ssh/config在A上。使用的值是ssh -W %h:%p B

3.在C上运行scp命令并将C连接回A.如果C无法直接连接到A,则可以使用上面提到的ProxyCommand打开连接,也可以在A和AP之间build立一个ssh反向端口转发B或B与C之间