web-dev-qa-db-ja.com

壊れたSSHトンネルの再確立を妨げる可能性のあるTIME_WAIT問題の回避策?

クロスポストするつもりはありませんが、この質問をSecurityFocusのOpenSSHリストに送信した後、リストのトラフィックがかなり少ないことに気付きました(前の投稿は約5か月前でした)。そうは言っても、この問題はおそらくより多くの目玉を獲得するので、ここに再投稿することにしました(そして、答えられれば他の人に役立つ可能性が高くなります):

問題:内部マシンからホストへの逆SSHトンネルがDMZにあり、システムの起動時に起動し、トンネルに障害が発生した場合に再起動するように設定されています。ただし、トンネルが中断された場合(たとえば、ネットワークの停止のため)、DMZホストが使用されているため、再確立できません。OpenSSHメーリングリストアーカイブなどを読んだところ、これは次のように見えます。ポートがTIME_WAIT状態にあるためです。これは問題ありません。トンネルを設定するスクリプトにsleepステートメントを挿入できます。ただし、これには2つの質問があります。

4
mjbraun

TCPKeepAlive、ServerAliveInterval、ServerAliveCountMaxなどのさまざまなSSH設定を試して、接続がダウンした場合にすべてを強制終了する場所を設定できると思います。私は同様の設定をしており、SSHDとSSHの両方に多くの変更を加えて、必要なものに一致させています。次に、必要に応じてトンネルを再起動する5分ごとに実行されるcronジョブがあります。

#!/bin/bash
if ps aux | grep "ssh -fnNTx" | grep -v "grep"
then
echo "Already Running"
else
echo "Starting now"
ssh -fnNTx -L 1514:127.0.0.1:514 [email protected]
fi

これまでのところ、このソリューションは私にとってはうまく機能しています。ある種のNagiosチェックまたは別のスクリプトを設定して、トンネルが開いているかどうかを確認し、開いていない場合は、そのpidを強制終了して再起動できるようにすることもできます。

編集:

TIME_WAITの問題について多くのことを話している前の記事。 TIME_WAITでソケットを強制的に閉じる方法は?

3
Eric

SSHDはSO_REUSEADDRを設定して、前のインスタンスがまだTIME_WAIT状態の接続を持っている場合でも、新しいインスタンスがバインドできるようにする必要があります。バグのあるSSHDがあるか、この動作を禁止する構成設定があります(たとえば、 X11UseLocalHostを無効にした場合 )。

1
David Schwartz