Дружим openssh-server и network manager

Почитатели init в стиле SysV конечно могут бросить в меня своим пенсионным удостоверением и громко побухтеть, но мне нравится Systemd и даже Network Manager.

Даже не смотря на то, что они, казалось бы давным давно пришли в debian-based дистрибутивы и arch; стабильны и удобны, и все еще преподносят не очевидные сюрпризы. Сюрпризы из числа тех фирменных "приятных" мелочей gnu/linux, которыми красноглазики заполняют своё рабочее время.

Сегодня я в очередной раз наткнулся на недоступность машины по ssh и вспомнил, что об этой ситуации лучше написать здесь, дабы просто не забыть.

Итак. Имеем обычную десктопную установку (в этом конкретном случае debian 9) к которой нужно иметь доступ по ssh.

Мы конечно же ставим openssh-server, закидываем открытый ключ и прописываем настройки ssh-сервера в /etc/ssh/sshd_config.

Кроме прочего тюнинга безопасности мы сначала прописываем адрес и порт (например 10.0.1.1:22) и перезагружаем сервис. Всё работает. Но только до перезагрузки.

ssh: connect to host 10.0.1.1 port 22: Connection refused

После перезагрузки sshd начинает работать только если его пнуть через systemctl

Начинаем разбираться и конечно же смотреть в сторону файрвола. Но там всё окей.

Смотрим на состояние

$ systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Thu 2018-01-01 00:00:00; 2min 0s ago
Process: 561 ExecStart=/usr/sbin/sshd -D $SSHD_OPTS (code=exited, status=255)
Process: 530 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 561 (code=exited, status=255)

systemd[1]: Starting OpenBSD Secure Shell server...
sshd[561]: error: Bind to port 22 on 10.0.1.1 failed: Cannot assign requested address.
sshd[561]: fatal: Cannot bind any address.
systemd[1]: ssh.service: Main process exited, code=exited, status=255/n/a
systemd[1]: Failed to start OpenBSD Secure Shell server.
systemd[1]: ssh.service: Unit entered failed state.
systemd[1]: ssh.service: Failed with result 'exit-code'.

 

И заглянув в журнал

$ journalctl -xe

Конечно же убеждаемся, что да, указанный нами ip адрес не может прослушиваться sshd, так как systemd запускает sshd.service до того как network-manager инициализирует интерфейсы и устанавливает для них ip-адреса.

И хотя можно было бы настраивать сеть через /etc/network/interfaces, и даже вообще выкинуть network-manager, со всеми его прелестями (и не очень), но мы тем не менее поступим правильно.

А правильно в нашем случае это подсказать systemd корректный порядок загрузки сервисов. Для этого для systemd, который пытается загрузить всё как можно раньше и как можно более параллельно, мы добавим таргет network-online.target в строчку After= в файле /etc/systemd/system/sshd.service

Получив что-то вроде этого:

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service network-online.target

Теперь sshd будет загружаться уже после того как network-manager поднимет интерфейсы и прочитав свой конфиг (или dhcp) задаст ip-адреса.

Похожие записи:

Дружим openssh-server и network manager: 2 комментария

  1. fycth

    Интересно, почему нельзя эту строчку сразу в шаблоне иметь из коробки

  2. Эрт Автор записи

    Потому что openssh-server и network-manager — разные пакеты и в принципе то не обязаны учитывать наличие других пактов в системе кроме зависимых. Полтора гика которым они нужны работающими вместе молча исправят у себя, а у команд debian или ubuntu как всегда своих забот хватает.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *