私は次のように 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]