web-dev-qa-db-ja.com

接続コンピューターへのリバースSSH接続を構成するにはどうすればよいですか?

近い将来、ルーターの背後に多数のマシンを配備する予定です。各ルーターとポート転送で動的DNSを設定することは現実的ではないので、これらのマシンを構成してTCPコンピューターへの接続を開始し、コンピューターを使用する方法があります。その接続を介してリモートコンピューターへのSSH接続を開始しますか?

IE:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

これは可能ですか?可能な場合、どうすればできますか?

20
Naftuli Kay

/etc/ssh/sshd for コンピュータBセット:

AllowTcpForwarding yes
TCPKeepAlive yes

からコンピュータA

$ ssh -R 2222:localhost:22 ip.of.computer.b

からコンピュータB

$ ssh localhost -p 2222

2222は私が選んだ任意のハイポート番号です。コンピュータBのそのポートは、コンピュータAで初期化されたSSH接続を介してポート22にトンネルされます。複数のマシンがある場合は、マシンごとに異なるポートを使用する必要があります。

ユースケースでは、おそらくこれをスクリプトから実行して、それをデーモンにして、リンクがドロップされた場合に定期的に再接続を試みることができます。着信接続を処理するために、おそらく/bin/trueのシェルがコンピュータBにある特別なアカウントが必要になるでしょう。次に、「コールホーム」を許可されているマシンごとに、単一のキーまたは複数のキーを設定できます。

コンピュータAでは、-n-N、および-Tオプションをローカル入力から切断して(バックグラウンドで実行できるようにする)のではなく、 ttyを作成せずに、リモートコマンドを実行し、トンネルを開くだけです。

デーモンを生成する通常の方法のほとんどは、このようなネットワークトンネルの設定ではうまく機能しません。ネットワーク接続の問題が原因で、壁を打ち破ろうとします。スリープするのを待つ単純なループでうまくいくはずです。 10分は問題です(コンピューターBがオフラインになっているなど)場合でもネットワークやログファイルが溢れることはありませんが、接続が適切であれば迅速に戻るため、いい数字です。ドロップされます。

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

このようなスクリプトは、ブート時に起動して実行できます/etc/rc.local。マシンにログインするための最初の変更は、コンピュータAが起動してから約10分後に開始されます。

21
Caleb