Исправьте настройки файла конфигурации ssh для туннелирования на 3-й компьютер

19

Я пытаюсь туннелировать к серверу через сервер-мост. До сих пор я смог заставить его работать из командной оболочки, используя следующую команду:

ssh -A -t bridge_userid@bridgemachine.com ssh -A remote_userid@remoteserver.com

Но я пытался обернуть это в свой ~/.ssh/configфайл, и у меня проблемы. Я пробовал:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -A -t bridge_userid@bridge_userid.com ssh -A remote_userid@%h

Но когда я это делаю, я получаю следующее сообщение об ошибке, remoteserver.comи я не уверен, что его вызывает:

ksh: SSH-2.0-OpenSSH_6.8 ^ M: не найдено

Я знаю, что когда я remoteserver.comвхожу, моя оболочка есть /usr/bin/ksh.

Я пытался добавить аргументы пути к командам ssh в файле конфигурации, но это не имело никакого значения.

Есть идеи, что это может быть?

Эрик Б.
источник
Это просто не так, как ProxyCommandпредполагается использовать. Обычно он используется с netcat, где ssh передает через него свой вывод, а netcat действует как туннель к SSH-порту удаленного сервера . Вам нужно что-то вроде ProxyCommand, ssh -W %h:%p bridge_userid@bridgemachine.comесли вы хотите использовать эту функцию.
DanSut
К сожалению, на моем мостовом сервере нет установленного netcat, поэтому я пытаюсь заставить это работать другим способом. Я подумал, что если это может работать из командной строки, должен быть способ поместить информацию в файл конфигурации.
Эрик Б.
При использовании вашей командной строки, которое вы даете ssh -A remote_userid@remoteserver.comв качестве команды для запуска на компьютере моста, config не дает вам способа предоставлять команды по умолчанию. То, что вы пытаетесь сделать worksсамо по себе, но затем ssh пытается использовать ваш ProxyCommandкак туннель и начинает запускать протокол SSH по нему, где на другом конце находится оболочка, а не sshd, прослушивающий протокол SSH.
DanSut
@dansut работал отлично. Спасибо!
Эрик Б.

Ответы:

24

Jakuje ответ правильный, но, поскольку OpenSSH 7.3, теперь вы можете использовать, -J ProxyJumpчто проще. Смотрите мои заметки:

OpenSSH 7.3или выше

Использование ProxyJump. Как объяснено в руководстве:

-J [пользователь @] хост [: порт]
Подключитесь к целевому хосту, сначала установив ssh-соединение с хостом перехода, а затем установив пересылку TCP в конечный пункт назначения оттуда. Можно указать несколько прыжков, разделенных запятыми. Это ярлык для указания директивы конфигурации ProxyJump.

ProxyJump ~/.ssh/configпример

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2_behind_server1
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyJump server1

Соединить с

ssh server2_behind_server1 -v

Добавить -vдля подробного вывода

Пример -Jкомандной строки ProxyJump

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa

Соединить с

ssh server2 -J server1 -v

Или использовать -o

ssh server2 -o 'ProxyJump server1' -v

OpenSSH 5.4или выше

Использовать ProxyCommandс-W

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 -W %h:%p

Соединить с

ssh server2 -v

Или использовать -o

ssh server2 -o 'ProxyCommand ssh server1 -W %h:%p' -v

OpenSSH ниже 5.4

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 nc %h %p 2> /dev/null

Соединить с:

ssh server2 -v

Или использовать -o

ssh server2 -o 'ProxyCommand ssh server1 nc %h %p 2> /dev/null' -v

источники

-Jдобавлено в OpenSSH 7.3

  • ssh (1): добавьте параметр ProxyJump и соответствующий флаг командной строки -J, чтобы упростить косвенное обращение к одному или нескольким бастионам SSH или «прыжкам на хостах».

-Wдобавлено в OpenSSH 5.4

  • В ssh (1) добавлен «режим netcat»: «ssh -W host: port ...» Это подключает stdio на клиенте к одному порту на сервере. Это позволяет, например, использовать ssh в качестве ProxyCommand для маршрутизации соединений через промежуточные серверы. BZ # 1618
GabLeRoux
источник
3

Вам не нужно netcatна вашем мосту. Как DanSut предложил в комментариях, вы можете ssh -Wвместо этого использовать параметр командной строки, эта конфигурация должна работать для вас:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -AW %h:%p bridge_userid@bridge_userid.com
Jakuje
источник
Это сработало. Благодарю. Не уверен почему, но уверен, что я попробовал это однажды уже в неудаче, но я попытался снова с успехом. Благодарю.
Эрик Б.