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