我需要连接到跳转主机后面的远程服务器。我可以通过多个跳转主机(位于不同区域)建立隧道来访问此远程服务器。
因此我需要通过任何可用的跳转主机连接到此远程服务器。如果其中一个跳转主机关闭(或者我可能手动选择关闭),我的连接必须自动选择任何可用的隧道,通过备用跳转主机连接到远程服务器。
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