Переадресация трафика 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
- Я предполагаю, что на A, вы можете набрать ssh me @ b "ssh me @ c hostname" и получить обратно "C"
- Сделайте псевдоним sshc, который расширяет sshc foo в ssh me @ b "ssh me @ c foo"
- Для точного синтаксиса создания псевдонима, обратитесь к 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 открыто только одно соединение, последующий сеанс не будет проходить проверку подлинности снова и будет выполняться намного быстрее.