web-dev-qa-db-ja.com

ssh -Rでポート「0」が許可されているのに、ssh -Lでポート番号が必要なのはなぜですか?

ssh -Rで「0」を指定することで空きポートを割り当てることができるのに、ssh -Lで有効な空きポートを指定する必要があるのはなぜですか?

Sshがローカルの空きポートを使用してリモートトラフィックをFWDすることなく 空きポートのハッキングに応じて

から マニュアルページ

-R [bind_address:] port:Host:hostport

ポート引数が「0」の場合、リッスンポートはサーバーに動的に割り当てられ、実行時にクライアントに報告されます。

しかし、-Lはその可能性を提供しません:(

-L [bind_address:] port:Host:hostport

ローカル(クライアント)ホストの指定されたポートを、リモート側の指定されたホストとポートに転送することを指定します。

4
Leo Gallucci

OpenSSHはこれを実装することを決定していないためです。多分それは機能要求の時間です。ポート番号を他のプログラムからアクセスできるようにする方法がよくわかりませんが...ファイルに書き込む可能性がありますか?

ただし、これはコーディングを行うのに十分簡単なはずです。

擬似コード:

  1. 乱数を選択[1000-65535]:export LOCAL=$(( $RANDOM + 1000 ))(十分)
  2. ssh some.Host -L $LOCAL:dest.Host:1234に接続してみてください
  3. 失敗した場合は、繰り返します。
  4. $LOCALを使用して、使用されたランダムポートを取得します。

残念ながら、これをbashでうまく実装するのは難しいか、ここでより完全な例を示します。

1

SSHは、Lで指定されたポートにバインドし、接続を開始する任意のクライアントをリッスンします(また、すでに確立されている接続上のパケットをリッスンし、リモートサーバーに転送しますが、この質問のコンテキストには関係ありません)。

接続を開始するには、クライアントはサーバーがそのような要求をリッスンしているポート番号を指定する必要があります。そのようなポートが任意に選択された場合、クライアントはそれを認識しないため、接続を開始できません。

-Rの場合、リモートサーバーはローカルサーバー(-R引数からポート番号を知っている)からの接続以外のポートでの接続を受け入れないため、これは問題ではありません。

最初の接続が確立された後、動的に割り当てられた追加のポートを、クライアントとサーバーの両方が実際のトラフィックについてネゴシエートできます(したがって既知です)。

1
Dan Cornilescu