中間マシンを介してSSHトラフィックを転送する


110

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リポジトリのクローンを作成しようとしています(マシンBにgitをインストールすることはできません)。

また、一度セットアップすると..どのように設定を解除できますか?


どこかに重複した質問があると思いますが、今日の検索フーは弱いです。
いんちきキホーテ



マシンAでLinuxを実行している場合は、sshuttleというツールを使用します。これにより、CのすべてのトラフィックをA-> Bトンネルを介して選択的に転送できます(CがBから見えると仮定)。
joat

回答:


128

これ.ssh/configをhostA上のファイルに配置します(詳細については、man 5 ssh_configを参照)。

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

これで、次のコマンドがhostBを自動的にトンネルします

hostA:~$ ssh hostC

内部のラッピングは計算コストがかかり、余分な労力とラッパーは、既に暗号化されたトラフィックをトンネリングしているときほど安全である必要がないため、オプションを追加したり、速度を上げ-oCiphers=arcfourたりできます。-oClearAllForwardings=yessshssh


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

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

1
これは素晴らしいです!ありがとうございました。これにより、過去2日間私を悩ませてきた問題が解決されます。hostCはファイアウォールの背後にあり、世界中どこにでもあるラップトップhostAからアクセスしたいデータを持っています。hostBもhostCと同じファイアウォールの背後にありますが、SSHポートが世界中に公開されています。したがって、hostC-> hostBからsshを実行できます。hostCとhostBの間にリバースSSHトンネルを設定するので、hostB-> hostC(localhost経由で転送)からsshを実行することもできます。あなたのトリックで、私はhostA-> hostCから行くことができます!OSXのSCPとFuguでシームレスに動作します!ありがとうございました!
AndyL

-Wオプションでは、代わりに使用する必要がありますncオプション。
vy32

-WhostA上のもの(オリジン)のみ、またはhostB上のもの(ミドルマシン)のみをサポートする必要があるSSHはどれですか?
ジョエレ

情報については、同じを介して到達する必要がある複数のホストがある場合、中間サーバーを介して複数のホストにアクセスすることが非常に簡単になるようにhostB複数のHost hostC行を宣言することが可能ProxyCommandです。
fduff

7

編集:これは間違ったアプローチです。代わりに、ephemientの回答を参照してください。この答えは機能しますが、潜在的に安全性が低く、間違いなく劣ります。

次のようなソリューションが必要なようです。

ssh -L localhost:22:machinec:22 machineb

これにより、上のシェルが取得されますmachineb。これはそのままにしておきます。端末ウィンドウを最小化します。

これで、にssh接続するたびにlocalhost、実際にに接続されmachinecますmachineb。トンネルが完了したら、上記のコマンドを実行したターミナルを閉じます。

コマンドを実行するには、スーパーユーザー権限が必要になることに注意してください。


+1ありがとうウェスリー。これが本当のsshトンネリングの答えです。ここではそれについての記事です:securityfocus.com/infocus/1816
ラリー・K

3
全体として、これは非常に悪いことです...しかし、私はこれをOpenSSHの古いバージョンまたは他のsshクライアントでやらなければなりませんでした。8022のような高いポートを選択できます。この方法では、localhostのsshサービスに干渉せず、rootとして実行する必要がありません。-p 8022sshコマンドに追加するだけです。そして、gitを使えば簡単に脳死します:URIを使用してくださいssh://localhost:8022/path/to/repo.git
一時的な

3

Cでsshが発生するAのシェルエイリアスが必要なように聞こえます

  1. Aでは、ssh me @ b "ssh me @ c hostname"と入力して、 "C"に戻ることができると仮定します。
  2. sshc fooをssh me @ b "ssh me @ c foo"に展開するエイリアスsshcを作成します
  3. エイリアスを作成する正確な構文については、superuser.comをご覧ください

1
-t対話型シェルssh-T必要な場合は、コマンドが与えられているかどうかを想定しているため、外側のsshのオプションに追加する必要があります。
一時的な

1

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

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

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


0

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

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


6
私たちはこれらのトリックを必要とする理由である時々そのVPN ...
ルイ

0

YASSさらにもう1つのシンプルなソリューション

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • 最初のコマンドはへのssh接続開くホストBをと言うホストBをからの接続転送するためにはlocalhost:222222:HostCに
  • -fパラメーターは、接続が確立されるとバックグラウンドに移行するようSSHに指示します
  • 2番目のコマンドは、単にlocalhost:2222へのクライアント接続を開きます
  • オプションHostKeyAliasは必須ではありませんが、間違ったホストへの接続を防ぐのに役立ちます
  • 注:sleep 102番目のsshコマンドが転送ポートを使用するまで接続を維持するには、コマンドが必要です。次に、2番目のsshが転送ポートを離れると、最初の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 paramを使用する主な利点は、HostAからHostCへの接続が1つだけ開かれ、後続のセッションが再度認証されず、はるかに速く実行されることです。


0

特殊なケース、混合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

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