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내가 local-machine: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를 사용할 수 있고 해당 시스템이 서비스에 액세스할 수 있기 때문에 이것이 필요합니다. 나는 서비스를 외부에 노출하고 싶지 않으며 모든 서비스 컨테이너마다 SSHD를 갖고 싶지 않습니다.

답변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

그러면 localhost:8080으로 전달되는 yourhost:7070의 포트가 열립니다.

문서에 따르면

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

관련 정보