我应该使用 ssh“跳转主机”的哪种变体?

我应该使用 ssh“跳转主机”的哪种变体?

ssh据我所知,至少有 3 种配置变体可以jump_host用来连接到target_host

Host jump_host
  HostName 1.2.3.4

# Variant - 1
Host target_host
  HostName 172.16.0.1
  ProxyCommand ssh -q -x jump_host 'netcat %h 22'

# Variant - 2
Host target_host
  HostName 172.16.0.1
  ProxyCommand ssh -q -x jump_host -W '%h:22'

# Variant - 3
Host target_host
  HostName 172.16.0.1
  ProxyJump jump_host

这些方法是否比其他方法更好?配置 2 和 3 之间有什么区别(如果有的话)?显然配置 1 需要netcat手头有,所以它最没有吸引力。

答案1

变体 1 将验证两次。一次使用 proxy 命令建立连接,然后再次使用原始 ssh 命令。您还可以简单netcat %h %p地制作变体 1,并使用主机参数来完成您希望通过 ssh 命令完成的相同操作。

Host target_host
  HostName 172.16.0.1
  LogLevel QUIET
  ForwardX11 no
  ProxyCommand netcat %h %p

然而,即使这样,它也需要一个 pty 来支持 netcat 和一个额外的进程作为连接的一部分。

变体 2 与 netcat 执行相同的操作,但在内部并且不分配 pty,尽管如果需要,可以将其重写为与变体 1 完全相同。它还可以防止跳转主机上的任何设置,例如代理转发。

变体 1 和 2 使用 ProxyCommand,它是自动设置连接的通用方法。这些变体的存在主要是因为 ProxyJump 是在它之后才存在的。但 ProxyCommand 可用于通过连接设置执行更高级的操作。该文档引用了使用它来设置 HTTP CONNECT 代理以转发连接的示例。

变体 3 使用 ProxyJump,它本质上是一个内置的 TCP 代理,与变体 2 最相似,但允许更简单、更严格的链接。如果没有它,做同样的事情将如下所示:

Host jumphost2
  ProxyCommand ssh -W %h:%p jumphost1
Host server
  ProxyCommand ssh -W %h:%p jumphost2

但使用 ProxyJump 会是这样的:

Host server
  ProxyJump jumphost2,jumphost1

相关内容