web-dev-qa-db-ja.com

SSHローカルポートフォワーディングが閉じないようにする

Azureで実行されているUbuntu仮想マシンでさまざまなサービスを実行していますが、ポートが公開されていなくても、一部のサービスにリモートアクセスしたいと考えています。そうするために、スクリプトを設定して SSHを使用したローカルポート転送 を実行します。

通常、これはリモートホストへの接続を開始することで機能し、sleep 10、そしてsleepコマンドが完了する前に転送されたポートで接続を確立します。これは、リモートSMB共有など、接続を維持するサービスを使用する場合にうまく機能します。

しかし、接続が確立してから10〜90秒後、しばらくすると接続が閉じるため、Webサービスへのアクセスに問題があります。

接続が閉じたときに接続を再接続するには、この SOスレッド に基づいてこの小さなスクリプトをハッキングしました。

while true; do { \
    while true; do \
      echo echo ping; sleep 10; \
    done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config  \
             -o ExitOnForwardFailure=yes  sleep 10; echo "$(date) I died"; 
    sleep 1;
done

残念ながら、この「修正」は多少不安定で、接続が頻繁に切断されるため、ブラウザは5回のリクエストごとにハングします。それは機能しますが、完璧にはほど遠いので、私はより良いアプローチを求めています。おそらく、ロングポーリングなどを行うスクリプトの種類があるのではないでしょうか。この問題を解決した人はいますか?

5
oligofren

実際に私の状況に決定的な修正を提供したものはないため、ここに自分の答えを追加します。しかし、それは基本的に@sivannの答えを私の特定の状況に合わせて修正したものです。それであなたに役立つなら、彼に賛成票を与えてください!

完全なコマンドライン

# This forwards all requests to my local 39000 port to port 8080 on the server
LOCAL_PORT=39000
REMOTE_PORT=8080
SERVER=myapp.cloudapp.net
autossh -M20000 -N -L $LOCAL_PORT:$SERVER:$REMOTE_PORT myuser@$SERVER

これは、上記でまとめたハッキースクリプトと比較して、これまでのところ安定していることが証明されています。

設定ファイルを使用する

サーバーごとにファイルに構成を保持する場合は、次のようになります。

$ HOME/.ssh/config_myapp.cloudapp.net

Host myapp.cloudapp.net
User myuser
LocalForward 127.0.0.1:39000 localhost:8080
ServerAliveInterval 5

設定ファイルを使用したコマンドライン

autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2

5
oligofren

autossh を使用します。これはパッケージとして存在し、スクリプトを記述せずにこれらすべてを処理します。また、ssh構成ファイルで、Keepalive、ClientAliveInterval、およびServerAliveIntervalを構成します。オプションはsshに似ていますが、ドロップされた接続を自動的に処理します。

例えば。リバーストンネルを開始する(そして実行したままにする):

server_behind_fw # autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

その後:

your_public_seerver # ssh -p 1234 localhost

sshでserver_behind_fwに移動します。

12
sivann

スリープとpingを使用する代わりに、sshにキープアライブパケットを送信するように指示します。探しているオプションはServerAliveIntervalです。これは、sshに数秒ごとにデータを送信するように指示し、サーバー(および途中のNATファイアウォール)が接続がまだ開いていることを認識し、セッションがタイムアウトしないようにします。これは、他の理由で接続が失敗した場合に自動的に再接続するスクリプトと組み合わせる必要があります。

ここに設定の例があります: http://embraceubuntu.com/2006/02/03/keeping-ssh-sessions-alive/

3
Grant

ssh-Nコマンドラインフラグを使用すると、コマンドを実行する必要なく接続を実行し続けることができ、sleepコマンドは必要ありません。

さらに、 この答え で説明されているように、ClientAliveIntervalServerAliveIntervalを設定する必要があります。

3
kasperd