通过多个“跳转”实现 SSH socks 代理

通过多个“跳转”实现 SSH socks 代理

我想创建一个 SOCKS 代理,用于通过多个 SSH 跳转访问一些远程 HTTP 应用程序。

我的意图如下:

myHost:4321 -> HostA(sshd) -> HostB(sshd) -> HostsX(app)

如果不需要经过主机B,创建SOCKS代理的命令非常简单:

ssh -D 4321 HostA -N

但是我不知道如何在命令中添加“跳转”;例如以下错误输出使用消息:

ssh -D 4321 -o ProxyCommand='ssh -J HostA' HostB -N

答案1

-J是(某类)的替代方案-o ProxyCommand=,(通常)不是附录。你可以像下面这样直接使用它:

ssh -ND 4321 -J HostA HostB

这是如何-J运作

-J destination
首先与 描述的跳转主机建立 ssh 连接destination,然后从那里建立到最终目的地的 TCP 转发,从而连接到目标主机。可以指定多个跳转点,用逗号分隔。[…]

注意ssh -J HostA HostB不是相当于从本地连接到 HostA,再从 HostA 连接到 HostB。 相当于从本地连接到 HostA,再从本地连接到 HostB(使用通过 HostA 转发的数据包)。

如果您指定了更多跳转主机(例如-J HostA,HostX,HostY,…),那么将通过连接本地计算机和前一个主机的隧道建立与每个额外主机的连接。与最终目的地的连接将使用以最后一台跳转主机为终点的隧道。所有连接都将从您的本地系统开始。

所以它不像菊花链。它像嵌套的管道(隧道),其中直径越来越小的每个管道都使用前一个(稍大)的管道,并将您的本地系统连接到越来越远的点。

错误图片,菊花链:

local ###> HostA ===> HostX +++> HostY ---> destination

右图,嵌套管:


      ###> HostA
      ==============> HostX
      +++++++++++++++++++++++++> HostY
      ------------------------------------>
local                                       destination
      ------------------------------------>
      +++++++++++++++++++++++++>
      ==============>
      ###>

这意味着,如果您想使用私钥,ssh -J那么只有本地可用的密钥ssh才重要。任何跳转主机上都不会调用任何 SSH 客户端;存储在跳转主机上的私钥(如果有)将无关紧要。

相关内容