ポートを一度だけ転送してから(自動的に)リスニングを停止するSSHクライアントを実行するには?

ポートを一度だけ転送してから(自動的に)リスニングを停止するSSHクライアントを実行するには?

実行中、ssh -R 2222:localhost:22 remotehostSSHクライアントは、クライアントがポート22に転送したポート2222への既存のTCP接続の数remotehostに関係なく、ポート2222でリッスンし続けます。remotehostlocalhost

ポートを転送するようにSSHクライアントを設定する方法はありますか?最初の接続のみを受け取るそれからやめて転送されたポート(既存の転送されたTCP接続を中断せずに)? (ユーザーはSSHサーバーの構成を変更する権限がありませんremotehost。)

私は次のような行動をとろうとしています。socattcp4-listen(オプションがない場合、2番目の接続は許可されません。)forkただし、セキュアSSHチャネルを介して行われます。

編集/付録:私の問題は、仮想の「ssh機能要求」として説明することができます。 SSHにssh_configクライアントオプションがあると仮定ForwardLimit num,minsこの場合、num過去数分間の接続数に達すると、sshは一時的に受信を停止し、mins接続数が0の場合は永久に受信を停止します。mins(これはファイアウォールの速度制御に似ていますが、ユーザースペースで実行されているSSHクライアントによって強制されます。)その後、オプションを追加することで問題を解決できますForwardLimit 1,0。しかし、そのような機能が存在しないので、最善の解決策を探しています。

ベストアンサー1

OpenSSHを使用してそれを閉じずに開いたリモート転送をオフにする方法は次のとおりです。SSH接続を開始します。これをOPの正確なユースケースに簡単に統合できるはずです。

これを行うには、次のものを使用する必要があります。ControlMasterオプション、その仲間ControlPath(十分な追加のカスタマイズを使用する必要があります。トークン、ここでは簡単にしてください)-Oパラメータssh

ControlMaster

単一のネットワーク接続を介して複数のセッションを共有できます。に設定すると、yesssh(1)は引数で指定された制御ソケットから接続を受け取りますControlPath。他のセッションは、(デフォルトControlPath)に設定されているのと同じ方法でこのソケットに接続できますControlMasternoこれらのセッションは、新しいネットワーク接続を開始するのではなく、マスターインスタンスのネットワーク接続を再利用しようとします。 [...]

-O ctl_cmd

基本プロセスでアクティブな接続の再利用を制御します。 -O オプションを指定すると、ctl_cmd 引数が解釈され、基本プロセスに渡されます。有効なコマンドは次のとおりです。「check」(基本プロセスが実行中であることを確認)、「forward」(コマンドを実行せずに転送要求)、「キャンセル」(転送キャンセル)、「exit」(マスターステーションへの終了を要求)、および「stop」(マスターステーションへの追加の再使用要求の受け入れを停止するように要求).

最初のsshコマンドはオプションControlMaster=yes(またはauto)を使用する必要があります。

ssh -o ControlMaster=yes -o ControlPath=/tmp/mysshcontrolpath -R 2222:localhost:22 remotehost

もっとSSHホストと対話するコマンドSSH接続は、使用したものとまったく同じように使用する必要がありControlMaster=noます。autoControlPath

どういうわけか着信SSH接続を待ち(統合が必要な部分です)、次のコマンドを実行します。同じユーザーが再接続している場合は現在ローカルシステムで実行されているため、着信接続を介して次のコマンドを実行することもできます(秘密は必要ありませんが、ControlPathソケットにアクセスするには同じユーザーを使用する必要があります)。

ssh -o ControlMaster=no -o ControlPath=/tmp/mysshcontrolpath -O cancel -R 2222:localhost:22 remotehost

小さい(非対話型認証を使用している場合)競合ウィンドウに加えて、着信接続がすぐに実行されると、最初の接続の進行中に2番目の接続が成功することができます。SSH接続が成功すると、追加の接続を防ぐためにリスニングソケットが閉じます。

このコマンドは接続を試みませんremotehost(使用されている場合、構文は-Oまだリモートホスト引数を必要としますが無視されます)。マスターサーバーにのみ接続します(ローカルUNIXソケットを介して)。SSHそれでも実行中で、指定されたリモート転送()を終了するように要求します-O cancel -R 2222:localhost:22

:)を使用して閉じた後、他のコンテンツや同じコンテンツを追加するためにも使用できます-O forward -R 2222:localhost:22。実際に-O ...ホストでない場合に転送を変更する唯一の方法は、SSHコマンド(およびControlPathそのマスターSSHによって生成されたコマンドを使用):この方法で使用される他のSSHコマンドはそのコマンドを持つことができません。私自身メインサーバーを再利用しているので、今後SSHつながる。

ControlPersistユースケースに応じて役立つ可能性がある項目(初期(デフォルト)またはその他)も参照してください。SSH完了すると、開いているか開いていません。有効にすると、ある種の-Nオンデマンド配信メカニズムを持つオプションで使用できます。また、-O exitその用途を持つことができます。

おすすめ記事