パブリック IP を持つサーバーの背後に隠されたパブリック IP を持たないサーバーからパブリック IP を持たないサーバーに SSH 接続する

パブリック IP を持つサーバーの背後に隠されたパブリック IP を持たないサーバーからパブリック IP を持たないサーバーに SSH 接続する

次のような設定になっています。マシン C からマシン A にアクセスしたいのですが、どちらにもパブリック IP アドレスがありません。ただし、マシン C は、パブリック IP アクセスを持つマシン B と同じネットワーク内にあるため、最初にマシン B に ssh し、そこからマシン C に ssh することで、どこからでもマシン C にアクセスできます。マシン B ではルート アクセスがありませんが、A と CI ではルート アクセスがあります。説明については、次の図を参照してください。

machine A          machine B      machine C
no public IP       public IP      no public IP
root access        no root access root access     
how to access?    '---------------------------'
                           same network
                       hence both accessible

愚かな解決策としては、マシン A が定期的にマシン C のファイルをスニッフィングし (上記の 2 段階の ssh アクセスによって)、そのファイルにコマンドが出現するたびにそれを実行し、出力をマシン C のどこかの ssh に書き込むことです。しかし、ssh が何らかの方法で接続を「逆転」させて、マシン A が 2 段階でマシン C に接続し、その後接続が「逆転」して、マシン C が実際にマシン A のリモート シェルを持つようにすることは可能でしょうか。できるとしたら、どのようにすればよいでしょうか。

答え1

machineAリモート転送オプションを使用してへの SSH トンネルを開く必要があります。これにより、からmachineBに SSH 接続できるようになります。machineAmachineB

でルートアクセス権を持っている場合はmachineB、 でGatewayPorts設定オプションを にyes設定し/etc/ssh/sshd_config、 で次のコマンドを発行しますmachineA

ssh -N -R 0.0.0.0:2222:127.0.0.1:22 the_public_ip_of_machine_B

これにより、 のポート 2222 が開きmachineB、そのポートのすべてのトラフィックがポート 22 に転送されます。これは、パブリック インターフェイスを含むすべてのインターフェイスでリッスンするため、ポート番号 2222 をファイアウォールで保護することをお勧めします (ただし、ファイアウォールはおそらくオンになっています)。このトンネルがアクティブな間は、ポート 2222 で にmachineBSSH 接続して、 に移動できます。と は同じサブネット上にあるため、から に1 つの手順でログインできます。machineBmachineAmachineBmachineCmachineAmachineC

にルート アクセス権がない場合はmachineB、リスニング アドレスを除いてプロセスは同じです。GatewayPortsが に設定されている場合no(デフォルト)、最初の引数 ( 0.0.0.0) は単に無視され、リスニング アドレスは にバインドされます127.0.0.1。 この場合、上記のコマンドを引き続き使用でき、転送は同じように機能しますが、開かれたポートは 以外から使用できなくなります。 そのため、 に SSH で接続し、次にのポート 2222 に SSH で接続して に移動するmachineB必要があります。machineBlocalhostmachineA

ただし、VPN のようなより強力なものの使用を検討することもできます。

関連情報