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


22

会社の実稼働サーバー(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

回答:


36

カイルの答えのより具体的なバージョンとして、~/.ssh/configファイルに入れたいものは次のとおりです。

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

host a
  User johndoe

次に、「ssh foo」を実行すると、SSHはSSHへのSSH試行をjohndoe@a実行しnetcatnc)、次にwebby@fooこのトンネルを介してSSHを実行します。魔法!

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


優れた!私はそれを理解しようとしていました、私は以前にその正確な状況に出会ったことがありませんでした。将来、特定性の低い状況で他の人に役立つかもしれない場合に備えて、そこに私の答えを保管します。
カイルブラント

接続の詳細な出力を含む元の質問を更新しました。netcatを使用できないようです。デフォルトで使用可能にする必要がありますか?
シモーネ・カーレッティ09

常にではありませんが、インストールする権限はありますか?あなたは...私はそれを試したことがない、あまりにものtelnetでこれを行うことができるかもしれない
カイルブラント

また、netcatをホームディレクトリにダウンロードし、そこでコンパイルできる場合もあります。プロキシコマンドで完全なパスを使用できます。つまり、/ home / userName / bin / nc
Kyle Brandt

システム設定を確認しました。Ubuntuでは、デフォルトでnetcatが使用可能になっているようですが、残念ながらゲートウェイサーバーはOpenSUSEを使用しています。ゲートウェイサーバーにもnetcatをインストールすることを検討します。
シモーネ・カーレッティ09

7

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

host server2
    ProxyCommand ssh server1 nc server2 22

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


5

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

よく働く。


2

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

ssh -W server2 server1

server2目的の宛先とserver1プロキシホストはどこですか。ProxyCommandssh configで次のようなオプションを使用すると、これを簡単に行うことができます。

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

これが機能するためには、デスクトップ、中間、宛先の3つの場所すべてでOpenSSH 5.4+が必要と思われます。(まあ、最初と最後、確かに)。
スティーブベネット

@SteveBennett:しばらくこのメソッドを使用してきましたが、非常にうまく機能します。いくつかのRHEL5システムでnetcatメソッドに戻す必要があり、面倒でした。
スコットパック

2

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してあなたにシェルを与えるべきです。machine2machine1

sed代わりにカスタムコマンドを使用して、異なるユーザー名の問題を解決できないのdirnamebasenameはないかと思いますか?


2

これを行うことで達成できます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
}

これは、最も単純なソリューションです。今では、さらに35のアップ投票が必要です。(ところで-Aは私のために何もしません。)
スティーブベネット

0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

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


はい、知っています。これはまさに、wombleの答えに対するコメントで報告したものです。:)
シモーネ・カーレッティ09

0

OpenSSH 7.3(2016-08-01)以降、 ProxyJumpオプションと対応する-Jコマンドラインフラグを使用して、1つ以上のSSHバストションまたは「ジャンプホスト」を介したより単純な間接化が可能になりました。

これにより、Wombleのソリューションでnc見られる外部コマンドへの依存がなくなります

ssh -J johndoe@a webby@foo 

aユーザーjohndoeとしてワークステーションからゲートウェイサーバーへのSSH接続を確立し、その上でユーザーWebbyのホストfooにSSHセッションをトンネルします。

あなた~/.ssh/configとあなたの両方のホスト定義を作成することを簡素化するには、単に実行することができますssh foo

Host a
    User johndoe

Host foo
    User Webby 
    ProxyJump a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.