次のように実行すると:
ssh -4 -f -N -T -R "/home/dude/lol.socket:192.168.4.44:4444" dude@someserver -p 22 -i privatekey -o "ExitOnForwardFailure yes" -o ConnectTimeout=5 -o ConnectionAttempts=3 -o ServerAliveInterval=15 -o
次に、何らかの理由で接続がクローズまたは中断されたと仮定します。チェックやエラーが原因でコンピュータが再起動したり、インターネット接続の問題やその他の問題があるとしましょう。 ->大きな問題が発生しました。生成されたソケットファイルはsshdから削除されません。したがって、リバーストンネル/home/dude/lol.socket
イニシエータがsomeserver
トンネルを回復して再生成しようとすると、次の理由でこれを行うことはできません。
Error: remote port forwarding failed for listen path /home/dude/lol.socket
サーバー側では、次のような結果が得られます。
error: bind: Address already in use
error: unix_listener: cannot bind to path: /home/dude/lol.socket
接続を切断した後にソケットを整理するためにどのようにサポートされているか/最高のハッキングは何ですか?これはsshdのバグですか?接続が切断された場合は、自動的にこれを行うべきではありませんか?
背景ストーリー:
ソケットの使用に関するアイデアは簡単です。サーバーはn "guys"を処理し、すべてのポートでm "lol"サービスのリバーストンネルを作成し、ソケットを使用すると、 "guys"が次のアクセスとバインドを確実にすることが容易になります。他人のソケットではなく、自分のソケットです。また、どの人がどのポートを使用してどのサービスを公開しているかを追跡する必要はありません。他のサーバーのサービスに接続しようとしている人が知っておくべきことは、サービスの名前とそれを任意のローカルポート(または必要に応じてソケット)にバインドすることです。
ssh -v -i -4 -N -T -L "127.0.0.1:3334:/home/dude/lol.sock" -p 22 友達@someserver -o "ExitOnForwardFailure はい" -o ConnectTimeout=5 -o ConnectionAttempts= 3 -o ServerAliveInterval=15 -o ServerAliveCountMax=3
リバーストンネルが実行されるサーバーのいくつかの魔法のポート番号を知る必要はありません。したがって、この問題を解決する方法についてより良いアイデアがある場合は、いつでもお知らせください。
openssh-client/serverバージョンを使用してクライアント/サーバーをすべてテストしますDebian 9
(クライアントは実際にDockerコンテナ内のMacにあります)。7.4p1-10+deb9u2
答え1
TL;博士;
解決策は値を設定することです。ストリームローカルバインディングの切断到着はいサーバーのsshd構成で:sudo sh -c 'echo "StreamLocalBindUnlink yes" >> /etc/ssh/sshd_config'
。
とても長い話
これが発生するのは、ソケットが閉じられてもUnixソケットファイルが自動的に削除されないためです。ファイルパスで/を呼び出して閉じる必要がある場合は、remove
shutdown時に手動でクリーンアップする必要がありますunlink
が、opensshはこれを行いません。しかし、トピックについてさらに詳しく調べたところ、Unixソケットの「ベストプラクティス」がunlink
正しいことに気づきました。今後それにバインディング(詳細については、このSOの回答をご覧ください。)。これがまさにStreamLocalBindUnlink yes
sshdに指示することです。
マニュアルページには次のように記載されています。
StreamLocalBindUnlink
Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new
one. If the socket file already exists and StreamLocalBindUnlink is not enabled, sshd will be unable to forward the port to
the Unix-domain socket file. This option is only used for port forwarding to a Unix-domain socket file.
The argument must be yes or no. The default is no.
このアプローチの欠点は、以前の接続がまだ存在していても、ソケットへの再バインドが許可されることです。これにより、既存のトンネルはそのまま残り、その接続を介した既存のTCP接続はそのままになりますが、すべての新しい接続は新しいトンネルに移動します。さらに、古いトンネルはファイルシステムソケットアドレスから永続的で元に戻せないように分離されているように見え、新しいトンネルが閉じても新しい接続を受信できなくなります。