Сервер SSH прекращает работать после перезагрузки, вызванной путем пропавших без вести/var/run/sshd

Мой VPS не был перезагружен в течение приблизительно 3 месяцев. Это размещается на сервере с типом виртуализации OpenVZ, и операционной системой является Ubuntu 16.04. По некоторым причинам я перезагрузил VPS и после этого, я не мог соединиться с сервером через ssh, сообщение, что я получил:

ssh: connect to host srvname.com port 22: Connection refused

Таким образом, я открыл Serial Console на VPS, и начните заниматься расследованиями... Я произвел чистку и переустановил openssh-server без успеха. Я провел два часа, читая статьи, вопрос и ответы о подобных проблемах в Интернете.

Наконец мне удалось понять что каталог /var/run/sshd не создается во время системного запуска. И после того как я создаю его вручную, я могу запустить сервис SSH без любой проблемы, но на следующей перезагрузке остается проблема. Таким образом, мои вопросы:

  • Какова могла быть причина этой проблемы? Почему /var/run/sshd не создается во время системного запуска?

  • Как я могу решить проблему надлежащим способом? Я нашел временное решение, которое упоминается в конце этого сообщения.

  • Проблема могла быть связана с хостом OpenVZ VPS? Я должен попросить, чтобы поставщик услуг хостинга решил его?


Вывод systemctl status ssh.service, sshd -Ddp 22 и journalctl -xe :

# systemctl status ssh.service
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since вт 2019-01-15 12:58:08 EET; 22s ago
  Process: 407 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=255)

яну 15 12:58:07 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 12:58:08 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 12:58:08 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.


# $(which sshd) -Ddp 22
debug1: sshd version OpenSSH_7.2, OpenSSL 1.0.2g  1 Mar 2016
debug1: private host key #0: ssh-rsa SHA256:...
debug1: private host key #1: ssh-dss SHA256:...
debug1: private host key #2: ecdsa-sha2-nistp256 SHA256:...
debug1: private host key #3: ssh-ed25519 SHA256:...
Missing privilege separation directory: /var/run/sshd


# journalctl -xe
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:21 srvname sshd[1688]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:21 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:21 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: Starting OpenBSD Secure Shell server...
-- Subject: Unit ssh.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:22 srvname sshd[1691]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:22 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.

Содержание /usr/lib/tmpfiles.d/sshd.conf и /etc/init/ssh.conf :

# cat /usr/lib/tmpfiles.d/sshd.conf 
d /var/run/sshd 0755 root root

# cat /etc/init/ssh.conf | sed '/^#/ d'

description "OpenSSH server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

env SSH_SIGSTOP=1
expect stop

console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

exec /usr/sbin/sshd -D

Дополнительная информация о системе:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:    16.04
Codename:   xenial

# uname -a
Linux srvname 2.6.32-042stab127.2 #1 SMP Thu Jan 4 16:41:44 MSK 2018 x86_64 x86_64 x86_64 GNU/Linux

# apt show openssh-server | grep 'Version'
Version: 1:7.2p2-4ubuntu2.6

Временное решение: Я нашел это /var/run символьная ссылка на /run, Я не знаю, почему это необходимо, но когда я изменил содержание файла /usr/lib/tmpfiles.d/sshd.conf от:

d /var/run/sshd 0755 root root

кому:

d /run/sshd 0755 root root

все подходит на системном запуске, сервис SSH обычно запускается, и я могу войти в систему через SSH.

29
задан 30 July 2019 в 12:39

4 ответа

Я обнаружил, что это ошибка текущей версии systemd и старых ядер, которые используются некоторыми привилегиями VPS, как и в моем случае. Эта ошибка время от времени появляется, как мы можем видеть на Launchpad: Ошибка # 45234 , Ошибка # 1811580 ; или на ServerFault: Почему мне не хватает / var / run / sshd после каждой загрузки?

Есть несколько способов решения этой проблемы, все они объединены в альтернативный способ создания / var / run / sshd перед запуском SSH-сервера. Вот три возможных решения.


Обходной путь 1: Измените /usr/lib/tmpfiles.d/sshd.conf следующим образом:

d /run/sshd 0755 root root

Как упоминается в вопросе, / var / run - это символическая ссылка на / run , окончательный результат идентичен: создается / var / run / sshd . Я не знаю почему, но это работает.


Обходной путь 2: Используйте задание Cron, которое создаст / var / run / sshd и перезапустит SSH-сервер, вы можете использовать root. ] crontab для этой цели - выполните sudo crontab -e и добавьте следующую запись:

@reboot mkdir -p -m0755 /var/run/sshd && systemctl restart ssh.service

В настоящее время я использую это решение, поэтому оно также протестировано.


Решение 3: Используйте /etc/rc.local , чтобы сделать то же, что и выше, как это показано в этом комментарии к отчету об ошибке №45234.

30
ответ дан 23 November 2019 в 01:29

Не могли бы вы проверить, не изменены ли ваши разрешения / (корневая файловая система)? Должен быть root: root , как в двух строках ниже:

drwxr-xr-x  25 root root      4096 дек 21 06:45 ..
drwxr-xr-x  25 root root      4096 дек 21 06:45 .

Если владельцем является другой пользователь (а не root), это предотвратит создание всех временных файлов системой systemd во время запуска системы. Вы также можете проверить с помощью команды:

systemd-tmpfiles --create

Если корневая папка ( / ) имеет другое разрешение, измените его с помощью следующей команды:

chown root: /
5
ответ дан 23 November 2019 в 01:29

Спасибо всем за полезную информацию. Проблема с ssh-сервером на моем Xenial Lubuntu действительно была связана с владением '/', как было предложено Мелебиусом и Стефаном.
Вручную создать / var / run / sshd и временно перезапустить ssh.service ssh-server временно. Редактирование sshd.conf не помогло в этой системе. Затем, следуя последнему предложению, я проверил право собственности на корневую папку с помощью:

' ls -alF / ' и, конечно же, он был случайно изменен на локального пользователя / группы. Выдача с терминала: « sudo chown root: root / » исправила мою систему, независимо от изменения в sshd.conf . Поэтому я восстановил его до исходного состояния, то есть d / var / run / sshd 0755 root root .

2
ответ дан 23 November 2019 в 01:29

У меня есть эта проблема возникает на моей машине, когда я запускаю несколько экземпляров sshd на одной машине (18.04.02 LTS, OpenSSH 7.6p1).

Проблема в том, что в sshd (т. Е. В командной строке или в файле sshd_config ) нет переключателей, предназначенных для изменения местоположения «каталога разделения привилегий». Согласно исходному коду OpenSSH 7.6p1 каталог должен находиться в / var / empty .

Пакет Ubuntu переназначил это на / run / sshd .

В сценариях init.d при загрузке возникает проблема «безопасности потоков», когда оба сценария службы пытаются создать каталог. Я попросил Ubuntu и OpenSSH решить проблему жестко запрограммированных имен путей «каталога разделения привилегий» в sshd. Если бы я мог загружать файлы, у меня было бы исправление на основе исходного кода OpenSSH 8.0p1.

0
ответ дан 23 November 2019 в 01:29

Другие вопросы по тегам:

Похожие вопросы: