Вопрос или проблема
Я пытаюсь настроить SSH-сервер на своем сервере Windows2k8. Я использовал инструкции, найденные здесь. Вот подробный вывод:
steves-air:~ steve$ ssh [email protected] -v
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Connecting to mydomain.ca port 22.
debug1: Connection established.
debug1: identity file /Users/steve/.ssh/id_rsa type -1
debug1: identity file /Users/steve/.ssh/id_rsa-cert type -1
debug1: identity file /Users/steve/.ssh/id_dsa type -1
debug1: identity file /Users/steve/.ssh/id_dsa-cert type -1
debug1: identity file /Users/steve/.ssh/id_ecdsa type -1
debug1: identity file /Users/steve/.ssh/id_ecdsa-cert type -1
debug1: identity file /Users/steve/.ssh/id_ed25519 type -1
debug1: identity file /Users/steve/.ssh/id_ed25519-cert type -1
debug1: identity file /Users/steve/.ssh/id_xmss type -1
debug1: identity file /Users/steve/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9
ssh_exchange_identification: read: Connection reset by peer
На данный момент я могу установить сетевое подключение, что указывает на то, что это не проблема с файрволом. В качестве теста я также попытался запустить sshd под cygwin. Мне удалось получить приглашение терминала с этим. Я бы предпочел использовать OpenSSH, так как хочу, чтобы он работал с powershell.
Я пытался установить уровень логирования на DEBUG, но не получаю никакой другой информации для устранения неполадок оттуда.
Буду благодарен за любую помощь.
*редактировать: Только что осознал, что должен упомянуть. Я пытался поместить файл hosts.allow в директорию %programdata%/ssh. Это не помогло, и я не уверен, относится ли это к данному случаю.
*редактировать2: Я попытался запустить sshd в интерактивном режиме в соответствии с шагами устранения неполадок из этого источника. Windows выдал crash приложения, когда я пытался подключиться. Вот вывод перед крашем:
PS C:\Program Files\OpenSSH> .\sshd.exe -d
debug1: sshd version OpenSSH_for_Windows_7.9, LibreSSL 2.6.5
debug1: private host key #0: ssh-rsa SHA256:XXX
debug1: private host key #1: ecdsa-sha2-nistp256 SHA256:XXX
debug1: private host key #2: ssh-ed25519 SHA256:XXX
debug1: rexec_argv[0]='C:\\Program Files\\OpenSSH\\sshd.exe'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on ::.
Server listening on :: port 22.
debug1: Bind to port 22 on 0.0.0.0.
Server listening on 0.0.0.0 port 22.
debug1: Server will not fork when running in debugging mode.
Connection from 192.168.1.39 port 51410 on 192.168.1.3 port 22
debug1: Client protocol version 2.0; client software version
OpenSSH_7.9
debug1: match: OpenSSH_7.9 pat OpenSSH* compat 0x04000000
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_7.9
debug1: monitor_read_log: child log fd closed
debug1: do_cleanup
debug1: Killing privsep child 10684
Похоже, ответ заключается в том, что “отсюда туда не добраться”. Я нашел закрытый вопрос на git, который говорит, что w2k8 standard не поддерживается. Я попробовал установить на другой сервер с 2k8R2, и это сработало легко.
Если ничего не помогает, проверьте это.
Мне удалось найти коренную причину с помощью systemctl status sshd
.
В моем /etc/hosts.deny
не было новой строки в конце.
➜ ~ cat /etc/hosts.deny
# /etc/hosts.deny: список хостов, которым _не_ разрешено подключаться к системе.
# См. страницы руководства hosts_access(5) и hosts_options(5).
#
# Пример: ALL: some.host.name, .some.domain
# ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# Если вы собираетесь защищать портмапер, используйте имя "rpcbind" для
# имени демона. См. rpcbind(8) и rpc.mountd(8) для дополнительной информации.
#
# Подстановочный знак PARANOID соответствует любому хосту, имя которого не совпадает с его
# адресом.
#
# Вы можете захотеть включить это, чтобы убедиться, что любые программы, которые не
# верифицируют смотренные имена хостов, все же оставляют понятные логи. В прошлых
# версиях Debian это было значение по умолчанию.
# ALL: PARANOID% ➜ ~
➜ ~ ssh localhost
ssh_exchange_identification: read: Connection reset by peer
➜ ~
➜ ~ sudo systemctl status sshd
● ssh.service - OpenBSD Secure Shell сервер
Loaded: загружено (/lib/systemd/system/ssh.service; включено; предустановка вендора: включено)
Active: активно (работает) с Пн 2019-10-14 16:45:43 IST; 20с назад
Process: 11488 ExecStartPre=/usr/sbin/sshd -t (код=вышел, статус=0/УСПЕХ)
Main PID: 11494 (sshd)
Tasks: 1 (лимит: 4915)
CGroup: /system.slice/ssh.service
└─11494 /usr/sbin/sshd -D
Oct 14 16:45:43 mani-8681 systemd[1]: Запуск OpenBSD Secure Shell сервера...
Oct 14 16:45:43 mani-8681 sshd[11494]: Сервер слушает на порту 0.0.0.0 22.
Oct 14 16:45:43 mani-8681 sshd[11494]: Сервер слушает на порте :: 22.
Oct 14 16:45:43 mani-8681 systemd[1]: Запуск OpenBSD Secure Shell сервера завершен.
Oct 14 16:45:54 mani-8681 sshd[11555]: предупреждение: /etc/hosts.deny, строчка 15: отсутствует новая строка или строка слишком длинная
Oct 14 16:45:54 mani-8681 sshd[11555]: предупреждение: /etc/hosts.deny, строчка 15: все последующие правила будут проигнорированы
Oct 14 16:45:54 mani-8681 sshd[11555]: отключено подключение с 127.0.0.1 (127.0.0.1)
Добавление новой строки в конце решило проблему.
➜ ~ cat /etc/hosts.deny
# /etc/hosts.deny: список хостов, которым _не_ разрешено подключаться к системе.
# См. страницы руководства hosts_access(5) и hosts_options(5).
#
# Пример: ALL: some.host.name, .some.domain
# ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
# Если вы собираетесь защищать портмапер, используйте имя "rpcbind" для
# имени демона. См. rpcbind(8) и rpc.mountd(8) для дополнительной информации.
#
# Подстановочный знак PARANOID соответствует любому хосту, имя которого не совпадает с его
# адресом.
#
# Вы можете захотеть включить это, чтобы убедиться, что любые программы, которые не
# верифицируют смотренные имена хостов, все же оставляют понятные логи. В прошлых
# версиях Debian это было значение по умолчанию.
# ALL: PARANOID
➜ ~ ssh localhost date
Password:
Mon Oct 14 16:51:56 IST 2019
КСТАТИ, вы могли бы попробовать порт OpenSSH для Cygwin. Если вы просто хотите проверить, работает ли он, вы можете попробовать это:
https://github.com/Bill-Stewart/CygSSH
Требуется Windows PowerShell v2 на Vista/Server 2008, так что вам нужно будет сначала это установить (надеюсь, у вас это уже есть).
Ответ или решение
Ошибка "ssh_exchange_identification: read: Connection reset by peer" при попытке подключения к OpenSSH на Windows Server 2008 представляет собой одну из типичных проблем, связанных с настройкой SSH-сервера. Рассмотрим данную проблему более подробно и предоставим рекомендации по её решению.
Теория
Ошибка "ssh_exchange_identification: read: Connection reset by peer" свидетельствует о том, что соединение было установлено, но уже на этапе обмена данными оно было сброшено сервером. Обычно такая ошибка указывает на проблемы конфигурации на стороне сервера или клиента, либо же на несовместимость версий программного обеспечения.
Пример
В рассматриваемом случае используется Windows Server 2008, на котором настроен OpenSSH. Однако, по информации из открытых issues на GitHub, Windows Server 2008 Standard не поддерживается для использования с Win32-OpenSSH. Это может быть основной причиной ошибки. Тем не менее, подключение через Cygwin SSH работает, что указывает на ограничение, связанное именно с OpenSSH для Windows.
Также упоминалось тестирование с cygwin, в ходе которого терминал успешно открывается. В этом случае это может свидетельствовать о проблемах либо с версией OpenSSH, установленной на Windows, либо же с конфигурацией, специфичной для OpenSSH в Windows среде.
Применение
-
Проверка Совместимости: Убедитесь, что версия Windows совместима с используемой версией OpenSSH. Если используется Windows 2008 Standard, рассмотрите возможность обновления до Windows 2008 R2 или более поздней версии, если это возможно.
-
Проверка Конфигурации: Убедитесь, что конфигурационные файлы OpenSSH корректны. Обратите внимание на файлы
hosts.allow
иhosts.deny
, особенно если они содержат синтаксические ошибки, такие как отсутствующий символ новой строки в конце файла. Эти файлы часто упускают из виду, но они могут существенно влиять на поведение демона SSH. -
Использование Альтернативных Решений: Если OpenSSH для Windows не может быть успешно настроен, рассмотрите возможность использования Cygwin или его аналогов, таких как CygSSH, который предлагает порты OpenSSH, совместимые со старыми версиями Windows.
-
Логирование и Отладка: Если сервер SSH падает при попытке подключения, запустите
sshd
в интерактивном режиме с опцией-d
для увеличения уровня логирования. Это может дать больше информации о произошедшей ошибке до сброса подключения. -
Обновление До Поддерживаемых Версий ПО: Если дальнейшая отладка не приводит к успеху, это может потребовать обновления вашего сервера или использования более современной среды для удовлетворения ваших требований к SSH доступу.
Таким образом, основное внимание следует уделять совместимости программного обеспечения и корректной конфигурации. Это, вместе с возможными альтернативными решениями, может помочь разрешить проблему и обеспечить желаемую функциональность.