視覚化を通じてこのようなことを説明するのが大好きです。:-)
SSH接続をチューブと考えてください。大きなチューブ。通常、これらのチューブを介して、リモートコンピューターでシェルを実行します。シェルは仮想端末(tty)で実行されます。しかし、あなたはすでにこの部分を知っています。
トンネルをチューブ内のチューブと考えてください。まだ大きなSSH接続がありますが、-Lまたは-Rオプションを使用すると、その内部に小さなチューブをセットアップできます。
すべてのチューブには始まりと終わりがあります。大きなチューブであるSSH接続は、SSHクライアントで始まり、接続したSSHサーバーで終わります。すべての小さなチューブは、「開始」または「終了」の役割は、あなたが使用したかどうかによって決定されることを除いて、同じエンドポイントを持っている-L
か、-R
それらを作成するために、(それぞれ)。
(あなたは言っていませんが、ファイアウォールの背後にある「リモート」マシンは、ネットワークアドレス変換(NAT)を使用してインターネットにアクセスできると仮定します。これは重要なことなので、 falseの場合は、この仮定を修正してください。)
トンネルを作成するときに、応答するアドレスとポート、および配信先のアドレスとポートを指定します。この-L
オプションは、トンネルのローカル側(クライアントを実行しているホスト)で応答するようにトンネルに指示します。この-R
オプションは、トンネルにリモート側(SSHサーバー)で応答するように指示します。
だから...インターネットからファイアウォールの背後にあるマシンにSSHで接続するには、対象のマシンが外部とのSSH接続を開き、-R
「エントリ」ポイントが「リモート」側であるトンネルを含める必要があります。彼の接続。
上記の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
あなたはおそらくこのホストを一度もヒットしたことがないので、ホストキーのチャレンジを取得します。次に、username
アカウントのパスワードチャレンジを取得します(パスワードなしのログイン用のキーを設定していない場合)。
このホストに定期的にアクセスする場合は、~/.ssh/config
ファイルに数行を追加することでアクセスを簡素化することもできます。
host remotehostname
User remoteusername
Hostname localhost
Port 22222
調整remotehostname
しremoteusername
て合わせます。このremoteusername
フィールドは、リモートサーバー上のユーザー名と一致する必要がありますが、remotehostname
任意のホスト名を使用できます。解決可能なものと一致する必要はありません。
(非ローカルホスト IPでリバースエンドポイントを公開するには、この投稿をチェックしてください)