Остановка службы удаляет интерфейс даже при установленном persist-tun. Это опция, работающая как задокументировано, а не сбой. Опция описывает один путь перезапуска внутри работающего процесса, и systemctl stop не является этим путём.

Прочитайте оба имени вместе, и замысел становится ясным. Одно удерживает дескриптор, другое удерживает материал ключа, и оба существуют из-за того, что происходит после сброса привилегий.

Два ресурса и перезапуск, к которому они относятся

OpenVPN сигнализирует о собственном перезапуске в двух обычных ситуациях. Явный SIGUSR1 делает это, и ping-restart, вызванный мёртвым партнёром, делает то же самое. Оба оставляют процесс живым и заново выполняют настройку соединения, и именно здесь опции оправдывают своё место.

EventTUN/TAP deviceKey and auth filesAddresses and routesup/down hooks
Soft reset, from SIGUSR1 or from a ping-restart the daemon sends itselfsurvives only with persist-tunsurvive only with persist-keysurvive with the device, otherwise rebuiltrun again only when restart hooks are enabled
Configuration reload, SIGHUPrecreatedre-read from diskrebuilt once the device returnsrun again
Service stoplostre-read at the next startremovedrun at the next start

Только строка мягкого перезапуска — это то, что меняют эти две опции, а работа, которую они пропускают, — дорогая часть на загруженном канале. Повторное открытие устройства разрушает привязанные к нему адреса и маршруты, а их перестройка может потерять пакеты, которые были в пути в момент начала перезапуска. Остановка уничтожает те же объекты без какой-либо опции их сохранить.

Почему эти опции вообще существуют

Укреплённый сервер OpenVPN обычно запускается как root, открывает свои ключи и своё устройство, а затем переходит к непривилегированному пользователю. После этого перехода некоторые операции просто исчезают. Чтение файла ключа с режимом 0600, создание сетевого интерфейса или изменение маршрутов могут быть отклонены.

Без опций persist партнёр, который молчит достаточно долго, чтобы вызвать ping-restart, принудил бы именно эти операции. Повторное подключение завершилось бы неудачей, хотя в конфигурации ничего не изменилось. Процесс выглядел бы так, будто умирает без причины, а журнал показал бы ошибку прав вместо сетевой ошибки.

С ними мягкий перезапуск повторно использует то, что привилегированная фаза уже получила. Никакой магии здесь нет, и процесс ничего не переживает. Получение ресурсов просто откладывается.

Читайте первую ошибку, а не последнюю

Когда перезапуск не удаётся, читайте первую ошибку, а не последнюю. Защищённый ключ, файл auth, ioctl интерфейса и внешний хук — это четыре разных ресурса. Удержание одного ничего не говорит о доступе к другим. Хук, вызывающий инструмент межсетевого экрана, по-прежнему нуждается в правах, которых требует этот инструмент.

У хуков есть собственный переключатель. Руководство OpenVPN связывает опции persist с up-restart, который решает, будут ли скрипты up и down запущены снова после перезапуска. Поэтому интерфейс, оставшийся поднятым, ничего не говорит вам о том, обновилась ли ваша интеграция с resolver.

# which restart path just happened?
journalctl -u openvpn-client@office --since '10 min ago' | grep -E 'SIGUSR1|ping-restart|Restart pause|NOTE:'

# did the interface survive, and do its routes still exist?
ip -brief link show tun0
ip route show dev tun0

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

Сохранённый интерфейс — не аварийный выключатель

Если требование состоит в том, чтобы трафик никогда не покидал туннель, сохранённое устройство этого не обеспечивает. Маршруты для другого семейства адресов, второй маршрут по умолчанию и случай, когда процесс завершается полностью, остаются вне области действия опции.

Рассматривайте два требования отдельно. Сохранение объекта туннеля между переподключениями — удобство для демона. Блокировка выхода, когда туннель не работает, — это политика межсетевого экрана со своими правилами и своим тестом. Смешивание их даёт конфигурацию, которая выглядит защитной, а ведёт себя как переподключение по мере возможности.

Назовите событие прежде, чем его диагностировать. Мягкий перезапуск, неудачная попытка подключения и остановка службы — это три события с тремя поведениями, и только первое — то, что описывают эти опции.

Похожие статьи