我想仅使用一个 SSH 命令访问我的任何服务器。我的问题是,当我使用“ProxyJump”或“ProxyCommand”时,“IdentityFile”会在我的计算机上搜索密钥。
配置中是否有任何选项可以使用远程键进行下一次跳转?
我有从第二级服务器开始的普通用户,我们称他们为“secondadmin”和“thirdadmin”。目前,我可以使用两个 ssh 命令访问第三级服务器,如下所示:
myuser@first-server: ~/$ ssh -i ~/.ssh/id_rsa secondadmin@second-server
secondadmin@second-server: ~/$ ssh -i ~/.ssh/id_rsa thirdadmin@third-server
我想模拟上述行为,并且暂时不想在这些服务器上为每个人设置单独的用户。如果没有必要,我也不想将管理员的私钥复制到我或任何其他用户的机器上。
答案1
ProxyJump
通过建立TCP 隧道通过代理从您的计算机到目标。然后它连接到本地隧道端点,从您的计算机到达目标计算机。与目标(或下一个代理)的连接从未最初从这些代理发起。
假设您有以下设置:
Host a
ProxyJump b
Host b
ProxyJump c
Host c
ProxyJump d
当你运行时ssh a
,它会执行以下操作,全部在本地机器(运行此命令的位置):
连接
d
并建立 TCP 隧道,比如说使用本地端口 11111 来c:22
连接到
localhost:11111
c:22,并从本地端口 22222 建立 TCP 隧道到b:22
连接到
localhost:22222
通向 b:22 的,并从本地端口 33333 建立到a:22
连接到
localhost:33333
,最终到达 a。
当然,实际端口将被随机选择。
您可以在建立连接后通过查看本地机器的连接表来观察这一点ss -npt
,因此您将看到所有这些。
请注意,所有连接都是从客户端计算机建立的,因此所有中间主机的所有密钥都必须在本地计算机上可用。所有这些机器可能没有任何密钥来相互连接,因为它们实际上并没有建立相互之间的 SSH 连接,而只是建立隧道连接。
然而,防火墙必须至少允许以下操作:b
允许a:22
、c
允许b:22
、d
允许c:22
,并且必须允许您的计算机d:22
。
答案2
将密钥复制到初始服务器是唯一的方法,因为 IdentityFile 始终从建立第一个连接的服务器读取(也对跳数进行排序)。其他服务器只是用于为后续服务器提供正确访问源的节点。