netcat / proxy de canalización con nombre sobre ssh

netcat / proxy de canalización con nombre sobre ssh

Estoy acostumbrado a reenviar un puerto de servicio remoto en localhost usando ssh como:

ssh -L 2181:localhost:2182 user@server (reenviar el puerto de host remoto 2182 al puerto local 2181)

ahora, desde la máquina a la que hago ssh, estoy intentando llegar a un servicio tcp y reenviar la respuesta a mi máquina local:

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

Nota: No tengo acceso directo a la máquina de servicio, solo tengo acceso a la red a través de la máquina a la que estoy conectado mediante SSH.

Estaba intentando usar netcat con una canalización con nombre:

En la máquina remota:

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

En la máquina local: echo message | nc localhost 2181

pero eso no parece funcionar.

También lo intenté, en una máquina remota. nc -k -l 2182 0<fifo | nc service 2181 1>fifo

sin suerte

En la máquina remota nc -k -l 2182aparece el mensaje que envío desde la máquina local: 2181

si simplemente canalizo esto como: nc -k -l 2182 | nc service 2181 Veo la respuesta del servicio en la máquina remota. Entonces puedo ir hasta el servicio y regresar a la máquina remota, pero se detiene allí:

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

así que no entiendo por qué la canalización con nombre no reenvía la respuesta a través de la conexión ssh a mi máquina local.

echo message | nc localhost 2182en la máquina remota NO genera nada en la máquina local, por lo que no pasa a través de SSH por alguna razón.

¿Alguna idea de por qué ocurre esto y cómo solucionarlo?

Gracias por la ayuda.

(EDITADO para mayor claridad) Nota: Necesito esto porque solo puedo usar SSH en una máquina, que es parte de un clúster, y esa máquina tiene acceso a los servicios. No quiero exponer el servicio al exterior, ni tener SSHD en cada contenedor de servicio.

Respuesta1

Me señalaron el hecho de que uno puede simplemente hacer

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

para reenviar la conexión servicedesde remote-machineal puerto en local-machine.

simple y eficiente.

Respuesta2

Puedes usar -R para este propósito:

ssh -R 8080:127.0.0.1:7070 yourhost

Esto abrirá un puerto en yourhost:7070 que reenvía a localhost:8080

La documentación dice

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

información relacionada