私の会社のプロダクションサーバー(FOO、BAR ...)は、2つのゲートウェイサーバー(A、B)の背後にあります。サーバーFOOに接続するには、ユーザー名JOHNDOEでサーバーAまたはBとのssh接続を開く必要があります。次に、A(またはB)から、標準のユーザー名でSSH接続を開いているすべての本番サーバーにアクセスできます(これを呼び出します) WEBBY)。
だから、私はいつも次のようなことをしなければなりません:
ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server
ご想像のとおり、scp
を使用する必要がある場合、または複数の接続をすばやく開く必要がある場合、これは面倒です。
私はsshキーを設定しており、一部のショートカットには.ssh/configを使用しています。
タイプするために何らかのSSH構成を作成できるかどうか疑問に思っていました
ssh foo
sSHにすべての接続をオープン/転送させてください。出来ますか?
編集
wombleの答えはまさに私が探していたものですが、ゲートウェイサーバーにインストールされていないため、現在はnetcatを使用できません。
weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote Host
カイルの回答のより具体的なバージョンとして、~/.ssh/config
ファイルに挿入する内容は次のとおりです。
Host foo
User webby
ProxyCommand ssh a nc -w 3 %h %p
Host a
User johndoe
次に、「ssh foo」を実行すると、SSHはjohndoe@a
へのSSHを試行し、netcat
(nc
)を実行してから、これを介してwebby@foo
へのSSHを実行します。トンネル。マジック!
もちろん、これを行うには、ゲートウェイサーバーにnetcatをインストールする必要があります。このパッケージは、すべての主要なディストリビューションとOSで利用できます。
〜/ .ssh/configファイルでProxyCommandディレクティブを使用して、たとえばnetcatをリレーとして使用できます。
Host server2
ProxyCommand ssh server1 nc server2 22
「ssh server2」を使用するだけです。このディレクティブのマニュアルページ情報は、「man ssh_config」にあります。
私は、ゲートウェイサーバーへの事前認証済みトンネルを維持する別のアプローチを好みます。 ~/.ssh/config
:
Host a
ControlMaster auto
ControlPath ~/.ssh/control-master/%r@%h:%p
次に.bashrc
:
s () {
if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
then
ssh -t a ssh $1
else
if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
then
echo "Deleting stale socket..."
rm ~/.ssh/control-master/insyte@a:22
fi
echo "Opening master session..."
if ssh -Nf a
then
ssh -t a ssh $1
fi
fi
}
Fooに接続するには:
s foo
初めて接続すると、「a」に対して認証され、永続的なバックグラウンドのsshトンネルが開きます。その後の「s」への呼び出しは、事前に認証されたトンネルを介してほぼ瞬時に開きます。
よく働く。
netcat
がプロキシで利用できない場合は、次のトリックを試してください:
Host foo
User webby
ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'
Host a
User johndoe
その後、ssh foo
を実行できるはずです。
また、最近のバージョンのsshが(つまり、標準入力と出力を転送するための-W
コマンドを使用して)いる場合は、次を使用できる場合があります。
Host foo
User webby
ProxyCommand ssh -W foo:%p a
Host a
User johndoe
最後に、私がそれがクールだとわかったから(そして、それがユーザー名の違いのためにあなたの特定のケースで機能するからではなく) 友達のブログ投稿 は、この種のものを動的に再帰的にチェーンする方法を指摘していますSSHプロキシ(うまくいかないいくつかの事柄とともに):
Host */*
ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p
そして、ssh machine1/machine2
はmachine2
を介してトンネルされたmachine1
のシェルを提供します。
sed
とdirname
の代わりにカスタムbasename
コマンドを使用しても、異なるユーザー名の問題を解決できないのではないでしょうか。
これは、ssh -At johndoe@a ssh webby@foo
。 -A
コマンドはsshエージェントを転送し(プロキシで再認証する必要を回避できるため)、-t
ターミナルがプロキシに存在することを確認します。次のbash関数が役立つ場合があります。
ssh-bounce () {
local cmd=""
for i in "$@"; do
cmd+="ssh -At $i "
done
$cmd
}
このタイプの機能は、OpenSSHの新しいバージョンに存在し、次のようにして使用できます。
ssh -W server2 server1
どこ server2
は目的地であり、server1
はプロキシホストです。これは、ssh設定でProxyCommand
オプションを使用することで簡単にできます。
Host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found
Netcatはa
にインストールされていません。 ssh Host "command arg"
を実行すると、command
はローカルマシンではなくHost
で実行されます。
OpenSSH 7.3(2016-08-01)以降、ProxyJump
オプションと対応する-J
コマンドラインフラグを使用して、1つ以上のSSH要塞または「ジャンプホスト」を介したより単純な間接化を可能にしました。
Womble's solution にあるように、外部のnc
コマンドへの依存を取り除きます。
ssh -J johndoe@a webby@foo
ユーザーjohndoeとしてワークステーションからゲートウェイサーバーa
へのSSH接続を確立し、ユーザーWebbyのホストfooへのSSHセッションをトンネルします。
それを簡素化するには、~/.ssh/config
そしてあなたは単にssh foo
Host a
User johndoe
Host foo
User Webby
ProxyJump a