web-dev-qa-db-ja.com

autosshはリンクダウン時にsshを強制終了しません

Autosshを30秒のポーリング時間で開始しました。

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

そしてそれはうまくいきます:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

しかし、ネットワークケーブルを物理的に取り外した場合、つまりトンネルが機能しなくなった場合、autosshはsshデーモンを強制終了しません。どうして?リンクがダウンしている場合、autosshは何もできないことを理解していますが、私の意見では、次のことを実行する必要があります。

  1. 子sshプロセス(check on child ...
  2. 遠端を確認してください!!! (トンネルを通るpingのような操作)
  3. トンネルがダウンしていることを認識する
  4. Sshプロセスを停止します
  5. もう一度トンネルを作成してみてください
  6. それが機能しないことを認識し、(指数関数的に増加する?)タイマーを設定してすぐにもう一度チェックする

それが私がautosshを実行している理由です。トンネルに何かが起こった場合(ソフトウェアまたはハードウェアの問題である場合)は、トンネルを再起動する必要があります。代わりに、sshプロセスが終了するのを待っています。接続を再確立する見込みがない場合でも、再起動しようとしているのではないですか?

Autosshはどのようなチェックを行っていますか? sshが稼働していることを確認してください。遠端のチェックを行っていませんか?

編集する

要求に応じて、ssh構成の関連部分を追加します。

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can Tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes
10
dangonfast

しかし、ネットワークケーブルを物理的に取り外した場合、つまりトンネルが機能しなくなった場合、autosshはsshデーモンを強制終了しません。どうして?

autosshはクライアントマシン上で実行されるため、サーバー上のsshデーモンプロセスを直接強制終了することはできません。ただし、サーバーの/etc/ssh/sshd_configClientAliveIntervalにゼロ以外の値を指定し(man sshd_configを参照)、サーバーのsshdサービスを再起動して構成の変更を適用できます。次に、ネットワークが切断された場合、sshデーモンプロセスはClientAliveInterval * ClientAliveCountMax秒後に強制終了されます(ただし、autosshによるものではありません)。

ここで、"autosshがsshクライアントプロセスを強制終了しないのはなぜですか?"と尋ねた場合、-M 0を指定しました。 autosshのmanページから:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit

Autosshを使用して接続を監視する代わりに、ServerAliveCountInterval * ServerAliveCountMax秒のタイムアウト後にsshが終了するのを待っています。 sshが終了する前に60のサーバーアライブチェックをリクエストしました。連続するチェックは60秒の間隔で区切られているため、sshクライアントが終了するまで1時間待機します。

また、クライアント側でExitOnForwardFailureオプションを使用することを検討することもできます(man ssh_configを参照)。これにより、トンネルを確立できない場合にsshが終了し、autosshがsshの再起動を試みることができます。

11
James W