При работе с SSH-соединениями нередко возникают разного рода ошибки. Это могут быть неполадки с соединением, авторизацией и т. д. Но есть также категория ошибок работы SSH, которые возникают на уровне протокола. Зачастую они имеют место быть при неумелом обращении, собственно, с самим протоколом SSH, например неправильное использование ключей шифрования. Но также могут быть и реальные неполадки, связанные с некорректной конфигурацией сервера или клиента SSH, что отражается на работе, в частности, протокола. Именно о таких неполадках, а также способах их выявления и устранения пойдёт речь в данной статье.
Какие бывают ошибки протокола SSH?
Когда SSH-клиенты получают ошибки сброса соединений, неполадки с шифрованием, а также наблюдаются проблемы, связанные с «неизвестным» или «изменённым» хостом, то это, как правило, ошибки работы протокола SSH. Подобного рода неполадки часто возникают на этапе согласования зашифрованного соединения протоколом SSH посредством создания доверия между сервером и клиентом.
Невозможность проверки ключа хоста
При создании SSH-соединения протокол требует, чтобы стороны идентифицировали себя. Бывает так, что от сервера поступает следующая ошибка:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:doBAKL304WyMd8hnFc9a29r3nX9okS9BlrBJcHtuyNk. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:14 ECDSA host key for 212.45.27.201 has changed and you have requested strict checking. Host key verification failed.
Эта ошибка может возникать по нескольким причинам:
- переустановка SSH-сервера и неполная его конфигурация;
- восстановление сервера из резервной копии;
- изменение IP-адреса сервера.
Очистка ключей хостов помогает решить эту проблему. Сами эти ключи хранятся на стороне клиента в файле ~/.ssh/known_hosts
. Для очистки можно удалить все записи вручную. Либо можно использовать команду:
$ ssh-keygen -R host_ip
Эта команда попытается очистить соответствующую информацию о ключе хоста в файле known_hosts:
Host 123.123.123.123 found: line 14 /home/john/.ssh/known_hosts updated. Original contents retained as /home/john/.ssh/known_hosts.old
После этих действий можно попробовать снова выполнить подключение к серверу SSH.
Закрытие или сброс соединения
Бывает так, что соединение с SSH-сервером устанавливается, однако на этапе проверки ключей сбрасывается. Эта ошибка выглядит следующим образом:
Connection closed by 123.123.123.123 port 22
Часто такая ошибка возникает по нескольким причинам:
- программный сбой работы SSH-сервера или он не запущен;
- невозможность инициализировать соединение из-за отсутствия или недоступности ключей.
В данном случае необходимо проверить корректность заданной конфигурации сервера, проверить, запущен ли сам сервис. Если же с сервисом всё в порядке, то необходимо удостовериться, что SSH-ключи доступны для использования сервером. Если они отсутствуют, то необходимо их сгенерировать.
В данном случае необходимо проверить, есть ли в каталоге /etc/ssh
набор файлов с именами sshd_host_*_key. Один из них должен иметь расширение *.pub.
В случае, если таких файлов нет, их нужно сгенерировать:
$ ssh-keygen -A ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
Теперь можно снова попытаться подключиться к серверу.
Ошибка взаимодействия с хостом
Для работы протокола SSH на этапе его инициализации генерируется общий закрытый ключ. Он создаётся на основе шифрования, которое согласуется при создании подключения между сервером и клиентом. Иногда на этом этапе возникают несоответствия и на стороне клиента это приводит к следующей ошибке:
Unable to negotiate with 123.123.123.123: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
Эта ошибка говорит о том, что сервер и клиент друг друга «не понимают». Это может быть вызвано следующими причинами:
- список шифрования сервера был изменён или сервер его не поддерживает;
- различные реализации (версии) протокола SSH на сервере и у клиента.
Как можно видеть, для устранения этой ошибки необходимо привести в соответствие версию клиента SSH, а также настроить шифрование для него. Если сервер использует устаревший метод шифрования, например SHA1, а у клиента по-умолчанию задействованы более совершенные методы, то это также будет вызывать ошибки протокола SSH. Для начала необходимо выяснить, действительно ли у сервера и клиента используются разные методы шифрования.
Для клиента использование методов шифрования можно настроить, используя опцию KexAlgorithms:
$ openssh -o KexAlgorithms=+diffie-hellman-group1-sha1 root@your_server_ip
Эта проблема не такая распространённая, поскольку возникает, когда версия реализации SSH-клиента более новая, чем используемая на сервере.
Заключение
В заключение нужно отметить, что рассмотренные неполадки и способы их устранения являются самыми распространёнными. Если для конкретного случая вышеописанное не помогает устранить проблему в работе SSH, то возможно, неполадка связана не с протоколом, а с другой областью, например с неполадками установления подключения по SSH.