104

SSH туннелирование меня очень смущает. Мне интересно, могу ли я сделать это в Linux.

У меня есть 3 машины ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Так что я могу SSH от A -> B и от B -> C, но не от A -> C.

Есть ли способ настроить SSH-туннель от A до B, поэтому, когда я запускаю другие SSH-команды, они просто работают с моей локальной машины A? Я в основном пытаюсь клонировать git-репозиторий с работы на дом (и я не могу установить git на компьютер B).

Кроме того, после настройки .. Как бы я тоже отключил это?

7 ответов7

122

Поместите это в ваш файл .ssh/config на hostA (подробнее см. Man 5 ssh_config ):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Теперь следующая команда автоматически туннелирует через hostB

hostA:~$ ssh hostC

Вы можете добавить такие параметры, как -oCiphers=arcfour и -oClearAllForwardings=yes чтобы ускорить процесс, поскольку перенос ssh в ssh требует больших вычислительных затрат, а дополнительные усилия и оболочка не обязательно должны быть такими же безопасными, когда они уже туннелируют. зашифрованный трафик.


Если вы используете OpenSSH ранее, чем 5.3, опция -W недоступна. В этом случае вы можете реализовать вышеизложенное с помощью netcat (nc):

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB
6

Изменить: это неправильный подход. Вместо этого смотрите ответ Эфимента . Этот ответ будет работать, но потенциально менее безопасен и определенно менее удивителен.

Похоже, вы хотите решение, подобное следующему:

ssh -L localhost:22:machinec:22 machineb

Это даст вам оболочку на machineb . Оставь это в покое. сверните окно терминала.

Теперь, когда вы устанавливаете ssh-соединение с localhost , вы фактически будете подключены к machinec через machineb . Когда вы закончите с туннелем, просто закройте терминал, в котором вы выполнили вышеуказанную команду.

Обратите внимание, что вам понадобятся привилегии суперпользователя для запуска команды.

3

Похоже, вы хотите, чтобы псевдоним оболочки на A вызывал ssh на C

  1. Я предполагаю, что на A, вы можете набрать ssh me @ b "ssh me @ c hostname" и вернуть "C"
  2. Сделайте псевдоним sshc, который расширяет sshc foo в ssh me @ b "ssh me @ c foo"
  3. Для точного синтаксиса создания псевдонима, обратитесь к superuser.com
0

Ясс Еще одно простое решение

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • Первая команда открывает ssh-соединение с HostB и сообщает HostB о переадресации соединений с localhost: 2222 на HostC: 22.
  • параметр -f указывает SSH переходить в фоновый режим после установления соединения
  • Вторая команда просто открывает клиентское соединение с localhost: 2222
  • Опция HostKeyAlias не требуется, но может помочь предотвратить подключение к неправильному хосту
  • Примечание: команда sleep 10 необходима для поддержания соединения до тех пор, пока вторая команда ssh не использует перенаправленный порт. Тогда первый ssh закроется, когда второй ssh покинет перенаправленный порт.

Теперь вы можете запустить последующие сеансы SSH:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Вариант:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

последующие сеансы ssh можно открыть, запустив:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

Основное преимущество использования параметров -M и -S состоит в том, что между HostA и HostC открыто только одно соединение, последующий сеанс не будет проходить проверку подлинности и будет выполняться намного быстрее.

0

Если ваш работодатель предоставляет VPN, я бы рекомендовал использовать его вместо этого.

Таким образом, вам не придется специально настраивать какие-либо приложения (даже ssh), и вы сможете увидеть любую машину за брандмауэром. Кроме того, весь ваш трафик будет зашифрован программным обеспечением VPN, что повысит безопасность любого непреднамеренно или намеренно незашифрованного трафика.

0

Особый случай, смешанные платформы NIX:

  hostA (linux) -> HostB (solaris) -> HostC (linux)

Если вам нужно приложение X на hostC, а промежуточный переход - на коробке Solaris ... в этом случае я нашел netcat (nc), необходимый для ProxyCommand, примерно так:

hostA:~ $ vi .ssh/config:

Host hostC
    ProxyCommand ssh hostB nc %h %p       # where nc is netcat

Затем работает автоматическое туннелирование:

hostA:~ $ ssh hostC

0

Для интерактивной оболочки вы можете использовать эту простую команду:

ssh -J <user>@<hostB> <user>@<hostC>

Опции -J для прыжка.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .