概念

概念

如果我们想通过某个服务器连接到主机,我们可以使用ProxyJumpssh 配置中的命令或直接在终端中通过以下命令来实现:

ssh -J user@server user@target-host

该手册指出,如果我们有第一个代理要跳过,然后是另一个受我们最初跳入的网络保护的子网,则也可以跳过多个服务器。我们可以通过提供多个跳转服务器来简单地做到这一点:

ssh -J user@server1,user@server2  user@target-host

...这样我们server1首先跳到主网络,然后再次跳到server2受保护的子网。

但是,到目前为止,我无法在手册中找到有关替代跳转服务器的任何信息,例如在主服务器因维护而停机时。

假设我们有一个target-host想要连接的条目,并且由于冗余原因有多个条目,例如main-server1main-server2main-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

如果这不适合您的用例,请随时提供更多详细信息

相关内容