コンセプト

コンセプト

特定のサーバーを介してホストに接続するには、ProxyJumpssh 構成のコマンドを使用するか、端末から次のコマンドを使用して直接接続できます。

ssh -J user@server user@target-host

マニュアルには、スキップする最初のプロキシがあり、最初にジャンプしたネットワークで保護されている他のサブネットがある場合は、複数のサーバーをスキップすることができると述べています。複数のジャンプサーバーを提供することで、これを簡単に実行できます。

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

...その後、server1まずプライマリネットワークに移動し、次に再server2保護されたサブネットに移動します。

ただし、これまでは、代替ジャンプサーバー(メンテナンスのためにメインサーバーがダウンしている場合など)に関する情報はマニュアルにありません。

target-hostリンクしたい項目があり、冗長性の理由で複数の項目があるとします(たとえば、、、main-server1... )。その中から移動する項目を選択できます。main-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次に、指定されたコマンドが成功した場合にのみ接続します。

あなたの場合、2つの構成ブロックを実装できます。

  • target-serverアクセス権がある場合は、一致して直接接続してください。
  • target-serverアクセス権がない場合は、ジャンプホストにプロキシを使用して一致させます。

ここでの問題の1つは、ネットワークに同様の機能を持つ他のサーバーがありますが、予想と異なる場合はtarget-server不明なサーバーに直接接続しようとするとスクリプトが失敗することです(これが潜在的な行為を含む悪意のある行為者である場合)。 )。危険)

さらに進む

接続を試みる前にアイデンティティを確認するには、ホストキーを使用してtarget-serverクレームで予想されるキーとMatch比較します。

接続すると、目的のサーバーに互換性のあるホストキーがあることを確認できます。

  • もしそうなら、これはあなたのものであり、target-server直接接続を試すことができます
  • それ以外の場合は、ジャンプホストを使用した代替接続が使用されます。

はい

Match1行のコマンドのみが許可されます。読みやすくするためにシェルスクリプトを使用し、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

これがあなたのユースケースに合わない場合は、いつでも詳細を提供してください。

関連情報