web-dev-qa-db-ja.com

SSHトラフィックをミドルマシン経由で転送する

SSHトンネリングは私にとって非常に混乱します。私はLinuxでこれができるかどうか疑問に思います。

私は3台のマシンを持っています。

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

それで私はA - > BからそしてB - > CからSSH接続できますが、A - > Cからはできません。

AからBへのSSHトンネルを設定する方法はありますか。それで、他のSSHコマンドを実行すると、それは自分のローカルマシンAからしか機能しません。私は基本的に仕事から自宅にgitリポジトリを複製しようとしています(そして私はgitをマシンBにインストールすることはできません)。

また、一度設定します..どのようにそれを設定解除するでしょうか?

109
PKKid

これをhostAの.ssh/configファイルに入れます(詳細については man 5 ssh_config を参照してください)。

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

次のコマンドは自動的にhostBを通過します。

hostA:~$ ssh hostC

sshの内側にsshをラップするのは計算上コストがかかり、すでに暗号化されたトラフィックをトンネリングするときに余分な労力とラッパーを使用する必要がないため、-oCiphers=arcfour-oClearAllForwardings=yesのようなオプションを追加して作業をスピードアップできます。


5.3より前のOpenSSHを使用している場合は、-Wオプションは使用できません。この場合、netcat(nc)を使って上記を実装することができます。

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB
125
ephemient

編集:これは間違った方法です。代わりに ephemientの答え を見てください。この答えは機能しますが、潜在的に安全性が低く、間違いなくそれほど素晴らしいものではありません。

次のような解決策が必要なようです。

ssh -L localhost:22:machinec:22 machineb

これでmachinebのシェルになります。これは一人にしておきます。端末ウィンドウを最小化します。

さて、あなたがlocalhostにssh接続するときはいつでも、あなたは実際にmachinecを通してmachinebに接続されるでしょう。トンネルを使い終わったら、上記のコマンドを実行した端末を閉じてください。

コマンドを実行するにはスーパーユーザー権限が必要です。

6
Wesley

あなたはAでシェルエイリアスが欲しいように聞こえます。

  1. Aでは、ssh me @ b「ssh me @ c hostname」と入力して「C」に戻ることができると思います。
  2. Sshc fooをssh me @ bに拡張するエイリアスsshcを作成します。
  3. エイリアスを作成するための正確な構文については、superuser.comを参照してください。
3
Larry K

対話型シェルの場合、この単純なコマンドを使用できます。

ssh -J <user>@<hostB> <user>@<hostC>

-Jオプションはjump用です。

1
ssasa

もう一つの簡単な解決策

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • 最初のコマンドは、HostBへのssh接続を開き、HostBに接続の転送を指示します。 localhost:2222からHostC:22まで。
  • -fパラメータは、接続が確立されるとSSHにバックグラウンドに移行するように指示します
  • 2番目のコマンドは、単にlocalhostへのクライアント接続を開く:2222
  • OptionHostKeyAliasは必須ではありませんが、間違ったホストへの接続を防ぐのに役立ちます。
  • 注意:2番目のsshコマンドが転送ポートを使用するまで接続を維持するには、コマンドsleep 10が必要です。次に最初のsshが2番目のsshが転送されたポートを離れるときに閉じます。

これで後続のSSHセッションを実行できます。

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

変形:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

次のsshセッションは、実行することで開くことができます。

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

-Mおよび-Sパラメータを使用する主な利点は、HostAからHostCへの接続が1つだけ開かれていることです。その後のセッションでは、認証が行われず、実行速度が大幅に向上します。

0
F. Hauri

あなたの雇用主がVPNを提供している場合は、代わりにそれを使用することをお勧めします。

そうすれば、アプリケーションを特別に(sshでさえも)設定する必要がなくなり、ファイアウォールの内側にあるマシンを見ることができます。さらに、すべてのトラフィックはVPNソフトウェアによって暗号化されるため、不注意または意図的に暗号化されていないトラフィックにセキュリティが追加されます。

0
Andrew Wagner

特殊な場合、混合nixプラットフォーム

hostA(linux) - > HostB(solaris) - > HostC(linux)

HostC上にXアプリケーションが必要で、中間ホップがSolarisボックス上にある場合...この場合、ProxyCommandに必要なnetcat(nc)が次のように見つかります。

hostA:〜$ vi .ssh/config:

ホストhostC 
 ProxyCommand ssh hostB nc%h%p#ここで、ncはnetcat 
です。

その後、自動トンネリングが機能します。

hostA:〜$ sshのhostC

0
nsysdcw