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

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

私が理解したのは、ファイアウォール(デフォルト設定の仮定)は、以前に対応する発信トラフィックがないすべての着信トラフィックを拒否することです。

に基づいてリバースSSH接続そしてSSHトンネリングが容易になりました、リバースSSHトンネリングを使用すると、迷惑なファイアウォール制限を回避できます。

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

リバースSSHトンネルがファイアウォール(ローカルおよびリモートシステムのファイアウォールとその間の追加のファイアウォール)をバイパスする方法を段階的に説明できる人はいますか?

スイッチ(、、、、-R)の機能は何ですか?-f-L-N

答え1

私はこのことを可視化を通して説明するのが好きです。 :-)

SSH接続をパイプと考えてください。大きなチューブ。通常、これらのパイプを介してリモートシステムでシェルを実行します。シェルはこのパイプを介して仮想端末(tty)で実行されます。しかし、この部分はすでに知っています。

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

SSHリモートシェルは、実際にstdioに接続された小さな組み込みパイプの1つを使用してユーザーと通信します。

各チューブには始点と終点があります。大きなパイプ、SSH接続は、SSHクライアントから開始して接続するSSHサーバーで終わります。すべての小さなチューブには同じエンドポイントがあります。ただし、「開始」または「終了」の役割は、使用または-L作成-R(別途)によって異なります。

(まだ話していませんが、あなたが言った「リモート」マシン、つまりファイアウォールの背後にあるマシンがNAT(Network Address Translation)を使用してインターネットに接続していると仮定しています。これは重要ですので修正してください。教えてください。)

トンネルを作成するときにトンネルが応答する(または「バインディング」)アドレスとポート、および転送するアドレスとポートを指定します。この-Lオプションは、トンネルをトンネルのローカル側(クライアントを実行しているホスト)にバインドするように指示します。この-Rオプションは、トンネルにリモート側(SSHサーバー)からバインドするように指示します。

SSHトンネル方向

したがって、インターネットからファイアウォールの背後にあるホストとしてSSHを実行できるようにするには、ターゲットホストが外部ホストへのSSH接続を開き、-R「リモート」側の「エントリ」ポイントを含める必要があります。接続にトンネルがあります。

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

~からファイアウォールを含むマスター:

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

これにより、ターゲットホストのクライアントに、-R式エントリポイントを使用してトンネルを確立するように指示します。トンネルの終端ポート22222に接続されているすべてのエントリは、実際には「localhostポート22」に移動します。ここで、「localhost」は、トンネルの終点(たとえば、この場合はターゲットホストのSSHクライアント)の観点から表示されます。

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

  • -fsleep認証後にsshにバックグラウンド自体を指示すると、トンネルをアクティブに保つためにリモートサーバーに座ってこのようなタスクを実行する必要はありません。
  • -NSSH接続が必要ですが、実際にはリモートコマンドを実行したくないことを示します。作成中のものがトンネルのみの場合、このオプションを含めることでリソースを節約できます。
  • -T対話型シェルを作成したくないので、適切なpseudo-tty割り当てを無効にします。

パスワードのないログイン用のキーを設定しないと、パスワードの質問が発生します。

(接続を長時間放置して接続が切断さssh -O check <remotehost>れたときに自動的に接続を更新したい場合(parsingを介して)、特にこの/サーバーに別々の独自のSSHキートンネル/クライアントを設定することをお勧めします。RemoteForwardを使用してください。信じないでください)。

-R サービス トンネルが有効になっているので起動できます。あなたの公開ホスト、トンネルを介してファイアウォールホストへの接続を設定する:

ssh -p 22222 username@localhost

以前にホストにアクセスしたことがないため、ホストキーの質問が表示されます。その後、そのアカウントのパスワード要求が届きますusername(パスワードなしのログインキーを設定していない場合)。

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

host firewalledhost
    User firewalleduser
    Hostname localhost
    Port 22222

調整しfirewalledhostfirewalleduser適応してください。このfirewalleduserフィールドはリモートサーバーのユーザー名と一致する必要がありますが、firewalledhostあなたに適した名前である必要があります。接続Hostnameはおよびによって制御されるため、名前は解決可能な名前と一致する必要はありませんPort

または、インターネット上の他の場所からこのコンテンツにアクセスするには、以下をに追加できます~/.ssh/config

host firewalledhost
    ProxyCommand ssh -fWlocalhost:22222 yourpublichost        

この-Wオプションは、SSHセッションを続行するためにリモートホストへの接続を開くために使用されます。それはと-Nを意味します-T

また見なさい:

答え2

私はいくつかのスケッチを作りました。

SSH Tunnelコマンドを入力するマシンは次のとおりです。「あなたの所有者」

ローカルで始まるSSHトンネル


リモートから始まるSSHトンネル

紹介する

  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し、すべての接続試行を転送します。地元の sourcePortonPortポートにアクセスできる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し、すべての接続試行を転送します。離れて sourcePortonPortforwardToHostローカルコンピュータからアクセスできるコンピュータのポートに接続します。

その他のオプション

  • -f認証後にsshに直接バックグラウンドに入るように指示すると、リモートサーバーに座ってトンネルを維持するために何かを実行する必要はありません。
  • -NSSH接続が必要ですが、実際にはリモートコマンドを実行したくないことを示します。作成中のものがトンネルのみの場合、このオプションを含めることでリソースを節約できます。
  • -T対話型シェルを作成したくないので、適切なpseudo-tty割り当てを無効にします。

あなたの模範

3番目の画像はこのトンネルを表します。しかし、「Your Host」という青いコンピューターは、ホストがあるコンピューターを表します。SSHトンネル(この場合はファイアウォールで保護されているコンピュータ)を起動します。

だから聞いてくださいコンピュータへのSSHトンネル接続を開始します。コマンドは基本的に次のようになります

ssh -R 12345:localhost:22 YOURIP

これでトンネルが開かれました。これで、次のコマンドを使用して、トンネルを介してSSHを介してファイアウォールを持つシステムに接続できます。

ssh -p 12345 localhost

自分のlocalhostポート(コンピュータ)に接続されていますが、12345ポートは12345トンネルを介してファイアウォールを持つコンピュータ(つまり、ファイアウォールを持つコンピュータ自体)のローカルホストポート22に転送されます。

答え3

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

リモートサーバーに接続するとき、通常、一般的なユーザー対話には1つのチャネルしかありません(STDIN / STDOUT / STDERRを独立していると考える場合は3つのチャネル)。ローカルまたはリモートSSHプロセスは、いつでも既存の接続で追加のチャネルを開くことができます。その後、これらのチャネルはトンネルトラフィックを送受信します。トラフィックを送受信するとき、sshプロセスは単に「このトラフィックはチャンネルフーバー用です」と言います。

デフォルトでは、次のように動作します。

  1. sshにポートXXXXでリッスンを開始するように指示すると、受信したすべてのトラフィックはトンネリングされ、ポートZZZZからYYYYに送信される必要があります。
  2. ローカルSSHはポートXXXX(通常は存在しますが127.0.0.1変更可能)でリッスンを開始します。
  3. 一部のアプリケーションは、ローカルコンピュータのXXXXポートへの接続を開きます。
  4. ローカルSSHはリモートSSHへのチャネルを開き、「このチャネルのすべてのトラフィックはYYYY:ZZZZに送信されます」と言います。
  5. リモートSSHをYYYY:ZZZZに送信し、「OK、チャンネルが開いています」を再送信します。
  6. ローカルシステムのXXXXポートに接続されているすべてのトラフィックは、生成されたチャネルを使用してSSHを介してYYYY:ZZZZにプロキシされます。

プロセスは順方向と逆方向のトンネルでまったく同じです(上記のプロセスでは、「ローカル」と「リモート」という言葉だけを置き換えます)。どちらの方法でもトンネルを開始できます。 SSHを初めて起動する必要もありません。 SSHの実行中にトンネルを開くことができます(man ssh詳細についてはセクションを参照)。ESCAPE CHARACTERS~C

-R-f、そして何をして-Lいるのか、マンページを確認する必要があります-N。最高の説明を提供します。しかし私は述べるべき-Rおよび-L
-RリモートSSHに接続を受信するように指示し、ローカルSSHは実際の宛先に接続する必要があります。-LローカルSSHに接続を受信するように指示し、リモートSSHは実際の宛先に接続する必要があります。

これは非常におおよその説明ですが、何が起こっているのかを理解するのに十分な情報を提供します。

答え4

KISS - あなたのコンピュータ = your_computer_ip/your_user_name_at_your_computer リモートサーバー = REMOTE_ip/remote_user_name

ON - /etc/ssh/sshd_configファイルのVPN保護コンピュータ(リモートサーバー):

AllowTcpForwarding all
PermitTunnel yes

その後、SSHを再起動してください。

sudo service ssh restart

(私たちはポート2222を次のように設定しました。着信sshトランスポート)

ssh -R 2222:localhost:22 your_user_name_at_your_computer@you_computer_ip
  • **2222はランダムポートではありません! ! **
  • **rootユーザーだけが1024未満のポートを開くことができます!!!**

これで、VPNや他のすべてのものから切断できます。

コンピュータで端末を開きます

これで、コンピュータのポート2222がリモートホストにマップされました!

ssh localhost -p 2222 -l remote_user_name

関連情報