コマンドライン – ミドルマシンを介して SSH トラフィックを転送する

bash command-line git ssh tunnel

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からはSSHでき、B -> CからはSSHできますが、A -> Cからはできません

A から B への SSH トンネルを設定して、他の SSH コマンドを実行したときに私のローカルマシン A からだけ動作するようにする方法はありますか?私は基本的に仕事場から家に git repo をクローンしようとしています (そして、マシン B に git をインストールすることができません)

また、一度設定したら…同じように解除するにはどうすればいいのでしょうか?

  114  None  2010-02-11


ベストアンサー

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

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

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

hostA:~$ ssh hostC

-oCiphers=arcfour-oClearAllForwardings=yes のようなオプションを追加して高速化するのもいいかもしれませんが、 ssh の中で ssh をラップするのは計算量が多くなりますし、すでに暗号化されたトラフィックをトンネルする場合には、 余分な労力とラッパーの安全性は必要ないからです


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

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

135  ephemient  2010-02-11


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

のような解決策を求めているように聞こえます

ssh -L localhost:22:machinec:22 machineb

これで machineb のシェルが起動します。これはそのままにしておいて、ターミナルウィンドウを最小化してください

これで、localhost に ssh 接続をすると、実際には machinec から machineb に接続されることになります。トンネルの構築が終わったら、上記のコマンドを実行したターミナルを閉じてください

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

7  Wesley  2010-02-11


対話的なシェルの場合は、このシンプルなコマンドを使うことができます

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

Jオプションはジャンプ用です

4  ssasa  2018-11-24


A のシェルエイリアスで C で ssh が発生するようにしたいようですね

  1. A で ssh me@b に “ssh me@c ホスト名” と入力すると “C” が返ってくると思います
  2. sshc foo を ssh me@b “ssh me@c foo” に展開するエイリアス sshc を作成します
  3. エイリアスの作成の正確な構文については、superuser.comを参照してください

3  Larry K  2010-02-11


雇用主がVPNを提供しているのであれば、代わりにそちらを利用することをお勧めします

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

0  Andrew Wagner  2010-02-11


YASS まだ別のシンプルなソリューション

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 パラメータで、接続が確立したらバックグラウンドに移行するように指示します
  • 2番目のコマンドは、単にlocalhost:2222へのクライアント接続を開きます
  • オプション HostKeyAlias は必須ではありませんが、間違ったホストへの接続を防ぐのに役立ちます
  • 注意: 2 番目の ssh コマンドが転送ポートを使用するまで接続を維持するためには sleep 10 コマンドが必要です。その後、2 番目の ssh が転送ポートを離れると、最初の ssh は終了します

これで、後続の ssh セッションを実行できるようになりました

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

Variant:

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  2017-11-10


特殊なケース、ニックスのプラットフォームが混在しています

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

ホストC上でXアプリケーションが必要で、中間ホップがSolaris上にある場合、 ProxyCommand上で必要なnetcat (nc)を見つけました

hostA:~$ vi .ssh/config

Host hostC
ProxyCommand ssh hostB nc %h %p       # where nc is netcat

そうすると自動トンネリングが機能する

hostA:~$ ssh hostC

0  nsysdcw  2019-01-16


あるいは、OpenSSH 7.3ProxyJump ディレクティブを導入しています

Host final
ProxyJump intermediate

In example:

Host intermediate
Hostname 10.0.0.42
User root
Host final
Hostname final.destination.com
User foo
ProxyJump intermediate

そうすると、ssh finalは中間機を飛び越えます

0  Peque  2020-04-16


タイトルとURLをコピーしました