选择任何可用的 SSH 隧道

选择任何可用的 SSH 隧道

我需要连接到跳转主机后面的远程服务器。我可以通过多个跳转主机(位于不同区域)建立隧道来访问此远程服务器。

因此我需要通过任何可用的跳转主机连接到此远程服务器。如果其中一个跳转主机关闭(或者我可能手动选择关闭),我的连接必须自动选择任何可用的隧道,通过备用跳转主机连接到远程服务器。

host A ------------JumpHost1----------------remote host
          |                                 |
          |--------JumpHost2----------------|
          |                                 |
          |--------JumpHost3----------------|
          |                                 |
          |--------Jumphost4----------------|
          |                                 |
          |--------JumpHost5----------------|

答案1

假设-J destination( ProxyJump) 在您的 SSH 客户端版本上可用。

~/.ssh/config使用ssh_config(5) 中的关键字配置您的主机(目标主机和跳转主机) 。

-J destination
首先通过 ssh 连接到 描述的跳转主机destination,然后从那里建立到最终目的地的 TCP 转发,从而连接到目标主机。可以用逗号字符分隔指定多个跳转。这是指定ProxyJump配置指令的快捷方式。请注意,命令行上提供的配置指令通常适用于目标主机,而不是任何指定的跳转

-J由于和中的目标主机ProxyHosts均被访问依次,您不能将其用于故障转移跳转主机,因此您的配置将如下所示,例如,

Host target.example.com
  User username
  IdentityFile ~/.ssh/id_ed25519

Host jumphost?.example.com
  User username
  IdentityFile ~/.ssh/id_ed25519

然后,您可以-J在 Bash 脚本中使用该选项,例如jump.sh destination

#!/bin/bash

JumpHosts=(
  "jumphost1.example.com"
  "jumphost2.example.com"
  "jumphost3.example.com"
  "jumphost4.example.com"
  "jumphost5.example.com"
)

if [ "$#" -lt 1 ]; then
  echo "Usage: $0 [user@]target.example.com" >&2
  echo "Usage: $0 ssh://[user@]target.example.com[:port]" >&2
  exit 1
fi

for JumpHost in "${JumpHosts[@]}"; do
  echo "Connecting to $1 using jump host $JumpHost..."
  if ssh -J "$JumpHost" "$1"; then
    exit 0
  fi
  echo
done

echo "No working jump hosts available." >&2
exit 1

相关内容