ssh ProxyCommand 实际上如何工作?

ssh ProxyCommand 实际上如何工作?

我习惯使用 ssh 的 ProxyCommand 功能,并能使用它跳过多个堡垒主机,高效地到达最终​​主机。但我似乎无法理解它在后端的实际工作原理。

例如。我有以下配置文件。

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 功能,与 类似nc %h %p

就我的理解而言,以下是操作顺序。如果我错了,请告诉我。我将在我的示例中使用上面指定的配置文件。

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

此外,我还想知道这种技术是否也被称为ssh 堆栈

答案1

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

错误,没有 netcat。

1) 用户ssh final在 localhost 上输入。这将启动父 ssh 进程
2) 父 ssh 创建子 ssh,并将 I/O 重定向到管道
3) 子 ssh 创建到 bastion.com 的连接。
4) sshdbastion.com 上的进程创建到 final.com:22 的 tcp 连接
5) 向 localhost 和 bastion.com 之间的现有 ssh 连接添加 ssh 通道
6) 父 ssh 将握手数据写入管道,子 ssh 从管道读取数据,通过 ssh 通道发送到 bastion.com 上的 sshd;sshd 读取数据并将其写入连接到 final.com 的套接字。同样,数据从 final.com 传输到 localhost

答案2

长话短说,ProxyCommand这只是一个命令,用于构建一个伪套接字来替换addr:portSSH 服务器的真实套接字。

%h和是 ProxyCommand 用来替换目标主机和目标端口%p的令牌。因此将被替换为。%h%pssh [email protected] -W %h:%pssh [email protected] -W final.com:22

相关内容