LINUX.ORG.RU
решено ФорумAdmin

Правильно добавить самописный сервис как PartOf для openvpn.service

 ,


0

1

Описал сервис, который силами systemd-nspawn запускает специфическую версию openvpn.

В этом сервисе в блоке Unit добавил

PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
After=network-online.target
Wants=network-online.target

По сути просто стянул с рядом лежащего /lib/systemd/system/openvpn@.service

Ничего более не менял.

Руками самописный сервис запускается, но при # systemctl start openvpn не запускается.

Что я упустил?

Дополнительно из того, что пришло в голову:

  • Мой самописный systemd сервис является шаблоном и запускает %i конфигурацию из той-же директории, что и хостовый openvpn
  • Чтобы хост не пытался запускать эту конфигурацию я в /etc/default/openvpn выставил AUTOSTART="none", позже возможно none поменяю на актуальный список
★★★

Полный код самописного systemd сервиса
Ругайте, но имейте в виду, что я это собрал идя от идеи «вроде запускается, мне надо временно, мне пока хватит»

[Unit]
Description=Starts %i openvpn service using legacy nspawn container
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=systemd-nspawn \
  -D /var/lib/machines/debian/ \
  --kill-signal=SIGTERM \
  --link-journal=try-host \
  --capability=CAP_NET_ADMIN \
  --bind=/etc/openvpn \
  --bind=/var/log/openvpn \
  --chdir /etc/openvpn \
  openvpn --config /etc/openvpn/%i.conf --suppress-timestamps
KillMode=process
Type=notify
Delegate=yes
TasksMax=16384

[Install]
WantedBy=multi-user.target
Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Потому что костыли совместимости. В нормальных современных дистрах никаких init.d нет и openvpn.service не содержит всякую костыльную ерунду.

[Unit]
Description=OpenVPN tunnel for %I
After=network-online.target
Wants=network-online.target
Documentation=man:openvpn(8)
Documentation=https://openvpn.net/community-resources/reference-manual-for-openvpn-2-6/
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO

[Service]
Type=notify
PrivateTmp=true
WorkingDirectory=/etc/openvpn/client
ExecStart=/usr/bin/openvpn --suppress-timestamps --nobind --config %i.conf
User=openvpn
Group=network
AmbientCapabilities=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SETPCAP CAP_SYS_CHROOT CAP_DAC_OVERRIDE
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SETPCAP CAP_SYS_CHROOT CAP_DAC_OVERRIDE
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
ProtectSystem=true
ProtectHome=true
KillMode=process

[Install]
WantedBy=multi-user.target
ALiEN175
()
Ответ на: комментарий от ALiEN175

Вы привели содержимое /lib/systemd/system/openvpn@.service такой у меня тоже есть.

Но есть и глобальный /lib/systemd/system/openvpn.service, который отвечает за запуск всех openvpn@имя_конфига и за централизованное выключение. Пойдите, да посмотрите на его содержимое

Я всего лишь хочу чтобы он также пинал и мой самописный сервис т.к. самописный тоже является своего рода ovpn сервисом

Flotsky ★★★
() автор топика
Ответ на: комментарий от ALiEN175

хм, тогда добавлю контекста

# cat /lib/systemd/system/openvpn.service 
# This service is actually a systemd target,
# but we are using a service since targets cannot be reloaded.

[Unit]
Description=OpenVPN service
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/true
WorkingDirectory=/etc/openvpn

[Install]
WantedBy=multi-user.target

Да, сервис затычка, но каким местом оно вызывает init.d скрипт мне не понятно.

И

# cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"

# dpkg -l | grep openvpn
ii  openvpn                        2.6.3-1+deb12u3                amd64        virtual private network daemon
# dpkg -L openvpn | grep service
/lib/systemd/system/openvpn-client@.service
/lib/systemd/system/openvpn-server@.service
/lib/systemd/system/openvpn.service
/lib/systemd/system/openvpn@.service
Flotsky ★★★
() автор топика
Ответ на: комментарий от ALiEN175

Обновляю сервер с какой-то крайне старой версии debian на 12
Нужное шифрование в новой версии не поддерживается и есть много клиентов, которые нельзя просто перенастроить вот прям сейчас.

Поэтому сейчас будет упакованный в nspawn старый openvpn для старых клиентов и после обновления постепенно их перенастрою

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Руками самописный сервис запускается, но при # systemctl start openvpn не запускается.

Потому что /lib/systemd/system/openvpn.service - это таргет, а не сервис. Там про это самая верхняя строчка с комментом.

Для того, чтобы ваш самописный скрипт запускался, просто включите юнит, который создали - systemctl enable ваш_юнит --now и проверьте systemctl status ваш_юнит

ALiEN175
()
Последнее исправление: ALiEN175 (всего исправлений: 1)
Ответ на: комментарий от ALiEN175

Для того, чтобы ваш самописный скрипт запускался, просто включите юнит, который создали - systemctl enable ваш_юнит и проверьте systemctl status ваш_юнит

Вот с этим у меня и проблема.

Приведу пример.

У меня есть /etc/openvpn/TCP_srv.conf и /etc/openvpn/UDP_srv.conf И в /etc/default/openvpn написано AUTOSTART="TCP_srv UDP_srv"
Я не делал никаких enabled для сервисов openvpn@TCP_srv и openvpn@UDP_srv
При этом когда я выполняю # systemctl start openvpn оба этих conf запускаются и для stop соотв оба останавливаются.
PS. Это не отменяет возможности точечного запуска/остановки сервисов

Как мне для данного случая заставить # systemctl start openvpn также запускать мой самописный сервис?

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

С этим вроде разобрался. Есть /lib/systemd/system-generators/openvpn-generator который парсит /etc/default/openvpn и создаёт соотв openvpn@ сервисы в /run/systemd/generator/openvpn.service.wants

init.d скрипт судя по всему ни кто не дёргает

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Бинго, в своём самописном сервисе подменил

[Install]
WantedBy=multi-user.target

на

[Install]
WantedBy=openvpn.service

И после enable самописного сервиса работает именно так, как хотел. А именно запуск/остановка openvpn сервиса пинает в том числе и мой самописный.

Flotsky ★★★
() автор топика