Назад | Перейти на главную страницу

Как перезапустить модуль systemd при подключении клиента OpenVPN

Для общих целей было бы неплохо узнать, как обнаруживать сетевые изменения и перезапускать службы, но в моем конкретном случае использования требуется перезапуск sshd после подключения моего клиента OpenVPN. Без обширной перенастройки служб по умолчанию (чего я хочу избежать) кажется, что sshd запускается сразу после основных сетевых служб (что имеет смысл, поскольку файл модуля содержит After=network.target).

Также специфичен для sshd - я не хочу, чтобы он слушал порт 22 на внешнем интерфейсе. Сначала я думал, что могу просто защитить это через свой брандмауэр, но, поскольку я обнаружил, что мой скрипт брандмауэра работает неправильно ... лучше защитить оба способа. И да, я уже нашел тупую ошибку и починил фаервол (для записи - нужно было настроить START_FIREHOL=yes в / etc / default / firehol).

Похоже, что если sshd настроен для прослушивания явного IP-адреса, но этот IP-адрес не активен, прослушиватель не будет запущен и не будет автоматически связываться, когда IP-адрес станет активным. Поскольку, вероятно, лучше позволить sshd запускать любые другие допустимые прослушиватели, когда он может, а не вообще не запускаться, я не хочу «требовать» завершения работы клиента OpenVPN до запуска sshd. Отсюда и мой вызов.

Я нашел настройку «ipchange» в OpenVPN, но мне не удалось заставить ее работать с краткими усилиями, и я бы предпочел иметь более общее решение для будущего использования.

Любая зависимость, которую я пробовал против экземпляра клиента OpenVPN, срабатывает слишком рано - клиентский модуль отображается как «запущенный», даже если он не завершил инициализацию DHCP. Это означает, что IP-адрес еще не активен.

Я не нахожу документации по зависимостям модулей systemd, связанным со статусами сетевых интерфейсов, поэтому прошу поделиться идеями.

Не знаю, лучшее ли это решение, но оно работает.

Systemd автоматически создает блоки сетевых устройств при создании / активации интерфейсов. В моем случае, в качестве первого соединения OpenVPN, задействованным устройством является «sys-devices-virtual-net-tun0.device». Похоже, что это устройство считается "запущенным" при настройке IP.

Я не нашел явной настройки конфигурации «перезапуска» для модулей systemd, поэтому я создал следующую службу:

openvpn-online.service

[Unit]
Description=Restart Network Services on VPN Connection
Conflicts=shutdown.target
Requires=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device
BindsTo=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device
After=openvpn-client@myclient.service sys-devices-virtual-net-tun0.device

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart sshd
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Это кажется ... неэлегантным ... но работает отлично. Теперь sshd запускается раньше, а затем перезапускается после того, как клиент OpenVPN завершит DHCP.

Systemd также позволяет использовать несколько ExecStart= линии для oneshot единиц - так что я могу отрегулировать это при необходимости для других сервисов.