цепочка туннелирования ssh

Вот сценарий

Я пытаюсь получить scp-доступ к серверу 3, но есть только публичный доступ по ssh к серверу 1. Чтобы подключиться по ssh к серверу 3, мне нужно подключиться по ssh к серверу 1, по ssh к серверу 2, затем по ssh к серверу 3.

Я надеюсь, что конечным результатом будет то, что я смогу использовать WinSCP для localhost: 8022, и это даст мне доступ к файлам на server3.

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

Я использую шпатлевку в Windows.

Любые предложения будут действительно полезны. Спасибо.


person Community    schedule 18.06.2009    source источник


Ответы (6)


В OpenSSH я использую эту настройку, когда мне нужны туннели. Это позволяет мне напрямую вводить sftp server3, не беспокоясь о ручном запуске туннелей server2 и server1.

# ~/.ssh/config

# to connect to server2, tunnel through server1
Host server2
ProxyCommand ssh server1 nc %h %p

# to connect to server3, tunnel through server2
Host server3
ProxyCommand ssh server2 nc %h %p

Чтобы быть более полным, я обычно использую ssh -oCiphers=arcfour128,arcfour256,arcfour,blowfish-cbc -oControlMaster=no -oForwardX11=no -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes server1 nc %h %p как ProxyCommand.

  • Туннелируемое ssh-соединение уже зашифровано, поэтому нет смысла использовать более тяжелые aes/3des для внешнего уровня; arcfour и blowfish быстрее.
  • Остальные настройки -o**** сделаны из паранойи, так что ничего не сломается, даже если к ssh_config добавить строфу Host server1 с действительно странными настройками.

Точно так же вы можете настроить PuTTY для использования прокси-команды plink -P %proxyport -pw %pass %user@%proxyhost nc %host %port и соответствующим образом установить имя хоста/порт/пользователя/пароль прокси-сервера на панели конфигурации Connection/Proxy. plink и остальная часть пакета PuTTY (pscp, psftp и т. д.) загружают все, что сохранено в графической конфигурации PuTTY; надеюсь, WinSCP тоже. (Я не использую его, поэтому я не слишком знаком с его функциями.)

person ephemient    schedule 13.07.2009
comment
Когда я пытаюсь это сделать, я получаю сообщение bash: nc: command not found -- я неправильно понял, как это работает? Мне нужно поместить команду и порты в места, где у вас есть nc %h %p? - person Zak; 28.11.2015

Первое решение, которое приходит на ум, — туннелировать по одному локальному порту на каждый из ваших серверов. Поскольку SSH использует порт 22, мы будем использовать каждое соединение SSH для туннелирования локального порта на порт 22 следующего сервера.

Когда вы открываете PuTTY, вас встречает диалоговое окно конфигурации PuTTY. Вам нужно будет отредактировать две категории: «Сеанс» и «Подключение → SSH → Туннели».

  1. Откройте копию PuTTY. Используйте эти настройки:

    • Подключиться к хосту

      • Host name: server1
      • Порт: 22
    • Туннельный порт

      • Local mode
      • Исходный порт: 15500
      • Назначение: server2:22 (порт защищенной оболочки)

        Окно конфигурации PuTTY перед нажатием кнопки Окно конфигурации PuTTY после нажатия кнопки

    Теперь каждый раз, когда вы подключаетесь к порту 15500 на вашем локальном компьютере, ваше соединение туннелируется к порту 22 на server2.

  2. Откройте копию PuTTY. Используйте эти настройки:

    • Connect to host
      • Host name: localhost
      • Порт: 15500
    • Tunnel a port
      • Local mode
      • Исходный порт: 15501
      • Назначение: server3:22 (порт защищенной оболочки)
  3. Откройте копию PuTTY. Используйте эти настройки:

    • Connect to host
      • Host name: localhost
      • Порт: 15501
    • Tunnel a port
      • Local mode
      • Исходный порт: 15502
      • Назначение: server3:22 (порт защищенной оболочки)
  4. Используйте WinSCP для подключения к localhost через порт 15502. Ваше соединение будет туннелировано, как если бы вы подключались к server3 напрямую.

Дайте мне знать в комментариях, работает ли это для вас. Удачи!

person Wesley    schedule 18.06.2009
comment
да, я могу подтвердить, что это работает. Я не связывал более двух SSH вместе, но, предположительно, если это работает для 2, это, вероятно, работает для 3 и выше. - person Jeff Atwood; 10.11.2012

Этот метод аналогичен тому, как вы можете использовать команду proxy в открытом файле конфигурации ssh.

Обязательным условием для этого метода является то, что Pageant должен использоваться с аутентификацией с открытым ключом всеми промежуточными (прокси) хостами, иначе вы получите мигающий курсор и ничего больше. Чтобы узнать больше о Pageant, PuTTYgen и открытых ключах, см.:
http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter8.html#pubkey
http://the.earth.li/~sgtatham/putty/0.62/htmldoc/Chapter9.html#pageant

У нас есть четыре машины, доступные в таком порядке
PuttyPC -> server01 -> server02 -> server03

Для server01 у нас есть сохраненный сеанс Putty как:
Главное окно: user1@server01 // порт 22 // SSH
Сохранить этот сеанс как server01

Для server02 у нас есть сохраненный сеанс Putty как:
Главное окно: user2@server02 // порт 22 // SSH
Окно конфигурации прокси: тип local // команда прокси plink -load server01 -nc %host:%port
Сохранить этот сеанс как server02

Для server03 у нас есть сохраненная сессия Putty как:
Главное окно: user3@pc3 // порт 22 // SSH
Панель конфигурации прокси: тип local // команда прокси plink -load server02 -nc %host:%port
Сохранить эту сессию как server03

Это означает, что сохраненный сеанс для server03 будет вызывать сохраненный сеанс для server02, а сохраненный сеанс server02 будет вызывать сеанс server01.

person Tim    schedule 09.02.2012
comment
очень красивое решение. Отлично интегрируется с windows, putty и winscp. Я бы проголосовал дважды, если бы мог. - person helt; 15.01.2016

здесь прекрасно описано решение Perl-скрипта. Также читайте комментарии к посту.

Узнайте больше об переадресации SSH-агента (упоминается в комментариях к записи Perl-скрипта). .

person nik    schedule 18.06.2009

Ответ заключался в обратном туннеле с server3

person Community    schedule 18.06.2009

Если вам нужно обойти только один сервер, мне было проще выполнить эту настройку напрямую через WinSCP.

сценарий: компьютер->сервер1->сервер2

1: настроить подключение к server2

2: Нажмите «Дополнительно» -> «Подключение» -> «Туннель».

3: включите туннель SSH и установите хост на server1

person Joakim Palmkvist    schedule 19.01.2017