Переадресация трафика SSH через средний компьютер

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 ответов

Поместите это в свой .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

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

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

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

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

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

ssh -L localhost:22:machinec:22 machineb

Это поможет вам machineb, Оставь это в покое. сверните окно терминала.

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

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

В качестве альтернативы, поскольку OpenSSH 7.3 вводит ProxyJump директива:

Host final
  ProxyJump intermediate

Например:

Host intermediate
  Hostname 10.0.0.42
  User root
Host final
  Hostname final.destination.com
  User foo
  ProxyJump intermediate

потом ssh final перепрыгнет через промежуточную машину.

Похоже, вам нужен псевдоним оболочки на 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. Для точного синтаксиса создания псевдонима, обратитесь к usersuper.ru

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

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

Особый случай, смешанные платформы 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 #, где nc - это netcat

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

hostA: ~ $ ssh hostC

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

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 открыто только одно соединение, последующий сеанс не будет проходить проверку подлинности снова и будет выполняться намного быстрее.

Другие вопросы по тегам