Перейти к основному содержимому

Я не могу зайти по ssh на виртуалку в Yandex.Cloud

· 5 мин. чтения

Давайте сначала разберемся на сколько все плохо.

Инструкция как подключиться по SSH

Я мог бы перепечатать официальную доку, но лучше просто дам на нее ссылку. Если коротко, то подключиться так:

ssh -i <путь_к_ключу/имя_файла_ключа> <имя_пользователя>@<публичный_IP-адрес_виртуальной_машины>

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

ssh -i ~/.ssh/id_rsa yc-user@84.201.168.175

Не указывайте при создании ВМ имя пользователя root. С ним вы не сможете подключиться. Для выполнения операций, требующих прав суперпользователя, используйте команду sudo.

Также стоит убедиться, что создавая ВМ вы передали публичный ключ одной строкой, без переносов. Если ключ использует алгоритмы RSA, то он должен выглядеть примерно так. (Ключ сгенерирован для примера)

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDimGse012STgMHS61hBSMozSr1dItivxE/eEXki25QnUfAQM/rN6NPC3s6KrEx5Iu7dDMf1vuC2u3y17NacM/CWqu7tvfmgXSVIYltNVCd+TjWS0+0sxTybrwi7GjfGj0GOf2T7nFZoMMwz9WKwireNnLSAkxzMA7SgveHpWahZQ== user@local

Поменялся IP-адрес

Как это проверить? В консоли откройте просмотр своей ВМ и внизу страницы найдите публичный IPv4 адрес. Если это не тот адрес, который вы указываете в параметрах подключения ssh, то логично почему подключение не работает — вы подключаетесь не к своей ВМ.

Так как IP-адреса в Yandex.Cloud переиспользуются, то после того как он был освобожден вашей ВМ, адрес может быть выделен какой-то другой виртуалке, которая создается в данный момент.

Почему это происходит? Если IP-адрес машины был динамическим, то он не сохранится после остановки. Чтобы он сохранялся, нужно его сделать статическим. Например, в попапе, появляющемся при остановке ВМ.

Важное напоминание про ip-адрес.

Если же ваша ВМ была остановлена из-за того, что биллинг аккаунт был заблокирован за неуплату, то никто за вас не сделает ip статическими и они слетят.

Вывод: если вам важно, чтобы ip не менялся (например, на него указывает A запись DNS) сделайте его статическим.

Просто все пересоздадим

Отличный подход к облачным ресурсам. Если у вас stateless VM, то пересоздать ее и накатить все заново может быть быстрее, чем восстанавливать. Для этого все операции по-хорошему должны быть автоматизированы. Если вы еще не пробовали заниматься автоматизацией, то советую посмотреть вам в сторону инструмента HashiCorp Terraform. Yandex.Cloud поддерживает провайдер для него.

Вы можете декларативно описать необходимые ресурсы в облаке, запустить пару команд и Terraform приведет все к требуемому состоянию.

Вот мой пост как при помощи Terraform создать одну ВМ на Ubuntu и установить туда необходимое ПО. Официальную документацию вы можете найти здесь.

Вход через серийную консоль

Этим способом вы сможете воспользоваться, если настроили вход по паролю для своего пользователя на ВМ. В моём примере про разворачивание ВМ Terraform’ом эта настройка производится. Но вот если вы создавали ВМ через веб-консоль и не задавали пароль, то вам этот способ не подойдёт. В образах из маркетплейса нет пароля по умолчанию.

И так, как же подключиться? Перейдите к вашей ВМ, выберите таб Серийная консоль.

Если вы видите такой экран, то вернитесь на таб Обзор и отредактируйте ВМ, включив доступ к серийной консоли.

Серийная консоль отключена в настройках виртуальной машины.

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

Теперь лишь остается открыть для редактирования файл ~/.ssh/authorized_keys и добавить туда строчку с актуальным публичным ключом.

Если у вас нет нового, то сгенерировать его можно командой.

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

Выполнять ее нужно не на виртуальной машине, а то сгенерированные ключи там и останутся. Ну или не забудьте забрать оттуда приватный ключ.

В принципе всё готово. Можно отключаться от серийной консоли и подключаться по SSH, как обычно, используя новый приватный ключ.

Сделаем снепшот и пересоздадим ВМ

Этот способ подойдет вам, если у вас не настроен пароль, но и ничего сильно не разломано в системе. Cloud-init на первом запуске берет пользователя и ключ из сервиса метаданных, доступного изнутри виртуальной машины по ip-адресу 169.254.169.254 и прописывает их в сиcтеме. Поэтому нам нужно сделать так, чтобы cloud-init сделал это снова. Как? Нужно чтобы поменялся instance id. То есть нам нужно пересоздать инстанс. А чтобы не потерять данные, пересоздавать мы его будем не из чистого образа, а из снепшота диска текущей ВМ.

Кликнуть в три точки и «Создать снимок».

Можно задать ему название

Отлично, теперь нам нужно создать новую ВМ, указав, что диск для нее стоит создавать из нашего снепшота.

Переходим на вкладку Пользовательские. А в попапе на вкладку Снимок.

Внизу формы создания ВМ указываем новый ключ. Готово. Можно логиниться и проверять, что все работает.

Монтируем диск к вспомогательной ВМ

Тут я надеюсь вы помните какие действия привели к тому, что вход по SSH перестал работать. Потому что именно это вам и предстоит чинить(откатывать настройки фаервола, исправлять конфиг sshdну и так далее). В этой инструкции я лишь расскажу как примонтировать нужный диск.

Если у вас включена настройка у диска «Удалять вместе с ВМ», то просто так этот диск нам не получить. Нужно как в предыдущем параграфе подготовить снимок диска, а уже потом создавая ВМ выбрать его в качестве источника для создания дополнительного диска.

Теперь заходим на машину по ssh.

sudo mkdir /media/second
sudo mount /dev/vdb2 /media/second
cd /media/second

Отлично, мы примонтировали наш второй диск и можем выполнять на нем все необходимые манипуляции.

По окончании работ можно либо сделать с него снепшот и создать ВМ с загрузочным диском из этого снепшота, либо сразу использовать этот диск в качестве загрузочного, отсоединив его от вспомогательной ВМ.

Выбрать уже существующий диск можно на вкладке Пользовательские. В попапе на вкладке Диски.