Я привык перенаправлять порт удаленной службы на 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 по одному на каждый контейнер сервиса.
решение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]