web-dev-qa-db-ja.com

SSHトンネルを介したSSH接続のショートカットを構成する方法

私の会社のプロダクションサーバー(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
22
Simone Carletti

カイルの回答のより具体的なバージョンとして、~/.ssh/configファイルに挿入する内容は次のとおりです。

Host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

Host a
  User johndoe

次に、「ssh foo」を実行すると、SSHはjohndoe@aへのSSHを試行し、netcatnc)を実行してから、これを介してwebby@fooへのSSHを実行します。トンネル。マジック!

もちろん、これを行うには、ゲートウェイサーバーにnetcatをインストールする必要があります。このパッケージは、すべての主要なディストリビューションとOSで利用できます。

36
womble

〜/ .ssh/configファイルでProxyCommandディレクティブを使用して、たとえばnetcatをリレーとして使用できます。

Host server2
    ProxyCommand ssh server1 nc server2 22

「ssh server2」を使用するだけです。このディレクティブのマニュアルページ情報は、「man ssh_config」にあります。

7
Kyle Brandt

私は、ゲートウェイサーバーへの事前認証済みトンネルを維持する別のアプローチを好みます。 ~/.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」への呼び出しは、事前に認証されたトンネルを介してほぼ瞬時に開きます。

よく働く。

5
Insyte

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/machine2machine2を介してトンネルされたmachine1のシェルを提供します。

seddirnameの代わりにカスタムbasenameコマンドを使用しても、異なるユーザー名の問題を解決できないのではないでしょうか。

2
Paul Price

これは、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
}
2
Marcin

このタイプの機能は、OpenSSHの新しいバージョンに存在し、次のようにして使用できます。

ssh -W server2 server1

どこ server2は目的地であり、server1はプロキシホストです。これは、ssh設定でProxyCommandオプションを使用することで簡単にできます。

Host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1
2
Scott Pack
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcatはaにインストールされていません。 ssh Host "command arg"を実行すると、commandはローカルマシンではなくHostで実行されます。

0
markdrayton

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
0
HBruijn