netcat / SSH 経由の名前付きパイプ プロキシ

netcat / SSH 経由の名前付きパイプ プロキシ

私は次のように ssh を使用して localhost 上のリモート サービス ポートを転送することに慣れています。

ssh -L 2181:localhost:2182 user@server (リモートホストのポート 2182 をローカルポート 2181 に転送)

今、SSH 接続先のマシンから TCP サービスにアクセスし、応答をローカル マシンに転送しようとしています。

local-machine:2181 <-- SSH --> remote-machine:2182 <-- netcat/named pipe --> service:2181

注: サービス マシンに直接アクセスすることはできません。SSH で接続したマシン経由でのみネットワークにアクセスできます。

名前付きパイプで netcat を使用しようとしていました:

リモートマシン上:

mkfifo fifo
nc -k -l 2182 <fifo | nc service 2181 >fifo

ローカルマシンの場合: echo message | nc localhost 2181

しかし、それはうまくいかないようです。

私もリモートマシンで試してみました nc -k -l 2182 0<fifo | nc service 2181 1>fifo

運がなかった

リモートマシンでは、nc -k -l 2182ローカルマシンから送信したメッセージが出力されます:2181

これを単純に次のようにパイプすると、nc -k -l 2182 | nc service 2181 リモート マシン上のサービスからの応答が表示されます。つまり、サービスまで行ってリモート マシンに戻ることはできますが、そこで停止します。

local-machine:2181 <-/- SSH --> remote-machine:2182 <-- netcat --> service:2181

そのため、名前付きパイプが SSH 接続を介して応答をローカル マシンに転送しない理由がわかりません。

echo message | nc localhost 2182リモート マシンではローカル マシンに何も出力されないため、何らかの理由で SSH を通過できません。

なぜそうなるのか、またどうすれば修正できるのか、何かご存知ですか?

手伝ってくれてありがとう。

(わかりやすくするために編集済み) 注: SSH できるマシンはクラスターの一部である 1 台のみであり、そのマシンはサービスにアクセスできるために、これが必要です。サービスを外部に公開したり、サービス コンテナーごとに SSHD を 1 つずつ用意したりすることは望ましくありません。

答え1

私は、単に

ssh -L 2181:service:2181 user@remote-machine

serviceからへの接続を のremote-machineポートに転送しますlocal-machine

シンプルで効率的です。

答え2

この目的には -R を使用できます:

ssh -R 8080:127.0.0.1:7070 yourhost

これにより、yourhost:7070のポートが開き、localhost:8080に転送されます。

ドキュメントにはこう書かれている

[-R [bind_address:]port:host:hostport]

関連情報