実行中、ssh -R 2222:localhost:22 remotehost
SSHクライアントは、クライアントがポート22に転送したポート2222への既存のTCP接続の数remotehost
に関係なく、ポート2222でリッスンし続けます。remotehost
localhost
ポートを転送するようにSSHクライアントを設定する方法はありますか?最初の接続のみを受け取るそれからやめて転送されたポート(既存の転送されたTCP接続を中断せずに)? (ユーザーはSSHサーバーの構成を変更する権限がありませんremotehost
。)
私は次のような行動をとろうとしています。socat
tcp4-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
単一のネットワーク接続を介して複数のセッションを共有できます。に設定すると、
yes
ssh(1)は引数で指定された制御ソケットから接続を受け取りますControlPath
。他のセッションは、(デフォルトControlPath
)に設定されているのと同じ方法でこのソケットに接続できますControlMaster
。no
これらのセッションは、新しいネットワーク接続を開始するのではなく、マスターインスタンスのネットワーク接続を再利用しようとします。 [...]
-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
ます。auto
ControlPath
どういうわけか着信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
その用途を持つことができます。