特定のサーバーを介してホストに接続するには、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
次に、指定されたコマンドが成功した場合にのみ接続します。
あなたの場合、2つの構成ブロックを実装できます。
target-server
アクセス権がある場合は、一致して直接接続してください。target-server
アクセス権がない場合は、ジャンプホストにプロキシを使用して一致させます。
ここでの問題の1つは、ネットワークに同様の機能を持つ他のサーバーがありますが、予想と異なる場合はtarget-server
不明なサーバーに直接接続しようとするとスクリプトが失敗することです(これが潜在的な行為を含む悪意のある行為者である場合)。 )。危険)
さらに進む
接続を試みる前にアイデンティティを確認するには、ホストキーを使用してtarget-server
クレームで予想されるキーとMatch
比較します。
接続すると、目的のサーバーに互換性のあるホストキーがあることを確認できます。
- もしそうなら、これはあなたのものであり、
target-server
直接接続を試すことができます - それ以外の場合は、ジャンプホストを使用した代替接続が使用されます。
はい
Match
1行のコマンドのみが許可されます。読みやすくするためにシェルスクリプトを使用し、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
これがあなたのユースケースに合わない場合は、いつでも詳細を提供してください。