ssh ProxyCommand如何工作?

我很喜欢使用ssh的ProxyCommandfunction,并且可以使用它跳过多个堡垒主机以有效地到达最终​​的主机。 但是我似乎无法理解它是如何在后端工作的。

例如。 我有以下configuration文件。

Host final Hostname final.com Port 22 AgentForwarding yes User guestuser ProxyCommand "ssh [email protected] -W %h:%p" 

我明白,为了连接到final的主机,ProxyCommand将在连接到final.com之前运行。 但是我似乎还不能理解连接的顺序。

那么选项-W %h:%p做什么的? 我知道这是netcat的function,与nc %h %p类似。

所以据我的理解,这里是操作的顺序。 请让我知道,如果我错了。 我会在我的例子中使用上面指定的configuration文件。

  1. 用户inputssh final
  2. 创build一个到bastion.com的ssh连接。
  3. 一个netcat隧道从bastion.com创build到final.com的22端口。 netcat的stdin连接到与bastion.com连接中获得的shell。
  4. 所以现在我们有一个从我们的系统连接到final.com。 这个连接的前半部分是从我们的系统到bastion.com的ssh连接。 这个连接的后半部分是从bastion.com到final.com的netcat隧道。
  5. 现在, ssh final命令将上述连接作为代理,并通过此现有连接来隧道传输数据。

另外我也想知道这个技术是否也被称为ssh堆栈

增加了linebreaks

3)一个netcat隧道从bastion.com创build到final.com的22端口。

假,没有netcat。

1)用户在本地主机上inputssh final 。 这将启动父级ssh进程
2)父ssh创build一个I / Oredirect到pipe道的子ssh
3)孩子ssh创build一个连接到bastion.com。
4)bastion.com上的sshd进程创build一个到final.com:22的tcp连接
5)ssh通道被添加到localhost和bastion.com之间的现有ssh连接
6)父ssh将握手数据写入pipe道,子ssh从pipe道读取,通过ssh通道发送到bastion.com上的sshd; sshd读取它并将其写入连接到final.com的套接字。 同样,数据从final.com传输到本地主机