Вопрос или проблема
Я недавно настроил сервер Ubuntu на старом Dell Optiplex. Я могу подключиться удаленно через ssh, находясь в одной сети. Однако, когда я пытаюсь подключиться по ssh из другой сети, используя публичный IP, я получаю следующую ошибку:
kex_exchange_identification: Connection closed by remote host
Я искал эту ошибку на этом форуме, а также на многих других, и попробовал множество способов ее исправить, но ничего не сработало. Я перенаправил порт на статический IP сервера, разрешил OpenSSH и открыл порт 22 на своем сервере через UFW, и я настроил VPN, который соединяет мой компьютер с моей сетью. Ничто из этого пока не сработало.
Что я делаю не так? Если у кого-то есть другие идеи, которые я мог бы попробовать, или что-то, что мне стоит проверить вчетверо, было бы замечательно. Большое спасибо.
Я столкнулся с аналогичной ситуацией с маленьким компьютером, который у меня стоит на столе. Что я сделал для отладки проблемы, так это запустил sshd -t, который запускает демон sshd в режиме отладки. Эта команда сообщила, что права на мои ключи были неверными. Все, что мне нужно было сделать, это зайти в папку, где хранятся ключи, и выполнить chmod 0600 <your_ssh_keys>. Возможно, ваше действие также сгенерировало вещи с неправильными правами.
Извините, что мне приходится отправлять ответ, потому что я пока не могу комментировать, так как у меня недостаточно репутации.
Похоже, нам нужно сделать немного больше отладки, чтобы правильно ответить на этот вопрос, но вы упоминаете UFW, поэтому я задумываюсь, не неправильно ли это сконфигурировано.
Также есть вероятность, что ваши конфигурации /etc/hosts.allow
и /etc/hosts.deny
неправильно настроены.
Кроме того, вы используете аутентификацию по паролю или аутентификацию с помощью публичного ключа? Я спрашиваю об этом, потому что даже если вы используете аутентификацию по паролю, клиент ssh все равно будет отправлять ваши ключи host-id во время фазы подключения, что сервер ssh может считать ошибкой аутентификации (в некоторых конфигурациях), и это означает, что вы не дойдете до того момента, когда вам нужно ввести пароль. Это можно исправить, используя следующее:
ssh -o PubkeyAuthentication=No -o PreferredAuthentications=Password <username>@<your server IP>
Если вы можете предоставить вывод от:
UFW с:
sudo ufw status
Проверьте записи в ваших файлах /etc/hosts.*
.
Также предоставьте отладочный вывод при попытке аутентификации, добавив флаг -v
, например:
ssh -v -i <ssh_privkey> <username>@<your server IP>
Надеюсь, мы сможем разобраться с этой проблемой.
Ответ или решение
Решение проблемы "kex_exchange_identification: Connection closed by remote host"
Когда вы сталкиваетесь с ошибкой kex_exchange_identification: Connection closed by remote host
при попытке подключиться к Ubuntu серверу через SSH, находясь за пределами своей локальной сети, необходимо обратить внимание на несколько ключевых аспектов настройки вашего сервера и сетевого окружения. Давайте разобьем вашу ситуацию на логические шаги и предложим решения.
1. Подтверждение сетевых настроек
Первый шаг — убедиться, что ваш сервер доступен извне. Для этого выполните следующие проверки:
-
Проверка портов: Убедитесь, что порт 22, используемый для SSH, действительно открыт на вашем сервере. Вы уже упомянули, что вы настроили переадресацию портов. Проверьте настройки вашего роутера и убедитесь, что они корректны. Попробуйте использовать команды
nmap
илиtelnet
из удаленной сети для проверки доступности порта:nmap -p 22 <ваш_публичный_IP>
или
telnet <ваш_публичный_IP> 22
-
Настройка UFW: Проверьте правила файервола UFW:
sudo ufw status
Убедитесь, что SSH доступен. Например, вы можете разрешить SSH через UFW командой:
sudo ufw allow 22/tcp
2. Анализ конфигурации SSH
Конфигурационные файлы
Проверьте файлы /etc/hosts.allow
и /etc/hosts.deny
, чтобы убедиться, что нет правил, блокирующих доступ к вашему серверу.
Пример конфигурации:
# /etc/hosts.allow
sshd: ALL
# /etc/hosts.deny
sshd: ALL
Вы можете разрешить доступ всем, либо настроить его более ограниченно, в зависимости от ваших требований по безопасности.
Алгоритмы аутентификации
Проанализируйте, какой метод аутентификации вы используете: пароль или публичный ключ. Попробуйте следующую команду для временного отключения аутентификации по ключу:
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password <username>@<ваш сервер IP>
3. Использование диагностических команд
Запустите SSH-сервер в режиме отладки, чтобы выявить возможные ошибки или проблемы с конфигурацией:
sudo sshd -t
Если будут указаны проблемы с правами доступа ключей, отрегулируйте права следующим образом:
chmod 0600 <ваши_SSH_ключи>
Также попробуйте подключиться с дополнительными параметрами для получения отладочной информации:
ssh -v -i <ssh_privkey> <username>@<ваш сервер IP>
Эта команда поможет выявить на каком этапе происходит сбой при установлении соединения.
Заключение
Ошибка kex_exchange_identification: Connection closed by remote host
может иметь множество причин. Проведение диагностики с помощью указанных шагов и команд поможет вам локализовать проблему. Подключение работает в локальной сети, следовательно, выявление частной сетевой конфигурации и возможных проблем с маршрутизацией или правилами файервола за пределами локальной сети является ключевым.
Не стесняйтесь делиться результатами команд и выводами, если потребуется дополнительная помощь. Надеюсь, эти рекомендации помогут вам успешно подключиться к вашему Ubuntu серверу.