Я привык перенаправлять удаленный сервисный порт на localhost, используя ssh, например:
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 только к одной машине, которая является частью кластера, и эта машина имеет доступ к сервису (ам). Я не хочу открывать доступ к службе извне и не хочу иметь SSHD по одному на каждый контейнер службы.
Мне указали на то, что можно просто сделать
ssh -L 2181:service:2181 user@remote-machine
перенаправить соединение на service
из remote-machine
в порт на local-machine
.
просто и эффективно.
Для этого можно использовать -R:
ssh -R 8080:127.0.0.1:7070 yourhost
Это откроет порт на yourhost: 7070, который перенаправляет на localhost: 8080
В документации говорится
[-R [bind_address:]port:host:hostport]