Как читать сообщение об ошибке
В начале соединения клиент и сервер SSH обмениваются списками поддерживаемых алгоритмов: обмена ключами, шифрования, проверки целостности и подписи хоста. Затем каждая сторона выбирает первый подходящий вариант из общего набора. Если пересечения нет, соединение обрывается с сообщением «Unable to negotiate with … no matching key exchange method found» и строкой «Their offer», в которой перечислено, что предлагает удалённая сторона.
Эта строка и есть главный ключ к диагнозу. Она показывает, какие алгоритмы предлагает сервер, а ваш клиент их не поддерживает или, наоборот, отключил как небезопасные. Ошибка не связана с паролем, ключом пользователя или доступностью порта: до аутентификации дело даже не дошло.
Почему возникает несовпадение
Чаще всего встречаются две ситуации. В первой у вас современный клиент, а сервер или сетевое устройство очень старое: старый маршрутизатор, коммутатор, встроенная система, устаревший дистрибутив. Современные версии OpenSSH со временем отключают слабые алгоритмы, например основанные на группах Диффи-Хеллмана со слабыми параметрами и на SHA-1, и такие устройства перестают быть совместимыми с клиентом по умолчанию.
Во второй ситуации всё наоборот: устаревший клиент, например старая версия программы под Windows, подключается к серверу, который отключил старые алгоритмы ради безопасности и предлагает только современные. Реже причина в самой конфигурации: в настройках клиента или сервера явно заданы директивы KexAlgorithms, ограничившие набор до непересекающегося.
Диагностика: SSH «no matching key exchange method found»
Запустите клиент с ключом -v и найдите в выводе список предложений сервера. Сравните его с тем, что поддерживает ваш клиент: команда ssh -Q kex выведет алгоритмы обмена ключами, известные вашей сборке. Если вы видите пересечение по названиям, но всё равно ошибка, ищите явные ограничения в файле конфигурации клиента и в системных настройках.
Определите, какая сторона отстаёт. Версия клиента видна по ssh -V, версия сервера обычно указана в баннере при подключении. Если сервер очень старый, стоит выяснить, есть ли для него обновление прошивки или пакета: это единственное решение, которое улучшает ситуацию, а не только маскирует её.
Варианты решения
Идеальный путь: обновить устаревшую сторону. Для сервера это обновление пакета OpenSSH или прошивки устройства, для клиента установка свежей версии. Если обновление невозможно, можно временно разрешить конкретный старый алгоритм для конкретного хоста в настройках клиента, добавив запись для этого хоста с директивой KexAlgorithms и знаком плюс перед названием. Знак плюс дописывает алгоритм в список по умолчанию, а не заменяет его.
Так же можно передать параметр -o при однократном подключении. Важно ограничивать разрешение одним устройством, а не включать слабые алгоритмы для всех адресов. И стоит понимать компромисс: старый алгоритм ослабляет защиту именно этого соединения, поэтому для устройств из внешней сети такой подход нежелателен.
Безопасность и профилактика
Ошибка полезна: она сигнализирует, что одна из сторон морально устарела. Если несовместимость касается сервера в интернете, стоит запланировать его обновление, а не годами держать исключения на клиентах.
Для собственных серверов разумно периодически проверять, какие алгоритмы разрешены, и не оставлять только один узкий вариант: иначе любое обновление клиентов может внезапно всех отрезать. Хорошая практика: документировать, какие устройства требуют исключений, и пересматривать список при каждом обновлении сетевого оборудования.
Проверка на практике: небольшой сценарий
Представим типичный случай: вы обновили систему на рабочем компьютере и не можете зайти на старый сетевой коммутатор, хотя вчера всё работало. В сообщении в строке предложений видны только старые алгоритмы на основе SHA-1. Это точный признак того, что клиент теперь отключил их по умолчанию. Разумный порядок: сначала выяснить, нет ли обновления прошивки коммутатора, затем, если его нет, добавить исключение только для этого адреса в файл конфигурации клиента, и записать в заметках, что устройство подлежит замене.
Аналогично разбирается и обратный случай, когда подключение идёт к новому серверу со старой программы. Здесь достаточно обновить программу: разрешать что-либо на сервере не требуется. Не забывайте, что таких исключений накапливается много, и раз в полгода их полезно пересматривать, убирая те, что стали ненужными после обновлений.