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回のリクエストごとにハングします。それは機能しますが、完璧にはほど遠いので、私はより良いアプローチを求めています。おそらく、ロングポーリングなどを行うスクリプトの種類があるのではないでしょうか。この問題を解決した人はいますか?
実際に私の状況に決定的な修正を提供したものはないため、ここに自分の答えを追加します。しかし、それは基本的に@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
これは、上記でまとめたハッキースクリプトと比較して、これまでのところ安定していることが証明されています。
サーバーごとにファイルに構成を保持する場合は、次のようになります。
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
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に移動します。
スリープとpingを使用する代わりに、sshにキープアライブパケットを送信するように指示します。探しているオプションはServerAliveIntervalです。これは、sshに数秒ごとにデータを送信するように指示し、サーバー(および途中のNATファイアウォール)が接続がまだ開いていることを認識し、セッションがタイムアウトしないようにします。これは、他の理由で接続が失敗した場合に自動的に再接続するスクリプトと組み合わせる必要があります。
ここに設定の例があります: http://embraceubuntu.com/2006/02/03/keeping-ssh-sessions-alive/
ssh
に-N
コマンドラインフラグを使用すると、コマンドを実行する必要なく接続を実行し続けることができ、sleepコマンドは必要ありません。
さらに、 この答え で説明されているように、ClientAliveInterval
とServerAliveInterval
を設定する必要があります。