Я не могу зайти по ssh на виртуалку в Yandex.Cloud
Давайте сначала разберемся на сколько все плохо.
Инструкция как подключиться по 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
Отлично, мы примонтировали наш второй диск и можем выполнять на нем все необходимые манипуляции.
По окончании работ можно либо сделать с него снепшот и создать ВМ с загрузочным диском из этого снепшота, либо сразу использовать этот диск в качестве загрузочного, отсоединив его от вспомогательной ВМ.
Выбрать уже существующий диск можно на вкладке Пользовательские. В попапе на вкладке Диски.