ターミナルサーバーがある場合は、プロキシサーバーaまたはプロキシサーバーbを介して接続できますが、時にはどちらか一方のみが機能することがあります。 ProxyJumpがプロキシサーバーaまたはbになることを指定する方法はありますかconfig
?ProxyCommand
悪くない、ただし、コマンドラインソリューション(パラメータまたは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
。) ホスト名以外の条件を適用できます。これらの標準には、exec
trueまたはfalseの戻りコードで結果を取得するためにスクリプトを実行するキーワードがあります。
この
exec
キーワードは、ユーザーシェルで指定されたコマンドを実行します。コマンドが終了状態 0 を返した場合、条件は true と見なされます。空白文字を含むコマンドは引用符で囲む必要があります。exec
トークンセクションで説明されているトークンを許可するパラメータ。
エージェントが開始されたことを確認するために使用できますが、ブール結果が必要なため、使用するエージェントを提供するためには使用できません。これはMatch
、可能なプロキシごとにエントリを設定する必要があることを意味します。通常どおり最初に一致するものが使用されます(ただし、最後の警告も参照してください)。
たとえば、スクリプトを次の場所に配置します~/.ssh/bin
。
mkdir ~/.ssh/bin
TCP層を最小限に検出するには、次のものを使用できます。socat
(nc
またはnmap
他の候補)提供されたホストおよびポートパラメータを使用してTCP接続を確認します。sh
以下の設定で追加の項目を避けるために実行可能にすることができます。
~/.ssh/bin/isjumphostavailable.sh
:
#!/bin/sh
MAXDELAY=4
socat /dev/null tcp:"$1":"$2",connect-timeout="$MAXDELAY"
socat
接続がすぐに終了する場合(の/dev/null
EOFのため)、ここでは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
前と同様に、この行(Host
sとまったく同じようには機能しません)も次のように書くことができます。Match
host
Host !proxy* *.example.com