
次のような設定になっています。マシン 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 接続できるようになります。machineA
machineB
でルートアクセス権を持っている場合は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 で にmachineB
SSH 接続して、 に移動できます。と は同じサブネット上にあるため、から に1 つの手順でログインできます。machineB
machineA
machineB
machineC
machineA
machineC
にルート アクセス権がない場合はmachineB
、リスニング アドレスを除いてプロセスは同じです。GatewayPorts
が に設定されている場合no
(デフォルト)、最初の引数 ( 0.0.0.0
) は単に無視され、リスニング アドレスは にバインドされます127.0.0.1
。 この場合、上記のコマンドを引き続き使用でき、転送は同じように機能しますが、開かれたポートは 以外から使用できなくなります。 そのため、 に SSH で接続し、次にのポート 2222 に SSH で接続して に移動するmachineB
必要があります。machineB
localhost
machineA
ただし、VPN のようなより強力なものの使用を検討することもできます。