web-dev-qa-db-ja.com

リバースSSHトンネリングはどのように機能しますか?

これを理解しているように、ファイアウォール(デフォルト設定を想定)は、対応する以前の送信トラフィックのないすべての受信トラフィックを拒否します。

ssh接続のリバース および SSHトンネリングを容易にする に基づいて、リバースSSHトンネリングを使用して厄介なファイアウォール制限を回避できます。

リモートマシンでシェルコマンドを実行したい。リモートマシンには独自のファイアウォールがあり、追加のファイアウォール(ルーター)の背後にあります。それは192.168.1.126(または同様の何か)のようなIPアドレスを持っています。私はファイアウォールの背後にいておらず、インターネットから見たリモートマシンのIPアドレス(192.168.1.126アドレスではない)を知っています。さらに、最初にリモートマシンでrootとしてssh (something)を実行するように依頼することもできます。

ファイアウォール(ローカルマシンとリモートマシンのファイアウォール、およびそれらの間の追加のファイアウォール)を回避するためにリバースSSHトンネリングがどのように機能するかを誰かが段階的に説明してくれませんか?

スイッチの役割は何ですか(-R-f-L-N)?

376
Ali

このようなことを視覚化して説明するのが大好きです。 :-)

SSH接続をチューブと考えてください。大きなチューブ。通常、これらのチューブを経由してリモートコンピューターでシェルを実行します。シェルは仮想端末(tty)で実行されます。しかし、あなたはすでにこの部分を知っています。

トンネルをチューブ内のチューブと考えてください。まだ大きなSSH接続がありますが、-Lまたは-Rオプションを使用すると、その中に小さなチューブを設定できます。

すべてのチューブには始まりと終わりがあります。大きなチューブ、SSH接続は、SSHクライアントで始まり、接続したSSHサーバーで終わります。小さい方のすべてのチューブのエンドポイントは同じですが、「開始」または「終了」の役割は、-Lまたは-R(それぞれ)を使用して作成したかどうかによって決まります。

(まだ言っていませんが、ファイアウォールの背後にある「リモート」マシンがネットワークアドレス変換(NAT)を使用してインターネットにアクセスできると想定します。これは一種の重要なため、誤っている場合は、この仮定を修正してください。)

トンネルを作成するときは、トンネルが応答するアドレスとポート、およびトンネルが配信されるアドレスとポートを指定します。 -Lオプションは、トンネルのローカル側(クライアントを実行しているホスト)で応答するようにトンネルに指示します。 -Rオプションは、リモート側(SSHサーバー)で応答するようにトンネルに指示します。

ssh tunnel directions

だから...ファイアウォールの背後にあるマシンにインターネットからSSHで接続できるようにするには、問題のマシンに外界へのSSH接続を開き、「エントリ」ポイントがである-Rトンネルを含める必要があります。彼のつながりの「リモート」側。

上記の2つのモデルのうち、右側のモデルが必要です。

ファイアウォールで保護されたホストから:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

これは、-Remoteエントリポイントを使用してトンネルを確立するようにクライアントに指示します。トンネルの遠端のポート22222に接続するものはすべて、実際には「localhostポート22」に到達します。「localhost」は、トンネルの出口点(つまり、sshクライアント)の観点からです。

その他のオプションは次のとおりです。

  • -fは、認証後にsshにバックグラウンド自体を通知するため、トンネルが存続するためにリモートサーバーで何かを実行している必要はありません。
  • -Nは、SSH接続が必要であるが、実際にはリモートコマンドを実行したくないことを示しています。作成しているのがトンネルだけの場合、このオプションを含めるとリソースを節約できます。
  • -Tは疑似tty割り当てを無効にします。これは、インタラクティブなシェルを作成しようとしないので適切です。

パスワードなしのログイン用にDSAまたはRSAキーを設定していない場合、パスワードの確認が必要になります。

このトンネル/顧客/サーバーだけに設定した使い捨てのアカウント(自分のログインではなく)を使用することを強くお勧めします。

yourpublichostのシェルから、トンネルを介してファイアウォールホストへの接続を確立します。

ssh -p 22222 username@localhost

これまでにこのホストにアクセスしたことがないため、ホストキーのチャレンジが発生します。次に、usernameアカウントのパスワードチャレンジを取得します(パスワードなしのログイン用のキーを設定していない場合)。

このホストに定期的にアクセスする場合は、~/.ssh/configファイルに数行を追加して、アクセスを簡略化することもできます。

Host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

remotehostnameおよびremoteusernameを調整してください。 remoteusernameフィールドは、リモートサーバー上のユーザー名と一致する必要がありますが、remotehostnameは、適切な任意のホスト名にすることができ、解決可能なものと一致する必要はありません。

以下も参照してください。

433
ghoti

スケッチを描いた

Sshトンネルコマンドが入力されるマシンは、"your Host"と呼ばれます。

ssh tunnel starting from local


ssh tunnel starting from remote

前書き

  1. ローカル:-L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.

    _ssh -L sourcePort:forwardToHost:onPort connectToHost_は、sshを使用してconnectToHostに接続し、すべての接続試行をlocalsourcePortに転送しますonPortと呼ばれるマシンのforwardToHostというマシンのポートconnectToHostに転送します。機械。

  2. リモート:-R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.

    _ssh -R sourcePort:forwardToHost:onPort connectToHost_は、sshを使用してconnectToHostに接続し、すべての接続試行をremotesourcePortに転送しますonPortと呼ばれるマシンのポートforwardToHostにローカルから到達できます機械。

追加オプション

  • _-f_は、認証後にsshにバックグラウンド自体を通知するので、トンネルを存続させるためにリモートサーバーで何かを実行している必要はありません。
  • _-N_は、SSH接続が必要だが、実際にはリモートコマンドを実行したくないことを示しています。作成しているのがトンネルだけの場合、このオプションを含めるとリソースを節約できます。
  • _-T_は疑似tty割り当てを無効にします。これは、対話型シェルを作成しようとしないため適切です。

あなたの例

3番目の画像はこのトンネルを表しています。 しかし、「your Host」と呼ばれる青いコンピューターは、someoneがsshトンネルを開始するコンピューターを表します。この場合はファイアウォールで保護されたマシンです。

したがって、someoneに依頼して、マシンへのsshトンネル接続を開始してください。コマンドは基本的に次のようになります

_ssh -R 12345:localhost:22 YOURIP
_

これでトンネルが開かれました。次のコマンドを使用して、トンネルを介してssh経由でファイアウォールで保護されたマシンに接続できます

_ssh -p 12345 localhost
_

これは、ポート_12345_で独自のlocalhost(マシン)に接続しますが、ポート_12345_は、トンネルを介して、ファイアウォール付きコンピューターのローカルホストのポート22(つまり、ファイアウォール付きコンピューター自体)に転送されます。

389
erik

sshトンネリングは、追加のトラフィックを送信するためにすでに確立されているssh接続を使用して機能します。

リモートサーバーに接続する場合、通常、通常のユーザー操作用に1つのチャネルしかありません(STDIN/STDOUT/STDERRを個別に検討する場合は3つのチャネル)。ローカルまたはリモートのsshプロセスは、いつでも既存の接続で追加のチャネルを開くことができます。これらのチャネルは、トンネルトラフィックを送受信します。トラフィックを送受信するとき、sshプロセスは単に「このトラフィックはチャネルfoobarに対するものです」と言います。

基本的には次のように機能します。

  1. ポートXXXXでリッスンを開始するようにsshに指示し、受信したすべてのトラフィックをトンネリングし、ポートZZZZでY.Y.Y.Yに設定するように指示します。
  2. ローカルsshはポートXXXXでリッスンを開始します(通常は127.0.0.1を使用しますが、変更できます)。
  3. 一部のアプリケーションは、ローカルマシンのポートXXXXへの接続を開きます。
  4. ローカルsshはリモートsshへのチャネルを開き、「このチャネルのトラフィックはすべてY.Y.Y.Y:ZZZZに移動します
  5. リモートsshはY.Y.Y.Y:ZZZZに接続し、「OK、チャネルは開いています」を返信します
  6. これで、ローカルマシンのポートXXXXへの接続に沿って送信されたトラフィックは、sshによってY.Y.Y.Y:ZZZZにプロキシされます。

このプロセスは、フォワードトンネリングとリバーストンネリングの両方でまったく同じです(上記の手順で「ローカル」と「リモート」の単語を入れ替えるだけです)。どちら側でもトンネルを開始できます。最初にsshを起動するときでなくてもかまいません。 sshがすでに実行されているときにトンネルを開くことができます(ESCAPE CHARACTERS、具体的には~Cを参照)。

-R-f-L、および-Nの役割については、manページを参照するだけで十分な説明が得られます。ただし、-R-Lについては触れておきます。
-Rは、リモートsshに接続をリッスンするように指示し、ローカルsshが実際の宛先に接続するように指示します。 -Lは、ローカルsshに接続をリッスンするように指示し、リモートsshが実際の宛先に接続するように指示します。

これは非常に大まかな説明ですが、何が起こっているのかを知るのに十分な情報が得られるはずです

24
Patrick

これはSSHマニュアルで説明されており、特に-L(ローカル)と-R(リモート)の違いについて説明しています。


-L

-L [bind_address:]port:Host:hostport

ローカル(クライアント)ホスト上の与えられたポートをリモート側の指定されたホストとポートに転送することを指定します。

これは、ローカル側のポートをリッスンするソケットを割り当てることで機能し、オプションで指定されたbind_addressにバインドされます。

このポートへの接続が行われるたびに接続がセキュアチャネルを介して転送され、接続が行われますリモートマシンからHostポートhostport

次の例では、ポート1234を使用して、クライアントマシン127.0.0.1localhost)からリモートサーバーserver.example.comにトンネリングIRCセッションします。

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

注:-fオプションはsshをバックグラウンドで実行し、リモートコマンドsleep 10は、トンネリングされるサービスを開始するための時間を確保するために指定されます。

例:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N接続後、そのままハングアップします(シェルプロンプトは表示されません)。

    リモートコマンドを実行しないでください。

  • -L 22000接続は個人用のポート22000で始まります[〜#〜] l [〜#〜]ocal machine

  • localhost:11000-remote.server.comは、トンネルのもう一方の端がlocalhost、ポート11000であることを確認します

ssh -N -L 22000:192.168.1.2:11000 remote.server.com

出典: 図解ガイド、チュートリアル、ハウツー、sshトンネリング


-R

-R [bind_address:]port:Host:hostport

リモート(サーバー)ホスト上の与えられたポートを、ローカル側の指定されたホストとポートに転送することを指定します。

これは、リモート側でportをリッスンするソケットを割り当てることで機能し、このポートへの接続が行われるたびに接続が転送されますセキュアチャネル経由で、ローカルマシンからHostポートhostportに接続されます

例:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N接続後、そのままハングアップします(シェルプロンプトは表示されません)。

    リモートコマンドを実行しないでください。

  • -R 22000接続は、[〜#〜] r [〜#〜]リモートコンピュータのポート22000で始まります(この場合、remote.server.com)

  • localhost:11000個人のローカルコンピュータは、トンネルのもう一方の端がlocalhost、ポート11000であることを確認します

ssh -N -R 22000:localhost:11000 remote.server.com

出典: 図解ガイド、チュートリアル、ハウツー、sshトンネリング

18
kenorb