私が理解しているように、ファイアウォール(デフォルト設定を想定)は、以前に対応する送信トラフィックがないすべての受信トラフィックを拒否します。
に基づく ssh接続を逆にするおよび SSHトンネリングを簡単にする、逆SSHトンネリングを使用して取得できます厄介なファイアウォールの制限について。
リモートマシンでシェルコマンドを実行したい。リモートマシンには独自のファイアウォールがあり、追加のファイアウォール(ルーター)の背後にあります。 192.168.1.126(または同様のもの)のようなIPアドレスを持っています。私はファイアウォールの背後にいないので、インターネットから見たリモートマシンのIPアドレス(192.168.1.126アドレスではありません)を知っています。さらに、誰かにssh (something)
を実行するように依頼できます。最初にリモートマシンのルートとして。
ファイアウォール(ローカルおよびリモートマシンのファイアウォールとそれらの間の追加のファイアウォール)を回避するためにリバースSSHトンネリングがどのように機能するかを段階的に説明してもらえますか?
スイッチの役割は何ですか(-R
、-f
、-L
、-N
)?
コメント
- 関連(ハウツー):接続しているコンピューターへの逆SSH接続を構成するにはどうすればよいですか?
回答
この種のことを視覚化して説明するのが大好きです。 🙂
SSH接続をチューブと考えてください。大きなチューブ。通常、これらのチューブを介してリモートコンピュータでシェルを実行します。シェルは仮想端末(tty)で実行されます。ただし、この部分はすでに知っています。
トンネルをチューブと考えてください。チューブ内。まだ大きなSSH接続がありますが、-Lまたは-Rオプションを使用すると、その中に小さなチューブを設定できます。
すべてのチューブには開始と終了があります。大きなチューブ、 SSH接続は、SSHクライアントで開始され、接続したSSHサーバーで終了します。「start」または「end」の役割が
または-R
(それぞれ)作成します。
(まだ言っていませんが、私は想定しますあなたが言及した「リモート」マシン、つまりファイアウォールの背後にあるマシンは、ネットワークアドレス変換(NAT)を使用してインターネットにアクセスできます。これは重要なことなので、間違っている場合はこの仮定を修正してください。)
トンネルを作成するときは、広告を指定します応答するドレスとポート、および配信先のアドレスとポート。 -L
オプションは、トンネルのローカル側(クライアントを実行しているホスト)で応答するようにトンネルに指示します。 -R
オプションは、リモート側(SSHサーバー)で応答するようにトンネルに指示します。
つまり…インターネットからファイアウォールの背後にあるマシンにSSHで接続できるようにするには、問題のマシンが外部へのSSH接続を開き、「エントリ」ポイントが接続の「リモート」側であるトンネル。
上記の2つのモデルのうち、右側のモデルが必要です。
ファイアウォールで保護されたホストから:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
これは、クライアントに-R
エモートエントリでトンネルを確立するように指示しますポイント。トンネルの遠端にあるポート22222に接続するものはすべて、実際には「localhostポート22」に到達します。「localhost」は、トンネルの出口ポイント(つまり、sshクライアント)から見たものです。
その他のオプションは次のとおりです。
-
-f
は、認証後にsshにバックグラウンドを設定するため、座って何かを実行する必要はありません。トンネルを存続させるためのリモートサーバー。 -
-N
は、SSH接続が必要であると言っていますが、実際にはリモートコマンドを実行したくないと言っています。作成しているのがトンネルだけの場合、このオプションを含めるとリソースを節約できます。 -
-T
は、疑似ttyの割り当てを無効にします。インタラクティブシェルを作成しようとしています。
パスワードなしのログイン用にDSAまたはRSAキーを設定していない限り、パスワードチャレンジが発生します。
これは非常に強力であることに注意してください。このトンネル/顧客/サーバーのみに設定した使い捨てアカウント(自分のログインではない)を使用することをお勧めします。
これで、シェルから yourpublichost 、トンネルを介してファイアウォールで保護されたホストへの接続を確立します:
ssh -p 22222 username@localhost
You “llおそらくこれまでこのホストにアクセスしたことがないので、ホストキーチャレンジを取得します。次に、username
アカウントのパスワードチャレンジを取得します(パスワードなしのログイン用のキーを設定していない場合)。
このホストに定期的にアクセスする場合は、~/.ssh/config
ファイルに数行追加することで、アクセスを簡素化することもできます。
host remotehostname User remoteusername Hostname localhost Port 22222
remotehostname
とremoteusername
を適切に調整します。remoteusername
フィールドは、リモートサーバー上のユーザー名と一致する必要がありますが、remotehostname
は、適切なホスト名にすることができ、解決可能なものと一致する必要はありません。
関連項目:
コメント
- ssh-Dについてはどうでしょうか。同じ方法で説明してください。
- SOCKSプロキシはトンネルと同じではありません。使用方法について質問がある場合は、質問してください。
- I ‘ mは、サーバー、クライアント、ローカルマシン、リモートマシン、ホスト、yourpublichost、localhost、remotehostnameという用語の使用が緩いため、この説明に従うのに非常に苦労しています。これらすべての緩く未定義の用語を使用すると、誰かがこれを設定するために最大8台のコンピューターが必要になると想定できます。他のすべての面でそれは非常に良い説明のように思われるので、私はこれを述べます。用語を減らして定義してください。
- @ Rucent88、I ‘どのような削減が可能かわかりません。クライアントはサーバーへの接続を確立します。その’は、ネットワーキングの世界全体で共通の用語です。ローカルマシンとリモートマシンはかなり自明のようです。ドキュメントを読んだ後、’ SSHまたはUNIXの一般的な用語について混乱している場合は、’必ず’ここで、質問に答えてくれる人を見つけるのに問題はありません。
- @ghoti ‘ローカルなので、本当に混乱します。リモートマシンは相対的です。職場に座っているときは自宅のコンピューターがリモートであり、自宅に座っているときは職場のコンピューターがリモートです。サーバーとクライアントも、トンネリングについて話すときに混乱します。たとえば、ssh-Rを使用して職場から自宅に接続する場合。 localhostに接続して、自宅のコンピューターから仕事に接続します。したがって、ソケットの観点からは、サーバーはホームコンピューター自体です。しかし、論理的には仕事用のコンピューターに接続しました。その’は紛らわしいです。
回答
描画しましたいくつかのスケッチ
ssh tunnelコマンドが入力されるマシンは、»ホスト«と呼ばれます。
はじめに
-
ローカル:
-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
に接続し、すべての接続試行をローカルsourcePort
をforwardToHost
というマシンのポートonPort
に送信します。connectToHost
マシンからアクセスできます。 -
リモート:
-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
に接続し、すべての接続試行をリモートsourcePort
からポートivid = “に転送しますforwardToHost
というマシン上のf5f8430b49 “>
。ローカルマシンからアクセスできます。
追加オプション
-
-f
は、認証後にsshにバックグラウンドを設定するように指示するため、リモートサーバーで何かを実行してトンネルを作成する必要はありません。生きたままです。 -
-N
は、SSH接続が必要であると言っていますが、実際にはリモートコマンドを実行したくないと言っています。作成しているのがトンネルだけの場合、このオプションを含めるとリソースを節約できます。 -
-T
は、疑似ttyの割り当てを無効にします。インタラクティブシェルを作成しようとしています。
例
3番目の画像はこのトンネルを表しています。 しかし、「ホスト」と呼ばれる青いコンピューターは、誰かがsshトンネルを開始するコンピューターを表します。この場合、ファイアウォールで保護されたマシンです。
したがって、誰かにマシンへのsshトンネル接続を開始するように依頼してください。コマンドは基本的に次のようになります。
ssh -R 12345:localhost:22 YOURIP
これで、トンネルが開きます。これで、コマンド
ssh -p 12345 localhost
を使用して、トンネルを介してssh経由でファイアウォールのかかったマシンに接続できます。このコマンドは、独自のlocalhost
(マシン)のポート12345
ですが、ポート12345
は、トンネルを介して、ファイアウォールで保護されたローカルホストのポート22に転送されます。コンピューター(つまり、ファイアウォールで保護されたコンピューター自体)。
コメント
- @erik、これらの画像をどのように描画しましたか?
- I Inkscape と呼ばれるオープンソースのベクトル描画ツールと私のマウスを使用しました(実際には、トラックボールです:LogitechのMarble FX)。
- @ghoti:デフォルトでは、サーバーのリスニングソケット(私の-Rイメージでは黄色のリモートホスト)は、ループバックインターフェースのみにバインドされます。これは、bind_addressを指定することでオーバーライドできます。空のbind_addressまたはアドレス「*」は、リモートソケットがすべてのインターフェイスでリッスンする必要があることを示します。 —試してみてください:青いコンピューターで
ssh -R 1234:localhost:8000 yellowcomputer
を起動します。また、青いマシンでpython -m SimpleHTTPServer
(ポート8000の単純なWebサーバー)を起動します。次に、黄色のマシンのWebブラウザーでURLhttp://localhost:1234
を開くと、それが機能することがわかります。 - @erik、ああ、紛らわしいのは私の目が悪い-コマンドで’の前にスペースが表示されませんでした
remotehost
。よく調べてみると、あなたの図は実際にはオプションのbind_addressをまったく扱っていないことがわかります’。混乱してすみません。 - @briankipはい、もちろんです。少なくとも、ファイアウォールの背後にあるコンピューターにssh接続を確立する場合(トンネルを介して、またはファイアウォールで許可されている場合は直接)。つまり、ファイアウォールで保護されたコンピューターで作成したsshコマンドはトンネルを開くだけですが、ssh-daemon / -serverとして起動または機能しません。次の質問は、 root権限なしでsshdを開始する方法です(それが問題である場合)。 🙂
回答
sshトンネリングは、追加のトラフィックを送信するためにすでに確立されているssh接続を使用して機能します。
リモートサーバーに接続する場合、通常は通常のユーザー操作用に1つのチャネル(またはSTDIN / STDOUT / STDERRを分離すると考える場合は3つのチャネル)しかありません。ローカルまたはリモートのsshプロセスは、いつでも既存の接続で追加のチャネルを開くことができます。次に、これらのチャネルはトンネルトラフィックを送受信します。トラフィックを送受信するとき、sshプロセスは単に「このトラフィックはチャネルfoobar用です」と言います。
基本的には次のように機能します。
- sshにリスニングを開始するように指示します。ポートXXXXで、受信したトラフィックをトンネリングしてから、ポートZZZZでYYYYに設定する必要があります。
- ローカルsshは、ポートXXXX(通常は
127.0.0.1
ただし、変更できます。 - 一部のアプリケーションは、ローカルマシンのポートXXXXへの接続を開きます。
- ローカルsshは、リモートsshへのチャネルを開き、「すべてのトラフィックこのチャネルではYYYY:ZZZZに移動します
- リモートSSHはYYYY:ZZZZに接続し、「OK、チャネルは開いています」を送り返します
- これで、接続に沿って送信されたトラフィックはすべてポートに送信されますローカルマシンのXXXXは、sshによってYYYY:ZZZZにプロキシされます。
このプロセスは、フォワードトンネリングとリバーストンネリングの両方でまったく同じです(「ローカル」と「リモート」という単語を入れ替えるだけです)。上記の手順)どちらの側もトンネルを開始できます。あなたが最初にsshを始めたときでさえある必要はありません。 sshがすでに実行されているときにトンネルを開くことができます(ESCAPE CHARACTERS
、具体的には~C
を参照)。
の役割について-R
、-f
、-L
、および-N
、あなたは本当にmanページを参照するべきです、それはあなたに可能な限り最良の説明を与えます。ただし、-R
と-L
について説明します。
-R
はリモートSSHに通知します接続をリッスンし、ローカルsshが実際の宛先に接続する必要があることを確認します。-L
は、ローカルsshに接続をリッスンし、リモートsshが実際の宛先に接続するように指示します。
注:これは非常に大雑把な説明ですが、何が起こっているのかを知るのに十分な情報が得られるはずです
回答
これはSSHマニュアルで説明されており、特に-L
(ローカル)と-R
(リモート)。
-L
-L [bind_address:]port:host:hostport
ローカル(クライアント)ホストの指定されたポートを指定されたホストに転送することを指定します。リモート側のポート。
これは、ローカル側のポートをリッスンするソケットを割り当て、オプションで指定されたbind_addressにバインドすることで機能します。
このポートに接続するたびに、接続は安全なチャネルを介して転送され、にivid =に接続されます。リモートマシンからの “e703675059”>
ポートhostport
。
次の例では、ポート1234を使用してクライアントマシン127.0.0.1
(localhost
)からリモートサーバーにIRCセッションをトンネリングしますserver.example.com
:
$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10
注:-f
オプションbackgroundsshとリモートコマンドsleep 10
を指定して、トンネリングされるサービスを開始する時間を確保します。
例:
ssh `-N` -L 22000:localhost:11000 remote.server.com
-
-N
接続後、そのままハングします(シェルプロンプトは表示されません)リモートコマンドを実行しないでください。
-
-L 22000
接続は個人のポート22000で開始されます L オカルマシン -
localhost:11000
–remote.server.com
は、トンネルのもう一方の端がlocalhost
、ポート11000
pであることを確認します。 >
出典: sshトンネリングに関する図解ガイド、チュートリアル、ハウツー。
-R
-R [bind_address:]port:host:hostport
リモート(サーバー)ホストの指定ポートをgに転送することを指定しますローカル側のivenホストとポート。
これは、
port
をリッスンするソケットを割り当てることで機能します。リモート側、およびこのポートに接続が確立されるたびに、接続はセキュリティで保護されたチャネルを介して転送されます。ローカルマシンからをhost
ポートhostport
に作成。
例:
ssh -N -R 22000:localhost:11000 remote.server.com
-
-N
接続したら、そのままハングします(シェルプロンプトは表示されません)リモートコマンドを実行しないでください。
-
-R
22000接続が開始されます R エモートコンピューター(この場合はremote.server.com)のポート22000 -
個人のローカルコンピュータは、トンネルのもう一方の端が
localhost
、ポート11000
出典: sshトンネリングに関する図解ガイド、チュートリアル、ハウツー。
コメント
- 耳と口は、誰が話しているのかを明確にします’誰が’聞いていますか!
- あなたのイラストが大好きです!
回答
リバースSSHトンネルの確立中のネットワークインターフェイスへのバインドについては、この投稿で説明されています。これは、2つの異なるネットワークに4台のコンピューターが存在する例です。