kex_exchange_identification: Connection closed by remote host
Обрыв на этапе обмена версиями означает, что соединение закрылось до любой проверки подлинности. Причина не в ключах и не в пароле: закрывает соединение либо сам сервер по правилам доступа и пределам, либо посредник между клиентом и сервером.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Сервер закрыл соединение по правилам доступа
Списки разрешённых адресов на уровне библиотеки доступа отклоняют клиента до проверки подлинности.
-
Исчерпан предел одновременных подключений
При пределе неавторизованных соединений сервер закрывает лишние сразу. Под перебором это происходит и с законными клиентами.
-
Соединение закрывает посредник
Балансировщик, брандмауэр с проверкой содержимого или прокси могут закрывать соединение раньше сервера.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Видит ли сервер попытки подключения.
sudo journalctl -u ssh -u sshd -n 30 --no-pager 2>/dev/nullДействующие пределы и правила доступа.
sudo sshd -T 2>/dev/null | grep -iE "maxstartups|permitrootlogin|allowusers"Подробный вывод клиента: на каком шаге обрыв.
ssh -vv пользователь@сервер 2>&1 | head -20Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Списки разрешённых адресов на уровне библиотеки доступа отклоняют клиента до проверки подлинности.
- Как проверить
-
Посмотрите правила доступа и записи сервера.
sudo grep -vE "^#|^$" /etc/hosts.allow /etc/hosts.deny 2>/dev/null | head sudo journalctl -u ssh -u sshd -n 20 --no-pager 2>/dev/null | grep -iE "refused|denied"
- Как исправить
- Добавьте нужный адрес в список разрешённых. Правила этого уровня работают до всего остального и потому дают такой ранний обрыв.
- Почему происходит
- При пределе неавторизованных соединений сервер закрывает лишние сразу. Под перебором это происходит и с законными клиентами.
- Как проверить
-
Посмотрите предел и число попыток.
sudo sshd -T 2>/dev/null | grep -iE "maxstartups|maxsessions" sudo journalctl -u ssh -u sshd --since "10 min ago" --no-pager 2>/dev/null | grep -c "Connection closed"
- Как исправить
- Поднимите предел и включите блокировку по числу неудачных попыток. Под перебором обычный предел закрывает доступ всем.
- Почему происходит
- Балансировщик, брандмауэр с проверкой содержимого или прокси могут закрывать соединение раньше сервера.
- Как проверить
-
Проверьте, доходит ли обращение до сервера.
sudo journalctl -u ssh -u sshd --since "5 min ago" --no-pager 2>/dev/null | tail -5 timeout 5 bash -c "</dev/tcp/сервер/22" && echo порт открыт || echo порт закрыт
- Как исправить
- Если на сервере нет записей о попытке, разбирайтесь с посредником: соединение до сервера не доходит.
Пример вывода
Предел неавторизованных соединений исчерпан перебором. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ ssh deploy@server
kex_exchange_identification: Connection closed by remote host
Connection closed by 198.51.100.10 port 22
# на сервере в это же время:
sshd[13100]: error: beginning MaxStartups throttling
sshd[13100]: drop connection #101 from [203.0.113.44]:51422 on [198.51.100.10]:22 past MaxStartups
Связанные ошибки
- sshd: отказ в подключении из-за MaxStartups Часть подключений отклоняется под нагрузкой: предел незавершённых аутентификаций. Как считать значение.
- Connection closed by authenticating user: вход обрывается Клиент отключается на этапе проверки подлинности: не тот ключ, перебор или ограничение по адресу.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Вход по доменной учётной записи не проходит: служба в автономном режиме Доменные пользователи не могут войти: служба не видит каталог и перешла в автономный режим.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
Где встречается чаще всего
Источники
-
sshd_config(5)
MaxStartups и правила доступа. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено исчерпанием предела неавторизованных соединений.