Сервер SSH перестает работать после перезагрузки из-за отсутствия / var / run / sshd

23

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

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

Поэтому я открыл последовательную консоль на 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.

pa4080
источник
Эта проблема может внезапно появиться после перезагрузки из-за обновления версии, которое было сделано непосредственно перед этой перезагрузкой, как описано в этом связанном вопросе . Урок: не обновляйте, если вы не уверены, что ваше ядро ​​может его поддерживать.
снег

Ответы:

24

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

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


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

d /run/sshd 0755 root root

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


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

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

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


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

pa4080
источник
1
Спасибо, это исправляет ssh, но не проблемы с systemd. Попробуйте запустить systemd-tmpfiles --create и увидеть все ошибки
paulzag
1
Вы правы, @paulzag, но в моем случае я уверен, что общая проблема - это старое ядро. Я решил игнорировать эти ошибки, которые systemd-tmpfiles --createпоказывают, потому что на данный момент на сервере нет никаких заметных сбоев. В общем, текущий вопрос о том, как запустить службу SSH после перезагрузки, пока проблема занята. Если хотите, вы можете проголосовать за решение :)
pa4080
«
Обходной путь
2
Было бы правильнее вместо этого переопределить, /usr/lib/tmpfiles.d/sshd.conf а не изменить его напрямую, так как этот файл управляется менеджером пакетов. Для этого просто внесите изменения в /etc/tmpfiles.d/sshd.conf; это будет иметь приоритет над sshd.confдюйма /usr/lib. Смотрите этот раздел в tmpfiles.d (5) . Отличный ответ, несмотря на то, что я был на OpenVZ VPS, это именно та ситуация, с которой я столкнулся.
ZeroKnight
1
Что касается почему Обход 1 работает; Вы избегаете использовать /var/runсимволическую ссылку, systemd-tmpfilesс чем связана проблема, и почему не создается каталог PrivSep. 4-е последнее сообщение этой темы проливает некоторый свет на это. Конечно, это касается systemd-tmpfiles-clean, но я чувствую, что то же самое применимо и здесь.
ZeroKnight
2

Не могли бы вы проверить, /не изменились ли ваши (корневая файловая система) разрешения? Должно быть 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: /
Стефан
источник
1

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

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

Майкл
источник
0

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

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

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

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

Люк Перкинс
источник