これを理解しているように、ファイアウォール(デフォルト設定を想定)は、対応する以前の送信トラフィックのないすべての受信トラフィックを拒否します。
ssh接続のリバース および SSHトンネリングを容易にする に基づいて、リバースSSHトンネリングを使用して厄介なファイアウォール制限を回避できます。
リモートマシンでシェルコマンドを実行したい。リモートマシンには独自のファイアウォールがあり、追加のファイアウォール(ルーター)の背後にあります。それは192.168.1.126(または同様の何か)のようなIPアドレスを持っています。私はファイアウォールの背後にいておらず、インターネットから見たリモートマシンのIPアドレス(192.168.1.126アドレスではない)を知っています。さらに、最初にリモートマシンでrootとしてssh (something)
を実行するように依頼することもできます。
ファイアウォール(ローカルマシンとリモートマシンのファイアウォール、およびそれらの間の追加のファイアウォール)を回避するためにリバースSSHトンネリングがどのように機能するかを誰かが段階的に説明してくれませんか?
スイッチの役割は何ですか(-R
、-f
、-L
、-N
)?
このようなことを視覚化して説明するのが大好きです。 :-)
SSH接続をチューブと考えてください。大きなチューブ。通常、これらのチューブを経由してリモートコンピューターでシェルを実行します。シェルは仮想端末(tty)で実行されます。しかし、あなたはすでにこの部分を知っています。
トンネルをチューブ内のチューブと考えてください。まだ大きなSSH接続がありますが、-Lまたは-Rオプションを使用すると、その中に小さなチューブを設定できます。
すべてのチューブには始まりと終わりがあります。大きなチューブ、SSH接続は、SSHクライアントで始まり、接続したSSHサーバーで終わります。小さい方のすべてのチューブのエンドポイントは同じですが、「開始」または「終了」の役割は、-L
または-R
(それぞれ)を使用して作成したかどうかによって決まります。
(まだ言っていませんが、ファイアウォールの背後にある「リモート」マシンがネットワークアドレス変換(NAT)を使用してインターネットにアクセスできると想定します。これは一種の重要なため、誤っている場合は、この仮定を修正してください。)
トンネルを作成するときは、トンネルが応答するアドレスとポート、およびトンネルが配信されるアドレスとポートを指定します。 -L
オプションは、トンネルのローカル側(クライアントを実行しているホスト)で応答するようにトンネルに指示します。 -R
オプションは、リモート側(SSHサーバー)で応答するようにトンネルに指示します。
だから...ファイアウォールの背後にあるマシンにインターネットからSSHで接続できるようにするには、問題のマシンに外界へのSSH接続を開き、「エントリ」ポイントがである-R
トンネルを含める必要があります。彼のつながりの「リモート」側。
上記の2つのモデルのうち、右側のモデルが必要です。
ファイアウォールで保護されたホストから:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
これは、-R
emoteエントリポイントを使用してトンネルを確立するようにクライアントに指示します。トンネルの遠端のポート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
は、適切な任意のホスト名にすることができ、解決可能なものと一致する必要はありません。
以下も参照してください。
Sshトンネルコマンドが入力されるマシンは、"your Host"と呼ばれます。
ローカル:-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
に転送します。機械。
リモート:-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(つまり、ファイアウォール付きコンピューター自体)に転送されます。
sshトンネリングは、追加のトラフィックを送信するためにすでに確立されているssh接続を使用して機能します。
リモートサーバーに接続する場合、通常、通常のユーザー操作用に1つのチャネルしかありません(STDIN/STDOUT/STDERRを個別に検討する場合は3つのチャネル)。ローカルまたはリモートのsshプロセスは、いつでも既存の接続で追加のチャネルを開くことができます。これらのチャネルは、トンネルトラフィックを送受信します。トラフィックを送受信するとき、sshプロセスは単に「このトラフィックはチャネルfoobarに対するものです」と言います。
基本的には次のように機能します。
127.0.0.1
を使用しますが、変更できます)。このプロセスは、フォワードトンネリングとリバーストンネリングの両方でまったく同じです(上記の手順で「ローカル」と「リモート」の単語を入れ替えるだけです)。どちら側でもトンネルを開始できます。最初に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にバインドされます。
このポートへの接続が行われるたびに接続がセキュアチャネルを介して転送され、接続が行われますリモートマシンから
Host
ポートhostport
へ。
次の例では、ポート1234を使用して、クライアントマシン127.0.0.1
(localhost
)からリモートサーバー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トンネリング 。
-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
であることを確認します