如果我们想通过某个服务器连接到主机,我们可以使用ProxyJump
ssh 配置中的命令或直接在终端中通过以下命令来实现:
ssh -J user@server user@target-host
该手册指出,如果我们有第一个代理要跳过,然后是另一个受我们最初跳入的网络保护的子网,则也可以跳过多个服务器。我们可以通过提供多个跳转服务器来简单地做到这一点:
ssh -J user@server1,user@server2 user@target-host
...这样我们server1
首先跳到主网络,然后再次跳到server2
受保护的子网。
但是,到目前为止,我无法在手册中找到有关替代跳转服务器的任何信息,例如在主服务器因维护而停机时。
假设我们有一个target-host
想要连接的条目,并且由于冗余原因有多个条目,例如main-server1
、main-server2
、main-server3
、 ... 我们可以选择其中任何一个进行跳转。
如果main-server1
由于维护或其他原因而停机,我们仍然可以通过main-server2
, main-server3
, ...进行连接
有什么方法可以自动配置它,以便首先ssh
尝试通过连接main-server1
但失败后不会取消操作,而是继续尝试通过下一个可用服务器进行连接?
答案1
我偶然发现这篇博文从奥斯汀·米尔恩他详细介绍了如何在 SSH 配置中实现自动回退行为,以下建议基于他的帖子,有关更多信息,请随时参考它或在此处发表评论
概念
使用 SSH ConfigMatch
指令,您可以在连接到特定主机之前运行命令,从SSH 配置手册页:
Match Restricts the following declarations (up to the next Host
or Match keyword) to be used only when the conditions
following the Match keyword are satisfied. Match
您可以使用它来检查特定 IP 上正在运行的服务,例如:
Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
Match host mycomputer exec "ping 192.168.1.11"
mycomputer
然后只有当指定的命令成功时才能连接
在您的情况下,您可以实现两个配置块:
target-server
如果您可以访问,则匹配,直接连接到它target-server
如果您无法访问,则通过代理到您的跳转主机来匹配
这里的一个问题是,如果您当前的网络上有另一台具有类似功能的服务器,但不是预期的那样,target-server
那么脚本将会失败,因为您会尝试直接连接到未知服务器(如果这是恶意行为者,则包括潜在的风险)
更进一步
为了在尝试连接之前确保身份target-server
,您可以使用主机密钥,并将其与您在声明中期望的密钥进行Match
比较
连接后,您可以检查预期的服务器是否具有兼容的主机密钥
- 如果是,那么这是您的
target-server
,您可以尝试直接连接 - 如果没有,则将使用使用跳转主机的后备连接
例子
Match
仅接受单行命令,为了提高可读性,我们将使用 shell 脚本并从Match
命令中运行它:
要添加的脚本~/.ssh/scripts/check-host-fingerprints.sh
例如:
#!/bin/bash
tmpfile=$(mktemp /tmp/check-host-fingerprints.tmp.XXXXXX)
ssh-keyscan $1 2>/dev/null > $tmpfile
fingerprints=$(ssh-keygen -lf $tmpfile | awk '{print $2}')
for fingerprint in $fingerprints
do
if [ "$fingerprint" == "$2" ];
then
exit 0
fi
done
exit 1
注意:Austin 在他的博客文章中还提供了 Windows 的脚本和配置
然后,您将需要您的 IP 地址target-server
(请注意)并运行以下命令:
ssh -v <target-server>
并按如下方式取出 HOST_KEY:debug1: Server host key ssh-xxxxxx <HOST_KEY(SHA256:.*)>
现在,您可以通过在 SSH 配置中添加以下行来实现自动故障转移~/.ssh/config
:
Match host auto-failover exec "/bin/bash %d/.ssh/scripts/check-host-fingerprint.sh <TARGET-SERVER-IP> <TARGET-SERVER-HOST-KEY>"
<DIRECT-CONFIG>
Host auto-failover
<JUMPHOST-CONFIG>
将<TARGET-SERVER-IP>
和替换<TARGET-SERVER-HOST-KEY>
为您之前收集的值
DIRECT-CONFIG
将是您用来直接连接到主机的配置(即当本地计算机之间的直接连接target-server
可用时)
JUMPHOST-CONFIG
将是当您需要通过跳转主机连接来联系您时所使用的配置target-server
如果这不适合您的用例,请随时提供更多详细信息