回答:
私は通常、このようなものをセットアップします。中間ホストが名前を解決できると想定しています。
Host *%homeproxy
ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22
だから私は好きに接続しssh blah%homeproxyます。
%キャラクターについて特別なことは何もありません。本当に何でも使えます。パーセントは、ホスト名またはユーザー名では有効ではないため使用されます。cutProxyCommandをwithingコマンドが使用する%ホスト名を引き出すための区切り文字として。
ssh targetH。つまり、自宅からのターゲットを意味します。ターゲットにするローカルネットワークの場合は、単にssh target。しかし、答えでこれをもっと簡単に述べてくれてうれしかったです。
@till の回答に感謝します。
で接続を強制的にリダイレクトできることがわかりましたProxyCommand nc dst dst-port。
たとえば、使用すると実際に接続しB.comます
ssh A.com -o ProxyCommand="nc B.com 22"
しかし、UserKnownHostsFileまだ記録されますA.com
したがって、ドメイン「auto」を追加できます ssh_config
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
に置き換えましたnc -w 1 %h %pが(timeout 0.1 nc -z %h %p) && nc %h %p、100ミリ秒以内に内部サーバーに到達できれば、より高速になります。
またはping、に置き換えることもできますが、のようなTCPベースのプロキシを使用している場合proxychains、またはサーバーがICMPエコーを許可しない場合、不適切な情報を示している可能性があります。
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
(timeout 0.1 nc -z %h %p)内部サーバーにいるかどうかを検出するものに置き換えることができます。
複数の候補IPがある場合は、これも使用できます。
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
接続1.1.1.1に失敗し、接続2.2.2.2に失敗すると、接続を試行し3.3.3.3ます。
通常、このような別のエントリを作成します-
Host myVM
ProxyCommand ssh -W internal.ip:22 external-server
User ubuntu
Host myVM-np
User ubuntu
次に、現在のプロキシ環境に応じて、必要なものを呼び出します。