- Вопрос или проблема
- Ответ или решение
- Как соединить SSH-команды через несколько перескоков
- Шаг 1: Определение структуры соединения
- Шаг 2: Настройка SSH конфигурации на промежуточном хосте
- Шаг 3: Настройка SSH конфигурации на исходной машине
- Пояснения к конфигурации:
- Шаг 4: Тестирование подключения
- Шаг 5: Использование VNC через SSH-туннель
- Возможные проблемы и рекомендации
- Заключение
Вопрос или проблема
Можно ли связать несколько подключений ssh вместе, при этом каждое подключение задано как ssh-хост?
Я знаю, что можно использовать флаг -W
или nc
, чтобы сделать второй переход к другому имени хоста или IP-адресу (см., например, ssh через несколько хостов). Я не смог заставить это работать так, как мне нужно, по нескольким причинам. Во-первых, для второго перехода я хочу использовать ключевой файл, хранящийся на промежуточном хосте, и я не вижу способа указать это с помощью -W
или nc
. Во-вторых, конечный адрес имеет переменный IP-адрес. Чтобы справиться с этим, у меня есть скрипт, работающий на конечном хосте, который записывает его IP-адрес в файл, хранящийся на промежуточном хосте, а затем скрипт (look_up_ip.sh
) на промежуточном хосте, который выводит этот IP-адрес. На промежуточном хосте у меня есть эта запись в ~/.ssh/config
:
Host destination
HostName destination
User dest_user
IdentityFile ~/.ssh/destination
PreferredAuthentications publickey
ProxyCommand nc $(look_up_ip.sh %h) %p
что позволяет мне подключаться к конечному хосту с промежуточного с помощью всего лишь ssh destination
.
Что я хотел бы сделать, так это добавить что-то в ~/.ssh/config
на первом компьютере, чтобы определить конечный хост (например, hopped_destination
), так чтобы ssh сначала подключался к промежуточному хосту, а затем выполнял ssh destination
оттуда, чтобы я мог просто выполнить ssh hopped_destination
с первого компьютера, и чтобы промежуточный ~/.ssh/config
обрабатывал файл идентификации и проверку IP-адреса для назначения. Часть причины, почему я это хочу, заключается в том, что я в конечном итоге хочу иметь возможность подключаться к назначению с помощью VNC, используя vncviewer -via destination localhost:0
, и я хочу, чтобы подключение не было доступно другим пользователям на промежуточном хосте (как подразумевается в частях принятого ответа на этот вопрос: https://superuser.com/questions/96489/an-ssh-tunnel-via-multiple-hops). Я надеялся, что будет возможно поместить ssh
в ProxyCommand
на первом компьютере с чем-то вроде:
Host destination
ProxyCommand ssh -t intermediate_user@intermediate_host ssh destination
но я не нашел опций, которые позволили бы этому работать.
Я также буду рад любым предложениям о лучших способах сделать это (есть ли способ избавиться от nc
в ProxyCommand
, который я сейчас использую?). Я, вероятно, мог бы разработать скрипт, чтобы сделать команду VNC более напрямую, но это может быть более сложным (непосредственная обработка переноса портов и уверенность в закрытии вещей при выходе, а также уверенность в том, чтобы не открывать порт для всех пользователей).
пример из моего ssh конфигурационного файла;
Host vmike2-squid-cache
User mike
ProxyCommand ssh -q -A -x ???.???.???.??? -W %h:22
(единственное, что я изменил, это IP)
Ответ или решение
Как соединить SSH-команды через несколько перескоков
Соединение через SSH с несколькими хостами, часто называемое "SSH через перескоки", представляет собой универсальную задачу для системных администраторов и специалистов в области IT. Рассмотрим процесс настройки такой конфигурации, используя пример с промежуточным хостом и динамическим IP-адресом конечного узла.
Шаг 1: Определение структуры соединения
Для начала необходимо понять вашу исходную задачу. Воспользуемся такой структурой:
- Машина — это ваша исходная рабочая станция.
- Промежуточный хост — это сервер, к которому вы сможете легко подключаться, и на котором размещён файл с текущим IP-адресом конечного узла.
- Конечный хост — это сервер, к которому вы хотите подключиться, но его IP-адрес меняется.
Шаг 2: Настройка SSH конфигурации на промежуточном хосте
Как указано в вашем вопросе, вы уже создали запись в ~/.ssh/config
на промежуточном хосте для подключения к конечному узлу:
Host destination
HostName destination
User dest_user
IdentityFile ~/.ssh/destination
PreferredAuthentications publickey
ProxyCommand nc $(look_up_ip.sh %h) %p
Это позволяет вам легко подключиться к конечному узлу с промежуточного хоста. Теперь следующим шагом будет настройка конфигурации на вашей исходной машине.
Шаг 3: Настройка SSH конфигурации на исходной машине
Чтобы инициировать подключение от вашей исходной машины через промежуточный хост к конечному, вам нужно будет добавить новый хост в ваш ~/.ssh/config
файл на исходной машине. Пример конфигурации выглядит следующим образом:
Host hopped_destination
HostName intermediate_host
User intermediate_user
IdentityFile ~/.ssh/intermediate_key
ProxyCommand ssh -W destination:22 %h
Пояснения к конфигурации:
- HostName указывает на имя или IP-адрес вашего промежуточного хоста.
- User — это имя пользователя для подключения к промежуточному дому.
- ProxyCommand указывает на использование SSH для соединения с конечным узлом, в данном случае мы используем параметр
-W
, который отправляет информацию через TCP подключение.
Шаг 4: Тестирование подключения
После завершения настройки конфигурации вы можете протестировать подключение, выполнив следующую команду на исходной машине:
ssh hopped_destination
Если настройки корректны, вы должны быть аутентифицированы на промежуточном хосте, а затем автоматически переключены на конечный узел.
Шаг 5: Использование VNC через SSH-туннель
Чтобы установить VNC-соединение через SSH с использованием указанного метода, вам потребуется немного изменить команду. Можно использовать следующую команду:
vncviewer -via intermediate_user@intermediate_host destination:0
Это подключение будет защищено, и доступ к серверу VNC будет ограничен только вашему сеансу.
Возможные проблемы и рекомендации
- Проблемы с авторизацией: Убедитесь, что ключи SSH правильно настроены и что у вас есть соответствующие разрешения на обоих хостах.
- Динамические IP-адреса: Вы уже практикуете использование скрипта
look_up_ip.sh
, чтобы получать текущий IP. Убедитесь, что этот скрипт работает корректно и возвращает ожидаемое значение. - Улучшение безопасности: Если есть возможность, рассмотрите использование
ssh-agent
для управления вашими ключами SSH более безопасно.
Заключение
Теперь вы имеете полное представление о том, как осуществить SSH-подключения через несколько перескоков со специализированной конфигурацией. Эта методология поможет вам обеспечить безопасность и было бы полезна при доступе к ресурсам в сложных сетевых конфигурациях. Если у вас возникнут дополнительные вопросы или потребности в уточнении, не стесняйтесь их задать.