SSH構成ファイル用のProxyJumpへのいくつかの代替

SSH構成ファイル用のProxyJumpへのいくつかの代替

ターミナルサーバーがある場合は、プロキシサーバーaまたはプロキシサーバーbを介して接続できますが、時にはどちらか一方のみが機能することがあります。 ProxyJumpがプロキシサーバーaまたはbになることを指定する方法はありますかconfigProxyCommand悪くない、ただし、コマンドラインソリューション(パラメータまたはbashスクリプトを含む)は許可されていません。

Host proxya proxyb
    HostName %h.example.com
    User user1

# Proxy servers
Host end-server.example.com
    User user1
    ProxyJump   # Here, how should I configure "either `proxy1` or `proxy2`"?

ベストアンサー1

この回答はシェルスクリプトに依存しますが、opensshの設定段階で実行されます。

使用Match

Match宣言(これは宣言の親セットですHost。) ホスト名以外の条件を適用できます。これらの標準には、exectrueまたはfalseの戻りコードで結果を取得するためにスクリプトを実行するキーワードがあります。

このexecキーワードは、ユーザーシェルで指定されたコマンドを実行します。コマンドが終了状態 0 を返した場合、条件は true と見なされます。空白文字を含むコマンドは引用符で囲む必要があります。execトークンセクションで説明されているトークンを許可するパラメータ。

エージェントが開始されたことを確認するために使用できますが、ブール結果が必要なため、使用するエージェントを提供するためには使用できません。これはMatch、可能なプロキシごとにエントリを設定する必要があることを意味します。通常どおり最初に一致するものが使用されます(ただし、最後の警告も参照してください)。

たとえば、スクリプトを次の場所に配置します~/.ssh/bin

mkdir ~/.ssh/bin

TCP層を最小限に検出するには、次のものを使用できます。socatncまたはnmap他の候補)提供されたホストおよびポートパラメータを使用してTCP接続を確認します。sh 以下の設定で追加の項目を避けるために実行可能にすることができます。

~/.ssh/bin/isjumphostavailable.sh:

#!/bin/sh

MAXDELAY=4
socat /dev/null tcp:"$1":"$2",connect-timeout="$MAXDELAY"

socat接続がすぐに終了する場合(の/dev/nullEOFのため)、ここでは4秒以上待ちません。戻りコードはスクリプトの戻りコードを提供します。接続が成功した場合は0(=> true)、それ以外の場合は0(=> false)です。

上記のスクリプトを使用するには、構成は次のとおりです。

# Jump hosts' fixed settings
Host proxya proxyb
    Hostname %h.example.com
    User user1

# End server's fixed settings (the factorized part)
Host end-server.example.com
    User user1

# End server's settings with runtime detection (2 lines per distinct proxy)
Match host end-server.example.com exec "sh ~/.ssh/bin/isjumphostavailable.sh proxya.example.com 22"
    ProxyJump proxya

Match host end-server.example.com exec "sh ~/.ssh/bin/isjumphostavailable.sh proxyb.example.com 22"
    ProxyJump proxyb

メモ:

  • host以前の引数Hostname(存在する場合)の回避策を継承し、それを,区切り文字として使用します。したがって、host !proxy*.example.com,*.example.comエージェント自体を除く他のターミナルサーバーの状況に適用するために使用できます。
  • exec単一の文字列を引数として受け入れます。すべての項目は二重引用符で囲む必要があります。

警告する:

  • execスクリプトはコンフィギュレーション内の一致するすべてのアイテムに対して常に評価されるため、使用proxya可能であり、最初の一致として使用されてもproxybまだチェックされます。これを防ぐために、追加ファイルを使用してステータスや以前の決定(キャッシュとしても利用可能)を保存するなど、追加のインテリジェンスをスクリプトに追加して実際にプローブする回数を制限できます。使用可能なサーバーではなく使用可能なパスに関するものである場合(たとえば、VPNは特定のパスを追加しますか?)、何もエクスポートせずにスクリプトでip -json route get ... | jq ... 使用できます。あなたは理解しました。

使用ProxyCommand

ProxyJump主にラッパーProxyCommand。 verboseモードでも、ssh次のように書くことができます。

debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W '[%h]:%p' proxya
debug1: Executing proxy command: exec ssh -v -W '[end-server.example.com]:22' proxya

したがって、このラッパー以外に他のラッパーを使用するだけです。今回は、利用可能な最初のプロキシ候補が直接選択され、以前のMatch ... exec警告を克服します。スクリプトには、試行するプロキシのリストが含まれ、見つかった最初のアクセス可能なプロキシを使用します。

~/.ssh/bin/usefirstavailablejumphost.sh:

#!/bin/sh

MAXDELAY=4
for p in proxya proxyb; do
    if socat /dev/null tcp:"$p".example.com:22,connect-timeout="$MAXDELAY"; then
        exec ssh -W "[$1]:$2" "$p"
    fi
done
exit 1

注:このペア[](useからコピーしたばかりのもの)は、このパラメータを使用してIPv6アドレスを正しく処理するProxyJumpこともできます。-W

このスクリプトを使用して、以下を構成します。

# Jump hosts' fixed settings
Host proxya proxyb
    Hostname %h.example.com
    User user1

# End server's settings
Host end-server.example.com
    User user1
    ProxyCommand sh ~/.ssh/bin/usefirstavailablejumphost.sh %h %p

前と同様に、この行(Hostsとまったく同じようには機能しません)も次のように書くことができます。Matchhost

Host !proxy* *.example.com

おすすめ記事